Come compilare un'applicazione .NET in codice nativo?


89

Se voglio eseguire un'applicazione .NET in una macchina in cui il framework .NET non è disponibile; C'è un modo per compilare l'applicazione in codice nativo?

Risposte:


45

Microsoft ha un articolo che descrive come è possibile compilare MSIL in codice nativo

Puoi usare Ngen .

Native Image Generator (Ngen.exe) è uno strumento che migliora le prestazioni delle applicazioni gestite. Ngen.exe crea immagini native, che sono file contenenti codice macchina compilato specifico del processore e le installa nella cache dell'immagine nativa sul computer locale. Il runtime può utilizzare immagini native dalla cache invece utilizzando il compilatore just-in-time (JIT) per compilare l'assembly originale.

Sfortunatamente, hai ancora bisogno delle librerie dal framework per eseguire il tuo programma. Non ci sono funzionalità che io sappia con MS .Net framework SDK che ti permetta di compilare tutti i file richiesti in un unico eseguibile


1
Non trovo nessun altro motivo per usarlo oltre alle performance. Il codice CLR può ancora essere letto come prima e hai ancora bisogno di .NET. Così deludente Microsoft non ha fornito uno strumento in grado di risolvere quello che considero un grosso problema (chiunque può visualizzare il tuo codice di alto livello così com'è)
MasterMastic

Non sono d'accordo con Espo. Perché, il testo in grigio dice "Runtime" che significa CLR e quindi .NET Framework che entra in scena come giustamente indicato da Chris. Tuttavia, il punto NGen è vero. La domanda è che senza usare CLR / Runtime / .NET Framework sono tutti uguali.
Jasmine

1
E 'tempo di emozionarsi tuttavia, si presenta come il framework .NET sta finalmente ricevendo un compilatore nativo - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder

ILMerge il tuo eseguibile .NET e tutto il suo albero delle dipendenze, quindi Ngen se vuoi un eseguibile indipendente da .NET .

24

RemoteSoft crea uno strumento che compila un'applicazione .NET in un pacchetto che può essere eseguito senza .NET installato. Non ho alcuna esperienza con esso:

RemoteSoft Salamander


5
Questo è l'unico strumento di cui abbia mai sentito parlare che lo farà senza bisogno del framework. Certo, costa $ 1249.
Slapout

3
Ho provato un paio di volte negli ultimi anni, per ottenere informazioni o valutazioni, ma non hanno mai restituito le mie e-mail su prezzi o demo, quindi penso che il loro prodotto possa essere un po 'sospetto.
codenheim

21

Come alcune delle altre risposte qui hanno menzionato, puoi usare lo strumento .NET Native per compilare la tua app in codice macchina nativo. A differenza di quelle risposte, tuttavia, ti spiegherò come farlo.

Passaggi:

  1. Installa lo strumento dotnet CLI (interfaccia della riga di comando), che fa parte della nuova toolchain .NET Core. Lo useremo per compilare la nostra app; puoi trovare un buon articolo a riguardo qui.

  2. Apri un prompt della shell e cdnella directory della tua app.

  3. Digita questo:

    dotnet compile --native
    

Questo è tutto! Quando hai finito, la tua app verrà compilata in un singolo binario, in questo modo:

.NET Core compilato nativo EXE

Sarà un eseguibile autonomo; nessun PDB, assembly o file di configurazione inclusi (evviva!).


In alternativa, se desideri un programma ancora più veloce, puoi eseguire questo:

dotnet compile --native --cpp

Ciò ottimizzerà il tuo programma utilizzando il generatore di codice C ++ (al contrario di RyuJIT), quindi la tua app è ancora più ottimizzata per gli scenari AOT.

Puoi trovare maggiori informazioni su questo nel repository GitHub della CLI dotnet .


Nota: questo è supportato solo su progetti creati con .NET Core. (+1, però)
Mahmoud Al-Qudsi

Hai dimenticato il dettaglio molto importante che .NET Native richiede Windows 10.
Elmue

sembra che non funzioni con .net core 3.1 eventuali aggiornamenti?
user1005462

19

Ne ho testati diversi e in questo momento l'unico che supporta .NET 3.5 e ha anche un ottimo stack di virtualizzazione è Xenocode Postbuild

Con ngen è ancora necessario avere il framework .NET installato, ma utilizzando uno strumento in quanto tale tutto il codice gestito viene compilato in codice nativo in modo da poterlo distribuire su macchine senza la presenza del framework.



11

Sì, utilizzando Ngen , il generatore di immagini native. Ci sono, tuttavia, una serie di cose di cui devi essere consapevole:

  • Hai ancora bisogno del CLR per eseguire il tuo eseguibile.
  • Il CLR non ottimizzerà dinamicamente gli assembly in base all'ambiente in cui viene eseguito (ad esempio 486 vs 586 vs 686, ecc.)

Tutto sommato, vale la pena usare Ngen solo se è necessario ridurre il tempo di avvio dell'applicazione.


9

Puoi! Tuttavia sei limitato a .NET 1.1 (nessun generico per te): Mono Ahead-Of-Time compilation (AOT)

Tuttavia, questo significa che la compilazione è davvero nativa, quindi non sarai più in grado di distribuire un singolo assembly bytecode, ne avrai bisogno uno per piattaforma.

È stato originariamente progettato perché non esiste .NET o Mono per iPhone, quindi è così che hanno realizzato MonoTouch.


6

Puoi farlo utilizzando la nuova tecnologia di precompilazione denominata .NET Native. Controllalo qui: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

Attualmente è disponibile solo per le app di Windows Store. Esegue il collegamento di un singolo componente. Quindi le librerie .NET Framework sono collegate staticamente alla tua app. Tutto viene compilato in modo nativo e gli assembly IL non vengono più distribuiti. Le app non vengono eseguite su CLR ma su un runtime ottimizzato e ridotto chiamato Managed Runtime (Mrt.dll)

Come affermato sopra, NGEN ha utilizzato un modello di compilation mix e si è affidato a IL e JIT per scenari dinamici. .NET Native non utilizza JIT ma supporta vari scenari dinamici. Gli autori del codice dovrebbero utilizzare le direttive di runtime per fornire suggerimenti al compilatore .NET Native sugli scenari dinamici che desiderano supportare.


1
+1 - Aspetto da anni che questo accada. Speravo che l'infatuazione del mondo per la "Macchina virtuale" si sarebbe esaurita prima, ma comunque sta accadendo. Mi aspetto che stiamo per vedere una rinascita della compilation nativa. Come hai detto, al momento è per Windows Store Apps, ma è solo una questione di tempo prima che il mercato desktop richieda parità di trattamento.
codenheim

4

È possibile utilizzare ngen.exe per generare un'immagine nativa, ma è comunque necessario distribuire anche il codice non nativo originale e necessita ancora del framework installato sulla macchina di destinazione.

Il che non risolve il tuo problema, davvero.


2

Risposta 2019: usa dotnet / corert . Può compilare progetti .NET Core in .exefile autonomi . Nessuna dipendenza (ad eccezione di librerie di sistema come kernel32.dll). Scommetto che questo è esattamente ciò di cui ha bisogno l'OP.

Dalla sua home page di GitHub:

Il compilatore CoreRT può compilare un'applicazione .NET Core gestita in un eseguibile a file singolo nativo (specifico dell'architettura) facile da distribuire. Può anche produrre librerie dinamiche o statiche autonome che possono essere utilizzate da applicazioni scritte in altri linguaggi di programmazione.


