Bagaimana cara mengkompilasi aplikasi .NET ke kode asli?

90

Jika saya ingin menjalankan aplikasi .NET di mesin di mana kerangka .NET tidak tersedia; Apakah ada cara untuk mengkompilasi aplikasi ke kode asli?

Niyaz
sumber

Jawaban:

45

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

Espo
sumber
1
Saya tidak menemukan alasan lain untuk menggunakan ini selain pertunjukan. Kode CLR masih bisa dibaca seperti sebelumnya, dan Anda tetap membutuhkan .NET. Sangat mengecewakan Microsoft tidak menyediakan alat yang akan memperbaiki apa yang saya anggap sebagai masalah besar (siapa pun dapat melihat kode tingkat tinggi Anda apa adanya)
MasterMastic
Saya tidak setuju dengan Espo. Karena, teks berwarna abu-abu mengatakan "Runtime" yang berarti CLR dan dengan demikian .NET Framework yang muncul seperti yang ditunjukkan dengan benar oleh Chris. Namun, poin NGen benar. Pertanyaannya adalah, tanpa menggunakan CLR / Runtime / .NET Framework semuanya sama.
Jasmine
1
Namun, ini saatnya untuk bersemangat, sepertinya kerangka kerja .net akhirnya mendapatkan kompiler asli - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder
ILMerge .NET Anda yang dapat dieksekusi dan semua yang ada di pohon ketergantungannya kemudian Ngen jika Anda ingin yang dapat dieksekusi independen dari .NET .
24

RemoteSoft membuat alat yang mengkompilasi aplikasi .NET menjadi sebuah paket yang dapat dijalankan tanpa menginstal .NET. Saya tidak punya pengalaman dengan itu:

RemoteSoft Salamander

Simon Steele
sumber
5
Itulah satu-satunya alat yang pernah saya dengar yang akan melakukannya tanpa memerlukan kerangka kerja. Tentu saja, biayanya $ 1249.
Slapout
3
Saya mencoba beberapa kali selama beberapa tahun terakhir, untuk mendapatkan informasi atau evaluasi, tetapi mereka tidak pernah mengembalikan email saya tentang harga atau demo jadi saya pikir produk mereka mungkin sedikit mencurigakan.
codenheim
21

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:

  1. 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.

  2. Buka prompt shell dan cdke direktori aplikasi Anda.

  3. Ketik ini:

    dotnet compile --native
    

Itu dia! Setelah selesai, aplikasi Anda akan dikompilasi menjadi satu biner, seperti ini:

Native dikompilasi .NET Core EXE

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 .

James Ko
sumber
Catatan: ini hanya didukung untuk proyek yang dibuat dengan .NET Core. (+1, meskipun)
Mahmoud Al-Qudsi
Anda lupa detail yang sangat penting bahwa .NET Native membutuhkan Windows 10.
Elmue
Sepertinya tidak bekerja dengan .net core 3.1 pembaruan apa pun?
pengguna1005462
19

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.

Erick Sgarbi
sumber
11

Ya, menggunakan Ngen , Generator Gambar Asli. Namun, ada beberapa hal yang perlu Anda perhatikan:

  • Anda masih membutuhkan CLR untuk menjalankan file yang dapat dieksekusi.
  • CLR tidak akan secara dinamis mengoptimalkan rakitan Anda berdasarkan lingkungan tempatnya dijalankan (misalnya 486 vs. 586 vs. 686, dll.)

Secara keseluruhan, ini hanya layak menggunakan Ngen jika Anda perlu mengurangi waktu startup aplikasi Anda.

Chris Zwiryk
sumber
9

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.

Camilo Martin
sumber
6

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.

m_eric
sumber
1
+1 - Saya telah menunggu bertahun-tahun untuk hal ini terjadi. Saya berharap kegilaan dunia dengan "Mesin Virtual" akan berjalan lebih cepat, tapi bagaimanapun, itu terjadi. Saya berharap kita akan melihat kebangkitan kompilasi asli. Seperti yang Anda katakan, ini untuk Aplikasi Toko Window saat ini, tetapi hanya masalah waktu sebelum pasar desktop menuntut perlakuan yang sama.
codenheim
4

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.

Matt Bishop
sumber
2

Jawaban 2019: Gunakan dotnet / corert . Itu dapat mengkompilasi proyek .NET Core menjadi .exefile 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.

brk
sumber
1

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.

spoulson
sumber
0

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).

Rahim Surani
sumber
"CoreRt adalah versi alfa dan hanya berfungsi dengan aplikasi tipe helloworld sederhana." Ini tidak benar - ada game di Steam (mis. Streets4rage.com ) yang lebih kompleks daripada helloworld.
S Waye
Tetapi CoreRT tidak dapat mengkompilasi aplikasi Winform apa pun. Saya menemukan kompiler online lain yang dapat mengkompilasi aplikasi Winform ( dotnetnative.online )
Rahim Surani
-1

coba ini ( http://www.dotnetnative.online/ ) untuk mengkompilasi .net exe dikompilasi menjadi exe asli, saya mencoba ini, ini baru tapi bagus.

Rahim Surani
sumber
Silakan posting konten link di jawaban.
Russ J
-3

Saya pikir itu tidak mungkin. Anda juga perlu mendistribusikan .NET FW. Jika Anda ingin mengkompilasi aplikasi .NET ke kode asli, gunakan alat NGen

aku
sumber