Jika saya ingin menjalankan aplikasi .NET di mesin di mana kerangka .NET tidak tersedia; Apakah ada cara untuk mengkompilasi aplikasi ke kode asli?
Jawaban:
Microsoft memiliki artikel yang menjelaskan bagaimana Anda dapat Mengkompilasi MSIL ke Kode Asli
Anda bisa menggunakan Ngen .
Native Image Generator (Ngen.exe) adalah alat yang meningkatkan kinerja aplikasi yang dikelola. Ngen.exe membuat gambar asli, yang merupakan file yang berisi kode mesin khusus prosesor yang dikompilasi, dan menginstalnya ke dalam cache gambar asli di komputer lokal. Runtime dapat menggunakan gambar asli dari cache alih-alih menggunakan kompiler just-in-time (JIT) untuk mengompilasi rakitan asli.
Sayangnya, Anda masih membutuhkan pustaka dari kerangka kerja untuk menjalankan program Anda. Tidak ada fitur yang saya ketahui dengan MS .Net framework SDK yang memungkinkan Anda mengompilasi semua file yang diperlukan menjadi satu yang dapat dieksekusi
RemoteSoft membuat alat yang mengkompilasi aplikasi .NET menjadi sebuah paket yang dapat dijalankan tanpa menginstal .NET. Saya tidak punya pengalaman dengan itu:
Seperti yang disebutkan beberapa jawaban lain di sini, Anda dapat menggunakan alat .NET Native untuk mengompilasi aplikasi Anda ke kode mesin asli. Tidak seperti jawaban itu, saya akan menjelaskan bagaimana melakukannya.
Langkah:
Instal alat dotnet CLI (command line interface), yang merupakan bagian dari toolchain .NET Core baru. Kami akan menggunakan ini untuk mengkompilasi aplikasi kami; Anda dapat menemukan artikel bagus tentang itu di sini.
Buka prompt shell dan cd
ke direktori aplikasi Anda.
Ketik ini:
dotnet compile --native
Itu dia! Setelah selesai, aplikasi Anda akan dikompilasi menjadi satu biner, seperti ini:
Ini akan menjadi eksekusi mandiri; tidak ada PDB, rakitan, atau file konfigurasi yang disertakan (hore!).
Atau, jika Anda menginginkan program yang lebih cepat, Anda dapat menjalankan ini:
dotnet compile --native --cpp
Itu akan mengoptimalkan program Anda menggunakan generator kode C ++ (sebagai lawan dari RyuJIT), sehingga aplikasi Anda bahkan lebih dioptimalkan untuk skenario AOT.
Anda dapat menemukan info lebih lanjut tentang ini di repo GitHub CLI dotnet .
Saya telah menguji beberapa di antaranya dan saat ini satu-satunya yang mendukung .NET 3.5 dan juga memiliki tumpukan virtualisasi yang bagus adalah Xenocode Postbuild
Dengan ngen Anda masih perlu menginstal .NET framework tetapi menggunakan alat seperti itu, semua kode yang Anda kelola dikompilasi menjadi kode asli sehingga Anda dapat menerapkannya ke mesin tanpa kehadiran framework.
Microsoft telah mengumumkan .NET Native Preview yang akan memungkinkan untuk menjalankan aplikasi .NET tanpa harus memasang kerangka kerja.
Lihat: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
FAQ: http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx
Anda dapat mengunduh Microsoft .NET Native untuk VS2013 dari sini: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
Ya, menggunakan Ngen , Generator Gambar Asli. Namun, ada beberapa hal yang perlu Anda perhatikan:
Secara keseluruhan, ini hanya layak menggunakan Ngen jika Anda perlu mengurangi waktu startup aplikasi Anda.
Kamu bisa! Namun Anda dibatasi untuk .NET 1.1 (tidak ada generik untuk Anda): Kompilasi Mono Ahead-Of-Time (AOT)
Namun, ini berarti kompilasi benar-benar asli, jadi Anda tidak akan dapat lagi menerapkan satu rakitan bytecode tunggal, Anda memerlukan satu per platform.
Awalnya dirancang karena tidak ada .NET atau Mono untuk iPhone, jadi begitulah cara mereka membuat MonoTouch.
Anda dapat melakukan ini menggunakan teknologi prakompilasi baru yang disebut .NET Native. Lihat di sini: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
Saat ini hanya tersedia untuk Aplikasi Windows Store. Itu melakukan menghubungkan komponen tunggal. Jadi pustaka .NET Framework ditautkan secara statis ke aplikasi Anda. Semuanya dikompilasi ke rakitan asli dan IL tidak lagi digunakan. Aplikasi tidak berjalan melawan CLR tetapi runtime yang dipreteli dan dioptimalkan yang disebut Managed Runtime (Mrt.dll)
Seperti yang dinyatakan di atas, NGEN menggunakan model kompilasi campuran dan mengandalkan IL dan JIT untuk skenario dinamis. .NET Native tidak menggunakan JIT tetapi mendukung berbagai skenario dinamis. Penulis kode perlu menggunakan Runtime Directive untuk memberikan petunjuk kepada compiler Native .NET pada skenario dinamis yang ingin mereka dukung.
Anda dapat menggunakan ngen.exe untuk menghasilkan gambar asli tetapi Anda masih harus mendistribusikan kode non-asli asli juga, dan itu masih membutuhkan kerangka kerja yang diinstal pada mesin target.
Yang tidak menyelesaikan masalah Anda, sungguh.
Jawaban 2019: Gunakan dotnet / corert . Itu dapat mengkompilasi proyek .NET Core menjadi .exe
file mandiri . Tidak ada ketergantungan (kecuali untuk perpustakaan sistem seperti kernel32.dll
). Saya yakin inilah yang dibutuhkan OP.
Dari halaman beranda GitHub:
Kompilator CoreRT dapat mengompilasi aplikasi .NET Core yang dikelola menjadi file tunggal asli (khusus arsitektur) yang dapat dieksekusi yang mudah diterapkan. Itu juga dapat menghasilkan pustaka dinamis atau statis mandiri yang dapat dikonsumsi oleh aplikasi yang ditulis dalam bahasa pemrograman lain.
Sifat dari .NET adalah untuk dapat menginstal aplikasi yang telah dikompilasi ke MSIL, kemudian baik oleh JIT atau Ngen, MSIL dikompilasi ke kode asli dan disimpan secara lokal di cache. Itu tidak pernah dimaksudkan untuk menghasilkan .exe asli yang sebenarnya yang dapat dijalankan secara independen dari kerangka .NET.
Mungkin ada beberapa peretasan yang melakukan ini, tetapi kedengarannya tidak aman bagi saya. Ada terlalu banyak dinamika yang membutuhkan kerangka kerja, seperti: pemuatan perakitan dinamis, pembuatan kode MSIL, dll.
Alasan utama untuk mengkompilasi ke dalam Native adalah untuk mengamankan kode Anda, jika tidak, MSIL yang dikompilasi seperti menyebarkan kode sumber di mesin klien.
NGEN mengkompilasi menjadi native tetapi juga perlu menerapkan kode IL, tujuan ini hanya untuk mengurangi waktu startup tetapi juga tidak berguna.
CoreRt adalah versi alfa dan hanya berfungsi dengan aplikasi tipe helloworld sederhana.
.Net Core mengkompilasi menjadi file tunggal yang dapat dieksekusi tetapi juga bukan exe asli, ini hanya file kode IL yang di-zip dan akan mengekstrak kode ke dalam folder temp saat berjalan.
Pertanyaan sederhana saya dari Microsoft adalah, jika RyuJIT dapat mengkompilasi IL menjadi native dengan cepat, mengapa Anda tidak dapat mengkompilasi IL yang sama di depan waktu (AOT).
Sepertinya solusi yang bisa diterapkan RT inti bersih; segera semua aplikasi akan masuk ke .net core; 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
tidak diuji mungkin dengan win lama .net sdk mungkin melakukan hal serupa.
coba ini ( http://www.dotnetnative.online/ ) untuk mengkompilasi .net exe dikompilasi menjadi exe asli, saya mencoba ini, ini baru tapi bagus.