Bir .NET uygulamasını yerel koda nasıl derleyebilirim?


90

.NET çerçevesinin mevcut olmadığı bir makinede bir .NET uygulamasını çalıştırmak istersem; Uygulamayı yerel koda derlemenin herhangi bir yolu var mı?

Yanıtlar:


45

Microsoft'un MSIL'i Yerel Koda nasıl derleyebileceğinizi açıklayan bir makalesi var

Ngen'i kullanabilirsiniz .

Yerel Görüntü Oluşturucu (Ngen.exe), yönetilen uygulamaların performansını artıran bir araçtır. Ngen.exe, derlenmiş işlemciye özgü makine kodunu içeren dosyalar olan yerel görüntüler oluşturur ve bunları yerel bilgisayardaki yerel görüntü önbelleğine yükler. Çalışma zamanı, orijinal derlemeyi derlemek için tam zamanında (JIT) derleyicisini kullanmak yerine önbellekteki yerel görüntüleri kullanabilir.

Ne yazık ki, programınızı çalıştırmak için çerçevedeki kitaplıklara hala ihtiyacınız var. Gerekli tüm dosyaları tek bir yürütülebilir dosyada derlemenize izin veren MS .Net çerçeve SDK ile bildiğim hiçbir özellik yok


1
Bunu performanslardan başka kullanmak için başka bir neden bulamıyorum. CLR kodu daha önce olduğu gibi okunabilir ve yine de .NET'e ihtiyacınız vardır. Bu yüzden hayal kırıklığına uğratan Microsoft, benim büyük bir sorun olduğunu düşündüğüm şeyi düzeltecek bir araç sağlamadı (herkes üst düzey kodunuzu olduğu gibi görebilir)
MasterMastic

Espo'ya katılmıyorum. Çünkü gri metin, "Runtime", yani CLR ve dolayısıyla Chris'in haklı olarak işaret ettiği gibi ortaya çıkan .NET Framework anlamına gelir. Ancak NGen noktası doğrudur. Soru CLR / Runtime / .NET Framework kullanmadan hepsinin aynı olmasıdır.
Jasmine

1
Ancak heyecanlanma zamanı geldi, görünüşe göre .net çerçevesi nihayet yerel bir derleyici alıyor - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder

.NET yürütülebilir dosyanızı ve bağımlılık ağacındaki her şeyi ILMerge, sonra .NET'ten bağımsız bir yürütülebilir dosya istiyorsanız Ngen .

24

RemoteSoft, bir .NET uygulamasını .NET yüklenmeden çalıştırılabilen bir pakete derleyen bir araç yapar. Bununla ilgili herhangi bir deneyimim yok:

RemoteSoft Salamander


5
Bu, çerçeveye ihtiyaç duymadan bunu yapacağını duyduğum tek araç. Tabii ki 1249 dolara mal oluyor.
Slapout

3
Son birkaç yılda bilgi veya değerlendirme almak için birkaç kez denedim, ancak fiyatlandırma veya demolar hakkındaki e-postalarımı asla geri vermiyorlar, bu yüzden ürünlerinin biraz şüpheli olabileceğini düşünüyorum.
codenheim

22

Buradaki diğer yanıtlardan bazılarının da bahsettiği gibi, uygulamanızı yerel makine koduna derlemek için .NET Yerel aracını kullanabilirsiniz. Ancak bu cevapların aksine, nasıl yapılacağını açıklayacağım .

Adımlar:

  1. Yeni .NET Core araç zincirinin bir parçası olan dotnet CLI (komut satırı arabirimi) aracını yükleyin . Bunu uygulamamızı derlemek için kullanacağız; burada bununla ilgili güzel bir makale bulabilirsiniz .

  2. Bir kabuk istemi açın ve cduygulamanızın dizinine gidin.

  3. Bunu yaz:

    dotnet compile --native
    

Bu kadar! İşiniz bittiğinde, uygulamanız aşağıdaki gibi tek bir ikili dosyada derlenecektir:

Yerel derlenmiş .NET Core EXE

Bağımsız bir yürütülebilir dosya olacak; PDB'ler, derlemeler veya yapılandırma dosyaları dahil değildir (yaşasın!).


Alternatif olarak, daha hızlı bir program istiyorsanız, şunu çalıştırabilirsiniz:

dotnet compile --native --cpp