1

La natura di .NET è quella di poter installare app che sono state compilate in MSIL, quindi da JIT o Ngen, MSIL viene compilato in codice nativo e memorizzato localmente in una cache. Non è mai stato concepito per la generazione di un vero file .exe nativo che può essere eseguito indipendentemente dal framework .NET.

Forse c'è qualche hack che fa questo, ma non mi sembra sicuro. Ci sono troppe dinamiche che richiedono il framework, come: caricamento dinamico dell'assembly, generazione di codice MSIL, ecc.


0

Il motivo principale per compilare in Native è proteggere i codici, altrimenti l'MSIL compilato è come distribuire i codici sorgente nella macchina del client.

NGEN si compila in nativo ma necessita anche di implementare codici IL, questo scopo è solo quello di ridurre il tempo di avvio ma è anche inutile.

CoreRt è la versione alpha e funziona solo con semplici app di tipo helloworld.

.Net Core compila in singoli file eseguibili ma non è nemmeno un exe nativo, questo è solo un file zippato di codici IL e decomprimerà i codici nella cartella temp durante l'esecuzione.

La mia semplice domanda da parte di Microsoft è: se RyuJIT può compilare IL in nativo al volo, perché non puoi compilare lo stesso IL prima del tempo (AOT).


"CoreRt è la versione alpha e funziona solo con semplici app di tipo helloworld." Questo non è vero: ci sono giochi su Steam (ad es. Streets4rage.com ) che sono più complessi di helloworld.
S Waye,

Ma CoreRT non può compilare alcuna applicazione Winform. Ho trovato un altro compilatore online che può compilare l'applicazione Winform ( dotnetnative.online )
Rahim Surani



-3

Penso che non sia possibile. Dovrai anche distribuire .NET FW. Se vuoi compilare l'app .NET in codice nativo, usa lo strumento NGen

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.