Làm cách nào để biên dịch một ứng dụng .NET sang mã gốc?


89

Nếu tôi muốn chạy ứng dụng .NET trong máy không có sẵn .NET framework; Có cách nào để biên dịch ứng dụng sang mã gốc không?

Câu trả lời:


45

Microsoft có một bài viết mô tả cách bạn có thể Biên dịch MSIL sang Mã gốc

Bạn có thể sử dụng Ngen .

Native Image Generator (Ngen.exe) là một công cụ cải thiện hiệu suất của các ứng dụng được quản lý. Ngen.exe tạo các ảnh gốc, là các tệp chứa mã máy dành riêng cho bộ xử lý đã biên dịch và cài đặt chúng vào bộ đệm ảnh gốc trên máy tính cục bộ. Thời gian chạy có thể sử dụng hình ảnh gốc từ bộ nhớ cache thay vì sử dụng trình biên dịch just-in-time (JIT) để biên dịch assembly gốc.

Thật không may, bạn vẫn cần các thư viện từ khung để chạy chương trình của mình. Không có tính năng nào mà tôi biết với MS .Net framework SDK cho phép bạn biên dịch tất cả các tệp được yêu cầu thành một tệp thực thi duy nhất


1
Tôi không tìm thấy lý do nào khác để sử dụng điều này ngoài các buổi biểu diễn. Mã CLR vẫn có thể được đọc như trước và bạn vẫn yêu cầu .NET. Vì vậy, thất vọng Microsoft không cung cấp với một công cụ mà sẽ sửa chữa những gì tôi cho là một vấn đề lớn (bất cứ ai có thể xem mã cấp cao của bạn vì nó là)
MasterMastic

Tôi không đồng ý với Espo. Bởi vì, văn bản màu xám cho biết "Runtime" có nghĩa là CLR và do đó .NET Framework có hình ảnh đúng như Chris đã chỉ ra. Tuy nhiên, điểm NGen là đúng. Câu hỏi là, nếu không sử dụng CLR / Runtime / .NET Framework thì tất cả đều giống nhau.
Jasmine

1
Đó là thời gian để kích thích tuy nhiên, trông giống như khung lưới là cuối cùng nhận được một trình biên dịch có nguồn gốc - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder

ILMerge tệp thực thi .NET của bạn và mọi thứ trong cây phụ thuộc của nó rồi Ngen nếu bạn muốn tệp thực thi độc lập với .NET .

24

RemoteSoft tạo ra một công cụ biên dịch ứng dụng .NET thành một gói có thể chạy mà không cần cài đặt .NET. Tôi không có bất kỳ kinh nghiệm nào với nó:

RemoteSoft Salamander


5
Đó là công cụ duy nhất mà tôi từng nghe nói về nó sẽ làm được điều đó mà không cần đến khuôn khổ. Tất nhiên, nó có giá 1249 đô la.
Slapout

3
Tôi đã thử một vài lần trong vài năm qua, để lấy thông tin hoặc đánh giá, nhưng họ không bao giờ trả lại email của tôi về giá cả hoặc bản trình diễn nên tôi nghĩ rằng sản phẩm của họ có thể hơi đáng ngờ.
codenheim

21

Như một số câu trả lời khác ở đây đã đề cập, bạn có thể sử dụng công cụ .NET Native để biên dịch ứng dụng của mình sang mã máy gốc. Tuy nhiên, không giống như những câu trả lời đó, tôi sẽ giải thích cách thực hiện.

Các bước:

  1. Cài đặt công cụ dotnet CLI (giao diện dòng lệnh), là một phần của chuỗi công cụ .NET Core mới. Chúng tôi sẽ sử dụng cái này để biên dịch ứng dụng của mình; bạn có thể tìm thấy một bài báo hay về nó ở đây.

  2. Mở lời nhắc shell và cdđến thư mục ứng dụng của bạn.

  3. Nhập cái này:

    dotnet compile --native
    