Bu, programınızı C ++ kod oluşturucuyu (RyuJIT'in aksine) kullanarak optimize eder, böylece uygulamanız AOT senaryoları için daha da optimize edilir.

Bununla ilgili daha fazla bilgiyi dotnet CLI GitHub deposunda bulabilirsiniz .


Not: Bu yalnızca .NET Core ile oluşturulan projelerde desteklenir. (+1, yine de)
Mahmoud Al-Qudsi

.NET
Native'in

1
.net core 3.1 ile herhangi bir güncelleme çalışmıyor gibi görünüyor?
user1005462

19

Birkaç tanesini test ettim ve şu anda .NET 3.5'i destekleyen ve aynı zamanda harika bir sanallaştırma yığınına sahip olan tek Xenocode Postbuild

Ngen ile hala .NET çerçevesinin kurulu olması gerekir, ancak bu tür bir araç kullanıldığında tüm yönetilen kodunuz yerel kodda derlenir, böylece onu çerçeve varlığı olmadan makinelere dağıtabilirsiniz.



11

Evet, Yerel Görüntü Oluşturucu Ngen kullanılıyor . Bununla birlikte, bilmeniz gereken birkaç şey var:

  • Çalıştırılabilir dosyanızı çalıştırmak için yine de CLR'ye ihtiyacınız var.
  • CLR, montajlarınızı çalıştığı ortama göre dinamik olarak optimize etmeyecektir (örn. 486, 586, 686, vb.)

Sonuç olarak, yalnızca uygulamanızın başlama süresini kısaltmanız gerektiğinde Ngen kullanmaya değer.


9

Yapabilirsin! Ancak .NET 1.1 ile sınırlısınız (sizin için jenerik değil): Mono Ahead-Of-Time derlemesi (AOT)

Ancak bu, derlemenin gerçekten yerel olduğu anlamına gelir, bu nedenle artık tek bir bayt kodu derlemesini dağıtamayacaksınız, her platform için bir bayt koduna ihtiyacınız olacak.

Orijinal olarak iPhone için .NET veya Mono olmadığı için tasarlandı, bu yüzden MonoTouch'ı böyle yaptılar.


6

Bunu .NET Native adlı yeni ön derleme teknolojisini kullanarak yapabilirsiniz. Buradan kontrol edin: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

Şu anda yalnızca Windows Mağazası Uygulamaları için mevcuttur. Tek bileşenli bağlantı gerçekleştirir. Dolayısıyla .NET Framework kitaplıkları, uygulamanıza statik olarak bağlanır. Her şey yerel olarak derlenir ve IL derlemeleri artık konuşlandırılmaz. Uygulamalar CLR'ye karşı değil Managed Runtime (Mrt.dll) adı verilen sadeleştirilmiş, optimize edilmiş bir çalışma zamanıyla çalışır.

Yukarıda belirtildiği gibi, NGEN bir karma derleme modeli kullandı ve dinamik senaryolar için IL ve JIT'e güvendi. .NET Native, JIT kullanmaz, ancak çeşitli dinamik senaryoları destekler. Kod yazarlarının, desteklemek istedikleri dinamik senaryolar hakkında .NET Yerel derleyicisine ipuçları sağlamak için Çalışma Zamanı Yönergelerini kullanmaları gerekir .


1
+1 - Bunun olmasını yıllardır bekliyordum. Dünyanın "Sanal Makine" ye olan sevgisinin daha erken yol almasını umuyordum, ama yine de oluyor. Yerel derlemenin yeniden dirildiğini görmeyi umuyorum. Sizin de söylediğiniz gibi, şu anda Windows Mağaza Uygulamaları için, ancak masaüstü pazarının eşit muameleyi talep etmesi sadece bir zaman meselesi.
codenheim

4

Yerel bir görüntü oluşturmak için ngen.exe'yi kullanabilirsiniz, ancak yine de orijinal yerel olmayan kodu dağıtmanız gerekir ve yine de hedef makinede kurulu çerçeveye ihtiyaç duyar.

Bu da probleminizi gerçekten çözmez.


2

2019 Cevap: dotnet / corert kullanın . .NET Core projelerini bağımsız .exedosyalar halinde derleyebilir . Bağımlılık yok (gibi sistem kitaplıkları hariç kernel32.dll). Bahse girerim bu, OP'nin ihtiyacı olan şeydir.

GitHub ana sayfasından:

CoreRT derleyicisi, yönetilen bir .NET Core uygulamasını, dağıtımı kolay yerel (mimariye özgü) tek dosyalı bir yürütülebilir dosyada derleyebilir. Ayrıca, diğer programlama dillerinde yazılmış uygulamalar tarafından kullanılabilen bağımsız dinamik veya statik kitaplıklar da üretebilir.


Depo artık arşivlendi ve yerini aldı.
user541686

1

. NET çerçevesinden bağımsız olarak çalıştırılabilen gerçek bir yerel .exe üretmek asla amaçlanmadı.

Belki bunu yapan bir hack vardır, ama bana güvenli gelmiyor. Çerçeveyi gerektiren çok fazla dinamik var, örneğin: dinamik montaj yükleme, MSIL kodu oluşturma, vb.


0

Native'e derlemenin ana nedeni kodlarınızı güvence altına almaktır, aksi takdirde derlenen MSIL, istemcinin makinesindeki kaynak kodlarını dağıtmak gibidir.

NGEN yerel olarak derlenir ancak aynı zamanda IL kodlarını dağıtması gerekir, bu amaç sadece başlatma süresini azaltmaktır, ancak aynı zamanda faydasızdır.

CoreRt alfa sürümüdür ve yalnızca basit helloworld tipi uygulamalarla çalışır.

.Net Core tek bir yürütülebilir dosyalar halinde derlenir, ancak aynı zamanda yerel exe değildir, bu yalnızca IL kodlarının sıkıştırılmış bir dosyasıdır ve çalıştırırken kodları geçici klasöre açacaktır.

Microsoft'tan basit sorum, eğer RyuJIT IL'yi anında yerel olarak derleyebilirse, o zaman neden aynı IL'yi önceden (AOT) derleyemiyorsunuz?


"CoreRt alfa sürümüdür ve yalnızca basit helloworld tipi uygulamalarla çalışır." Bu doğru değil - Steam'de helloworld'den daha karmaşık oyunlar var (örneğin, street4rage.com ).
S Waye

Ancak CoreRT herhangi bir Winform uygulamasını derleyemez. Winform uygulamasını ( dotnetnative.online ) derleyebilecek başka bir çevrimiçi derleyici buldum
Rahim Surani



-3

Bunun mümkün olmadığını düşünüyorum. NET FW'yi de dağıtmanız gerekecektir. .NET uygulamasını yerel koda derlemek istiyorsanız, NGen aracını kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.