2009-02-15 27 views
27

Có thể buộc trình biên dịch C# kéo tất cả các cuộc gọi được tham chiếu ra khỏi khung công tác và đóng gói chúng thành các dll hoặc thậm chí là một tệp thực thi duy nhất không?Bạn có thể biên dịch C# để không cần .NET Framework khi chạy không?

Tôi thích viết nhanh các ứng dụng 'một lần' với C#, tuy nhiên tôi không muốn phải cài đặt toàn bộ khung công tác trên máy đích khi đã sẵn sàng.

Trả lời

37

Bạn đặt câu hỏi đã tải. C# chỉ là một ngôn ngữ và không yêu cầu .NET Framework. Quá trình biên dịch nó đòi hỏi một trình biên dịch, có thể hoặc có thể không tự nó phụ thuộc vào .NET Framework (trình biên dịch C# của Microsoft không - nó được viết bằng mã gốc). Chương trình của bạn sẽ cần phải tham khảo một số hội đồng nơi mà các loại, các lớp học, và các phương pháp có thể được tìm thấy cho bạn sử dụng. Bạn có thể xóa system.dll và mscorlib.dll khỏi danh sách tham chiếu của bạn và tham khảo các hội đồng của riêng bạn. Vì vậy, bạn có thể tránh các phụ thuộc trên .NET Framework nếu bạn thực sự làm việc ở đó. Nhưng cuối cùng, trừ khi bạn có trình biên dịch C# để biên dịch chương trình thành mã gốc, bạn vẫn có một sự phụ thuộc vào CLR.

Đó là một cách rất kỹ thuật để nói ... hầu như không có gì. Nhưng nó trả lời câu hỏi của bạn. Tuy nhiên, thực tế hữu ích hơn là làm thế nào để các chương trình C# của bạn chạy với một số phụ thuộc tối thiểu. mkbundle từ mono sẽ thực sự cho phép bạn biên dịch tất cả thành một .exe với hầu như không có phụ thuộc. Nếu bạn muốn gắn bó với Microsoft .NET Framework, bạn có thể đạt được một dấu chân nhẹ hơn nhiều và cài đặt nhanh hơn các phụ thuộc mà bạn thường cần bằng cách sử dụng Hồ sơ khách hàng của .NET 3.5 SP1. Bạn có thể đọc về điều này tại đây: http://msdn.microsoft.com/en-us/library/cc656912.aspx

+0

rất thông tin - cảm ơn bạn –

+0

Tôi đang cố gắng làm điều tương tự với Visual Studio và tôi đang được thông báo rằng điều đó là không thể. – muttley91

+0

"Điều tương tự" này là gì? Tôi nói về một số tùy chọn ở đây. –

13

Nhìn vào mkbundle bằng Mono.

+0

mát tôi nghĩ rằng im gonna đi tuyến đường này - cảm ơn! –

+0

Tôi chắc rằng có một công cụ cho Windows mà tôi đã từng làm, một thời gian dài *. Có lẽ ILMerge? – configurator

+0

có trình cài đặt cửa sổ cho id đơn không? Tôi đã tìm thấy nguồn nhưng tôi đang gặp khó khăn khi tìm một mã nhị phân. tôi cho là có thể biên dịch nó nhưng nó mang lại cho tôi nhiều cơ hội để vặn một cái gì đó lên ... –

2

Không thể. Ứng dụng C# "biên dịch" của bạn là một ngôn ngữ mà trình diễn CLR .Net (cần phải nói JITed, đọc IL, biên dịch thành mã gốc, và sau đó gọi mã gốc đã biên dịch) khi chạy.

FYI .net 2.0 là cài đặt chuẩn trên xp SP2 và vista, vì vậy bạn sẽ không phải trả nhiều tiền phạt.

Bạn có thể xem xét đơn điệu, nhưng điều này vẫn liên quan đến việc chạy một số loại khung công tác trên máy mục tiêu của bạn.

+3