Đó là nó! Khi bạn hoàn tất, ứng dụng của bạn sẽ được biên dịch thành một tệp nhị phân duy nhất, như sau:

.NET Core EXE được biên dịch tự nhiên

Nó sẽ là một tệp thực thi độc lập; không bao gồm PDB, hội đồng hoặc tệp cấu hình (hooray!).


Ngoài ra, nếu bạn muốn một chương trình nhanh hơn, bạn có thể chạy như sau:

dotnet compile --native --cpp

Điều đó sẽ tối ưu hóa chương trình của bạn bằng cách sử dụng trình tạo mã C ++ (trái ngược với RyuJIT), vì vậy ứng dụng của bạn thậm chí còn được tối ưu hóa hơn cho các tình huống AOT.

Bạn có thể tìm thêm thông tin về điều này tại repo dotnet CLI GitHub .


Lưu ý: điều này chỉ được hỗ trợ đối với các dự án được xây dựng bằng .NET Core. (+1, mặc dù)
Mahmoud Al-Qudsi

Bạn đã quên chi tiết rất quan trọng rằng .NET Native yêu cầu Windows 10.
Elmue

có vẻ như không hoạt động với .net core 3.1 bất kỳ bản cập nhật nào?
user1005462

19

Tôi đã thử nghiệm một số trong số chúng và tại thời điểm này, cái duy nhất hỗ trợ .NET 3.5 và cũng có một ngăn xếp ảo hóa tuyệt vời là Xenocode Postbuild

Với ngen, bạn vẫn cần phải cài đặt .NET framework nhưng sử dụng một công cụ như vậy, tất cả mã được quản lý của bạn được biên dịch thành mã gốc để bạn có thể triển khai nó cho các máy mà không có sự hiện diện của framework.



11

Có, bằng cách sử dụng Ngen , Trình tạo hình ảnh gốc. Tuy nhiên, có một số điều bạn cần lưu ý:

  • Bạn vẫn cần CLR để chạy tệp thực thi của mình.
  • CLR sẽ không tự động tối ưu hóa các tập hợp của bạn dựa trên môi trường mà nó đang chạy (ví dụ: 486 so với 586 so với 686, v.v.)

Nói chung, bạn chỉ nên sử dụng Ngen nếu bạn cần giảm thời gian khởi động ứng dụng của mình.


9

Bạn có thể! Tuy nhiên, bạn bị hạn chế với .NET 1.1 (không có generics cho bạn): Biên dịch Mono Ahead-Of-Time (AOT)

Tuy nhiên, điều này có nghĩa là việc biên dịch thực sự là bản địa, vì vậy bạn sẽ không thể triển khai một hội mã bytecode duy nhất nữa, bạn sẽ cần một hội mã cho mỗi nền tảng.

Ban đầu nó được thiết kế vì không có .NET hoặc Mono cho iPhone, vì vậy đó là cách họ tạo ra MonoTouch.


6

Bạn có thể thực hiện việc này bằng cách sử dụng công nghệ biên dịch trước mới có tên .NET Native. Kiểm tra nó tại đây: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

Hiện tại nó chỉ có sẵn cho Ứng dụng Windows Store. Nó thực hiện liên kết thành phần đơn lẻ. Vì vậy, các thư viện .NET Framework được liên kết tĩnh vào ứng dụng của bạn. Mọi thứ được biên dịch thành bản địa và các tổ hợp IL không còn được triển khai nữa. Các ứng dụng không chạy dựa trên CLR mà là một thời gian chạy được tối ưu hóa, rút ​​gọn được gọi là Managed Runtime (Mrt.dll)

Như đã nêu ở trên, NGEN đã sử dụng mô hình biên dịch hỗn hợp và dựa vào IL và JIT cho các kịch bản động. .NET Native không sử dụng JIT nhưng nó hỗ trợ các kịch bản động khác nhau. Tác giả mã sẽ cần sử dụng Chỉ thị thời gian chạy để cung cấp gợi ý cho trình biên dịch .NET Native về các tình huống động mà họ muốn hỗ trợ.


