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?
quelle
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?
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
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
quelle
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:
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.
Öffnen Sie eine Shell-Eingabeaufforderung und
cd
das Verzeichnis Ihrer App.Geben Sie Folgendes ein:
Das ist es! Wenn Sie fertig sind, wird Ihre App wie folgt in eine einzige Binärdatei kompiliert:
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:
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 .
quelle
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.
quelle
Microsoft hat seine .NET Native Preview angekündigt , mit der .NET-Anwendungen ausgeführt werden können, ohne dass das Framework installiert ist.
Schauen Sie sich das an: 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
Sie können Microsoft .NET Native für VS2013 hier herunterladen: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
quelle
Ja, mit Ngen , dem nativen Bildgenerator . Es gibt jedoch eine Reihe von Dingen, die Sie beachten müssen:
Alles in allem lohnt es sich nur, Ngen zu verwenden, wenn Sie die Startzeit Ihrer Anwendung reduzieren müssen.
quelle
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.
quelle
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.
quelle
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.
quelle
2019 Antwort: Verwenden Sie Dotnet / Corert . Es kann .NET Core-Projekte in eigenständige
.exe
Dateien kompilieren . Keine Abhängigkeiten (außer für Systembibliotheken wiekernel32.dll
). Ich wette, genau das braucht das OP.Von seiner GitHub-Homepage:
quelle
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.
quelle
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)?
quelle
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
quelle