"Ứng dụng C#" đã biên dịch của bạn là một ngôn ngữ mà .Net CLR diễn giải khi chạy. " - rác rưởi, không đúng. Lần đầu tiên một số mã được quản lý chạy trên một máy đã cho, đó là JIT được biên dịch thành mã gốc cho máy đó. C# không bao giờ được diễn giải. – tomfanning

+3

Đã xảy ra sự cố trên internet. – Spence

+1

@tomfanning Nhưng bạn vẫn cần CLR để chạy mã được biên dịch, phải không? Vì vậy, nếu, lần đầu tiên bytecode được chạy, nó được biên dịch JIT, và thậm chí trên các lần chạy tiếp theo nó được CLR quản lý, có gì sai khi nói rằng CLR "diễn giải (mã) khi chạy"? –

5

Hãy xem qua hồ sơ khách hàng .NET. Điều này sẽ cho phép bạn gói cài đặt tối thiểu trên máy khách .. sau này sẽ được cập nhật bằng các cửa sổ cập nhật lên toàn bộ khung công tác.

Điều này phụ thuộc, tất nhiên, trên ứng dụng của bạn chỉ sử dụng các thư viện được chứa trong hồ sơ cá nhân của khách hàng ...

Một số thông tin ở đây: http://blogs.windowsclient.net/trickster92/archive/2008/05/21/introducing-the-net-framework-client-profile.aspx

5

Người ta nói nó là có thể, sử dụng các công cụ của bên thứ 3 chẳng hạn như http://www.remotesoft.com/linker/

+0

Đối với một trang web khủng khiếp như vậy xấu xí trông giống như một sản phẩm tuyệt vời đặc biệt là nếu bạn đang lo lắng về trộm cắp nguồn kể từ obfuscation là gần như tầm thường đến một cracker thực sự. –

-2

Một số tính năng C# được ràng buộc với giao diện của khung .NET.

Ví dụ:

yield return đòi hỏi giao diện IEnumerable

using (x) {} đòi hỏi giao diện IDisposable

+1

Điều này không liên quan gì đến những gì OP hỏi. Anh ta hỏi về việc biên dịch * tĩnh * của các thư viện .NET cùng với chương trình. –

+0

Vâng, tiêu đề ban đầu là "Bạn có thể biên dịch C# mà không sử dụng khung .Net không?" – Rauhotz

0

sự phụ thuộc này mà tiếc là thường xuyên phá vỡ hoặc là mất tích trong thế giới thực là một lý do lớn tại sao C# có không có sự chấp nhận rộng hơn. Mặt khác, sự phát triển nhất có phụ thuộc .. xem ví dụ C++ & Java.

Tôi không nghĩ rằng chúng tôi sẽ thực sự thoát khỏi những vấn đề phụ thuộc này sớm, vì vậy tôi khuyên bạn nên sử dụng C#, bạn thực hiện trình bao để cài đặt để kiểm tra phụ thuộc phiên bản .net framework bạn cần và nếu thiếu thông báo cho người dùng rằng họ cần điều này để chạy ứng dụng của bạn.

6

Nó bây giờ có thể biên dịch C# để mã gốc sử dụng Microsoft .NET Quê quán: https://msdn.microsoft.com/en-us/library/dn584397(v=vs.110).aspx

Nó tự động biên dịch các phiên bản phát hành của ứng dụng được viết bằng mã số quản lý (C# hoặc Visual Basic) và nhắm mục tiêu Khuôn khổ .NET và Windows 10 thành mã gốc.

...

Đối với người dùng của ứng dụng của bạn, NET Native cung cấp các ưu điểm:

• Thời gian thi công nhanh

• thời gian khởi động nhanh chóng Luôn

• Chi phí triển khai và cập nhật thấp

• Tối ưu hóa sử dụng bộ nhớ ứng dụng

này chỉ làm việc với Visual Studio .NET 2015.

+0

Nó chỉ hoạt động trong UWP – Cooper

Các vấn đề liên quan