1
+1 - Tôi đã đợi nhiều năm để điều này xảy ra. Tôi hy vọng sự say mê của thế giới với "Máy ảo" sẽ chạy sớm hơn, nhưng dù sao, nó vẫn đang xảy ra. Tôi hy vọng chúng ta sắp chứng kiến ​​sự trỗi dậy của việc biên dịch bản địa. Như bạn đã nói, nó dành cho Ứng dụng Cửa hàng của Window vào lúc này, nhưng chỉ còn là vấn đề thời gian trước khi thị trường máy tính để bàn đòi hỏi sự đối xử bình đẳng.
codenheim

4

Bạn có thể sử dụng ngen.exe để tạo một hình ảnh gốc nhưng bạn vẫn phải phân phối mã gốc không phải gốc và nó vẫn cần khung được cài đặt trên máy đích.

Điều đó thực sự không giải quyết được vấn đề của bạn.


2

Câu trả lời năm 2019: Sử dụng dotnet / corert . Nó có thể biên dịch các dự án .NET Core thành các .exetệp độc lập . Không có phụ thuộc (ngoại trừ các thư viện hệ thống như kernel32.dll). Tôi cá rằng đây chính xác là những gì OP cần.

Từ trang chủ GitHub của nó:

Trình biên dịch CoreRT có thể biên dịch ứng dụng .NET Core được quản lý thành tệp thực thi một tệp riêng (dành riêng cho kiến ​​trúc) dễ triển khai. Nó cũng có thể tạo ra các thư viện động hoặc tĩnh độc lập có thể được sử dụng bởi các ứng dụng được viết bằng các ngôn ngữ lập trình khác.


1

Bản chất của .NET là có thể cài đặt các ứng dụng đã được biên dịch sang MSIL, sau đó bằng JIT hoặc Ngen, MSIL được biên dịch thành mã gốc và được lưu trữ cục bộ trong bộ nhớ cache. Nó không bao giờ có ý định tạo một .exe gốc thực sự có thể chạy độc lập với .NET framework.

Có thể có một số hack làm điều này, nhưng nó không an toàn với tôi. Có quá nhiều động lực yêu cầu khuôn khổ, chẳng hạn như: tải lắp ráp động, tạo mã MSIL, v.v.


0

Lý do chính để biên dịch thành Native là để bảo mật mã của bạn, nếu không thì MSIL được biên dịch giống như triển khai mã nguồn trong máy khách.

NGEN biên dịch thành native nhưng cũng cần triển khai các mã IL, mục đích này chỉ là giảm thời gian khởi động nhưng cũng vô ích.

CoreRt là phiên bản alpha và chỉ hoạt động với các ứng dụng loại helloworld đơn giản.

.Net Core biên dịch thành các tệp thực thi duy nhất nhưng nó cũng không phải là exe gốc, đây chỉ là tệp nén các mã IL và nó sẽ giải nén các mã vào thư mục tạm thời trong khi chạy.

Câu hỏi đơn giản của tôi từ Microsoft là, nếu RyuJIT có thể biên dịch IL thành bản gốc ngay lập tức thì tại sao bạn không thể biên dịch cùng một IL trước thời hạn (AOT).


"CoreRt là phiên bản alpha và chỉ hoạt động với các ứng dụng loại helloworld đơn giản." Điều này không đúng - có những trò chơi trên Steam (ví dụ: street4rage.com ) phức tạp hơn helloworld.
S Waye

Nhưng CoreRT không thể biên dịch bất kỳ ứng dụng Winform nào. Tôi đã tìm thấy một trình biên dịch trực tuyến khác có thể biên dịch ứng dụng Winform ( dotnetnative.online )
Rahim Surani



-3

Tôi nghĩ điều đó là không thể. Bạn cũng sẽ cần phải phân phối .NET FW. Nếu bạn muốn biên dịch ứng dụng .NET sang mã gốc, hãy sử dụng công cụ NGen

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.