Wie kompiliere ich eine .NET-Anwendung zu nativem Code?

88

Wenn ich eine .NET-Anwendung auf einem Computer ausführen möchte, auf dem das .NET-Framework nicht verfügbar ist; Gibt es eine Möglichkeit, die Anwendung zu nativem Code zu kompilieren?

Niyaz
quelle

Antworten:

45

Microsoft hat einen Artikel beschrieben, wie Sie MSIL zu nativem Code kompilieren können

Sie können Ngen verwenden .

Der Native Image Generator (Ngen.exe) ist ein Tool, das die Leistung verwalteter Anwendungen verbessert. Ngen.exe erstellt native Images, bei denen es sich um Dateien handelt, die kompilierten prozessorspezifischen Maschinencode enthalten, und installiert sie im nativen Image-Cache auf dem lokalen Computer. Die Laufzeit kann native Images aus dem Cache verwenden, anstatt den Just-in-Time-Compiler (JIT) zum Kompilieren der ursprünglichen Assembly zu verwenden.

Leider benötigen Sie noch die Bibliotheken aus dem Framework, um Ihr Programm auszuführen. Ich kenne keine Funktion mit dem MS .Net Framework SDK, mit der Sie alle erforderlichen Dateien in einer einzigen ausführbaren Datei kompilieren können

Espo
quelle
1
Ich finde keinen anderen Grund, dies zu verwenden als Performances. Der CLR-Code kann weiterhin wie zuvor gelesen werden, und Sie benötigen weiterhin .NET. So enttäuschend, dass Microsoft kein Tool zur Verfügung gestellt hat, mit dem das meiner Meinung nach große Problem behoben werden kann (jeder kann Ihren High-Level-Code so anzeigen, wie er ist)
MasterMastic
Ich stimme Espo nicht zu. Denn der graue Text sagt "Runtime", was die CLR und damit das .NET Framework bedeutet, das ins Bild kommt, wie Chris zu Recht darauf hingewiesen hat. NGen Punkt ist jedoch wahr. Die Frage ist, ohne CLR / Runtime / .NET Framework sind alle gleich.
Lerner
1
Es ist Zeit, sich zu freuen, aber es sieht so aus, als würde das .net-Framework endlich einen nativen Compiler bekommen - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder
ILMerge deine ausführbare .NET-Datei und alles in ihrem Abhängigkeitsbaum dann Ngen, wenn du eine von .NET unabhängige ausführbare Datei willst .
24

RemoteSoft erstellt ein Tool, mit dem eine .NET-Anwendung zu einem Paket kompiliert wird, das ohne Installation von .NET ausgeführt werden kann. Ich habe keine Erfahrung damit:

RemoteSoft Salamander

Simon Steele
quelle
5
Das ist das einzige Tool, von dem ich je gehört habe, dass es dies ohne das Framework tun kann. Natürlich kostet es 1249 Dollar.
Slapout
3
Ich habe in den letzten Jahren ein paar Mal versucht, Informationen oder Bewertungen zu erhalten, aber sie senden meine E-Mails über Preise oder Demos nie zurück, sodass ich denke, dass ihr Produkt etwas verdächtig ist.
Codenheim
20

Wie in einigen anderen Antworten hier erwähnt, können Sie das .NET Native- Tool verwenden, um Ihre App in nativen Maschinencode zu kompilieren. Im Gegensatz zu diesen Antworten werde ich jedoch erklären, wie es geht.

Schritte:

  1. Installieren Sie das dotnet CLI- Tool (Command Line Interface), das Teil der neuen .NET Core-Toolchain ist. Wir werden dies verwenden, um unsere App zu kompilieren. Einen guten Artikel dazu finden Sie hier.

  2. Öffnen Sie eine Shell-Eingabeaufforderung und cddas Verzeichnis Ihrer App.

  3. Geben Sie Folgendes ein:

    dotnet compile --native

Das ist es! Wenn Sie fertig sind, wird Ihre App wie folgt in eine einzige Binärdatei kompiliert:

Native kompilierte .NET Core EXE

Es wird eine eigenständige ausführbare Datei sein; Keine PDBs, Assemblys oder Konfigurationsdateien enthalten (Hurra!).


Wenn Sie ein noch schnelleres Programm wünschen, können Sie alternativ Folgendes ausführen:

dotnet compile --native --cpp

Dadurch wird Ihr Programm mithilfe des C ++ - Codegenerators (im Gegensatz zu RyuJIT) optimiert, sodass Ihre App noch besser für AOT-Szenarien optimiert ist.

Weitere Informationen hierzu finden Sie im dotnet CLI GitHub Repo .

James Ko
quelle
Hinweis: Dies wird nur für Projekte unterstützt, die mit .NET Core erstellt wurden. (+1, obwohl)
Mahmoud Al-Qudsi
Sie haben das sehr wichtige Detail vergessen, dass .NET Native Windows 10 erfordert.
Elmue
19

Ich habe mehrere davon getestet und im Moment ist Xenocode Postbuild die einzige, die .NET 3.5 unterstützt und auch einen großartigen Virtualisierungsstapel hat

Mit ngen muss das .NET Framework noch installiert sein. Wenn Sie jedoch ein Tool als solches verwenden, wird der gesamte verwaltete Code in nativen Code kompiliert, sodass Sie ihn auf Computern ohne das Vorhandensein des Frameworks bereitstellen können.

Erick Sgarbi
quelle
11

