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:
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
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ó:
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:
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.
Mở lời nhắc shell và cd
đến thư mục ứng dụng của bạn.
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:
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 .
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.
Microsoft đã công bố bản .NET Native Preview sẽ cho phép chạy các ứng dụng .NET mà không cần cài đặt khuôn khổ.
Hãy xem: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/annocting-net-native-preview.aspx
Câu hỏi thường gặp: http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx
Bạn có thể tải xuống Microsoft .NET Native cho VS2013 từ đây: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
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 ý:
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.
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.
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ợ.
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.
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 .exe
tệ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.
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.
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).
Có vẻ như các giải pháp RT lõi thuần khả thi; sắp tới tất cả các ứng dụng sẽ chuyển sang lõi .net; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://docs.microsoft.com/en-us / archive / msdn-Magazine / 2018 / november / net-core-Publishing-options-with-net-core
không thử nghiệm có thể với win cũ .net sdk có thể làm tương tự.
hãy thử cái này ( http://www.dotnetnative.online/ ) để biên dịch .net đã biên dịch exe thành exe bản địa, tôi đã thử cái này, nó mới nhưng tốt.