Ja, mit Ngen , dem nativen Bildgenerator . Es gibt jedoch eine Reihe von Dingen, die Sie beachten müssen:

  • Sie benötigen weiterhin die CLR, um Ihre ausführbare Datei auszuführen.
  • Die CLR optimiert Ihre Assemblys nicht dynamisch basierend auf der Umgebung, in der sie ausgeführt werden (z. B. 486 vs. 586 vs. 686 usw.).

Alles in allem lohnt es sich nur, Ngen zu verwenden, wenn Sie die Startzeit Ihrer Anwendung reduzieren müssen.

Chris Zwiryk
quelle
9

Sie können! Sie sind jedoch auf .NET 1.1 beschränkt (keine Generika für Sie): Mono Ahead-Of-Time-Kompilierung (AOT)

Dies bedeutet jedoch, dass das Kompilieren wirklich nativ ist, sodass Sie nicht mehr eine einzelne Bytecode-Assembly bereitstellen können, sondern eine pro Plattform benötigen.

Es wurde ursprünglich entwickelt, weil es kein .NET oder Mono für das iPhone gibt. So haben sie MonoTouch hergestellt.

Camilo Martin
quelle
6

Sie können dies mit der neuen Vorkompilierungstechnologie namens .NET Native tun. Überprüfen Sie es hier: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

Derzeit ist es nur für Windows Store Apps verfügbar. Es führt eine Einzelkomponentenverknüpfung durch. Daher werden .NET Framework-Bibliotheken statisch mit Ihrer App verknüpft. Alles wird zu nativen kompiliert und IL-Assemblys werden nicht mehr bereitgestellt. Apps laufen nicht gegen CLR, sondern mit einer reduzierten, optimierten Laufzeit namens Managed Runtime (Mrt.dll).

Wie oben erwähnt, verwendete NGEN ein Mix-Kompilierungsmodell und stützte sich für dynamische Szenarien auf IL und JIT. .NET Native verwendet kein JIT, unterstützt jedoch verschiedene dynamische Szenarien. Code-Autoren müssten Runtime-Anweisungen verwenden , um dem .NET Native-Compiler Hinweise zu den dynamischen Szenarien zu geben, die sie unterstützen möchten.

m_eric
quelle
1
+1 - Ich habe Jahre darauf gewartet. Ich hoffte, dass die Verliebtheit der Welt in die "virtuelle Maschine" früher ihren Lauf nehmen würde, aber es passiert trotzdem. Ich gehe davon aus, dass die native Zusammenstellung wieder aufleben wird. Wie Sie sagten, ist es im Moment für Windows Store Apps, aber es ist nur eine Frage der Zeit, bis der Desktop-Markt Gleichbehandlung verlangt.
Codenheim
4

Sie können ngen.exe verwenden, um ein natives Image zu generieren, aber Sie müssen auch den ursprünglichen nicht nativen Code verteilen, und das Framework muss weiterhin auf dem Zielcomputer installiert sein.

Was Ihr Problem nicht wirklich löst.

Matt Bishop
quelle
2

2019 Antwort: Verwenden Sie Dotnet / Corert . Es kann .NET Core-Projekte in eigenständige .exeDateien kompilieren . Keine Abhängigkeiten (außer für Systembibliotheken wie kernel32.dll). Ich wette, genau das braucht das OP.

Von seiner GitHub-Homepage:

Der CoreRT-Compiler kann eine verwaltete .NET Core-Anwendung in eine native (architekturspezifische) ausführbare Einzeldatei-Datei kompilieren, die einfach bereitzustellen ist. Es können auch eigenständige dynamische oder statische Bibliotheken erstellt werden, die von Anwendungen verwendet werden können, die in anderen Programmiersprachen geschrieben sind.

brk
quelle
1

Die Natur von .NET besteht darin, Apps installieren zu können, die zu MSIL kompiliert wurden. Anschließend wird MSIL entweder von JIT oder Ngen zu nativem Code kompiliert und lokal in einem Cache gespeichert. Es war nie beabsichtigt, eine echte native EXE-Datei zu generieren, die unabhängig vom .NET Framework ausgeführt werden kann.

Vielleicht gibt es einen Hack, der das macht, aber es klingt für mich nicht sicher. Es gibt zu viele Dynamiken, die das Framework erfordern, z. B. dynamisches Laden von Assemblys, Generieren von MSIL-Code usw.

Spoulson
quelle
0

Der Hauptgrund für die Kompilierung in Native ist die Sicherung Ihrer Codes. Andernfalls entspricht die kompilierte MSIL der Bereitstellung der Quellcodes auf dem Client-Computer.

NGEN kompiliert in native, muss aber auch IL-Codes bereitstellen. Dieser Zweck dient nur dazu, die Startzeit zu verkürzen, ist aber auch nutzlos.

CoreRt ist eine Alpha-Version und funktioniert nur mit einfachen Apps vom Typ Helloworld.

.Net Core wird in einzelne ausführbare Dateien kompiliert, ist aber auch keine native exe. Dies ist nur eine komprimierte Datei mit IL-Codes und entpackt die Codes während der Ausführung in den temporären Ordner.

Meine einfache Frage von Microsoft lautet: Wenn RyuJIT IL im laufenden Betrieb in native kompilieren kann, warum können Sie dann nicht dieselbe IL vorab kompilieren (AOT)?

Rahim Surani
quelle
"CoreRt ist eine Alpha-Version und funktioniert nur mit einfachen Apps vom Typ Helloworld." Dies ist nicht wahr - es gibt Spiele auf Steam (z. B. street4rage.com ), die komplexer sind als helloworld.
S Waye
-3

Ich denke es ist nicht möglich. Sie müssen auch .NET FW verteilen. Wenn Sie die .NET-App in nativen Code kompilieren möchten, verwenden Sie das NGen- Tool

aku
quelle