2009-11-22 6 views
19

Es gibt ein vollständig in C# geschriebenes Programm, das auf .NET Framework 2.0 abzielt. Gibt es einen Weg, wie ich Managed EXE irgendwie zu einem nativen kompilieren konnte, damit es .NET-agnostisch sein konnte? Ich weiß, dass es wahrscheinlich kommerzielle Produkte für diesen Zweck gibt ... aber sie sind ein bisschen teuer.Konvertieren von .NET App in nativen x86-Code

Das Problem ist, dass wir das Programm auf Computern mit Windows XP ohne .NET Framework installieren. Es gibt auch eine Anforderung, dass die Programmgröße 500Kb (maximal 1 MB) nicht überschreiten darf, da es vom Webserver heruntergeladen wird (jetzt ist die Größe 255 KB). Aus diesem Grund können wir keine vollwertigen .NET-FX (oder auch nur eine reduzierte) an die heruntergeladene Programmdatei anhängen.

Offensichtlich ist es ein schrecklicher Softwareentwicklungsfehler, der früher erkannt und vermieden werden sollte, damit wir native Technologien wie C++ stattdessen verwenden konnten.

Wir haben jetzt versucht, Novel Mono - eine Open-Source-Implementierung von .NET Framework für Linux, MAC und Windows. Mono besteht aus C# -Compiler-, IDE-, Runtime- (CLR) und Klassenbibliotheksassemblys (wie System.dll und mscorlib.dll - ähnlich wie die in GAC installierten .NET-Klassenbibliotheksassemblys). Wir haben versucht, CLR-Dateien zu finden und diese zusammen mit unserer Programmdatei und einigen Assemblys zu versenden. Auf diese Weise kann das Programm aufgerufen werden, indem "mono program.exe" (Eingabeaufforderung) auf dem Computer eines Benutzers ausgeführt wird. Zusätzlich zu den Unannehmlichkeiten einer solchen Verwendung für die Endbenutzer CLR-Dateien (mono.exe und mono.dll) entpuppte sich insgesamt etwa 2,5 Mb, die viel größer ist als die gewünschten 500 Kb oder sogar 1 Mb.

So haben wir keine andere Wahl, als unser .NET-App zu einem nativen eines von einem Compiler zu übersetzen, aber es bleibt die Frage - was Compiler sollten wir verwenden und wo könnten wir einen finden ...

Jetzt bin ich auf ein Singularity OS Project von Microsoft Research gestoßen. Es ist ein Open-Source-Betriebssystem, das in verwaltetem Code (zumindest teilweise) geschrieben ist. Das Singularity-Betriebssystem enthält einen Bartok-Compiler, den das Betriebssystem verwendet, um ein verwaltetes Programm in ein natives zu konvertieren (x86 32 Bit). Es sollte angemerkt werden, dass Bartok nicht alle Aspekte von .NET 2.0 in einen systemeigenen Code übersetzen kann, aber die meisten davon. Allerdings habe ich noch nicht gelernt, wie man die Singularity verwendet ...

Ich wäre Ihnen sehr dankbar, wenn Sie mir einige nützliche Tipps und Ratschläge zu dem Problem geben könnten, Ihre eigenen Erfahrungen mit Singularity OS und Bartok Compiler oder eine andere Annäherung an das Problem, das ich übersehen habe und Wege, es zu lösen.

Vielen Dank im Voraus!

Schließlich Monos Full AOT-Funktion (auf Callum Rogers Ratschlag) Ich habe es geschafft, eine Programm.exe.dll, die eine CLI-Header fehlt. So sieht es für mich wie eine native DLL aus. Jedoch kann ich nicht herausfinden, wie man diese DLL in exe umwandelt oder es betriebsbereit macht. Auch diese DLL scheint keine Funktionen von Interesse wie Hauptfunktion zu offenbaren.

+3

les Betrogene: http://stackoverflow.com/questions/45702/is-there-some-way-to-compile-a-net-application-to-native- Code –

+0

Versuchen Sie, diese plattformübergreifende Plattform zu erstellen, oder entfernen Sie einfach die Abhängigkeiten von Framework-Bibliotheken? –

+0

Ich versuche nur, die Abhängigkeiten von .NET Framework zu entfernen, damit es unter Windows XP ohne .NET FX ausgeführt werden kann. – Vlad

Antwort

1

nicht wirklich eine Lösung für .NET auf native Konvertierung, aber vielleicht hilft: http://www.yoda.arachsys.com/csharp/faq/#framework.required

+0

Danke. Ich werde auf die in der Liste erwähnten Programme achten. Soweit ich weiß, diese Programme sind nicht sehr billig, aber es kann eine erhebliche Nutzlast sein, nämlich die Größe unserer ausführbaren Datei wird die gewünschte Zahl überschreiten. – Vlad

+0

der Link scheint tot zu sein. –

0

Nicht ganz sicher, dass es viel Sie neben sorgfältig die Anwendung neu zu schreiben tun können. Um den bereits belastenden Prozess zu erleichtern, könnten Sie die .NET-Anwendung mit Reflector (in Microsoft C++) zerlegen und diese als Basis verwenden, um verwaltete C++ - Referenzen nur durch native zu ersetzen.

+1

Ich hoffe, dass es einen Weg gibt, um das Umschreiben der gesamten App in C++ zu vermeiden, da es ziemlich viel Zeit und vor allem Zeit zum Debuggen kostet. – Vlad

9

Schauen Sie sich die AOT (Ahead of Time) -Kompilierung aus dem Mono-Projekt an.Dies kompiliert Ihr verwaltetes Projekt in eine native EXE- oder Elf-Programmdatei (je nachdem, welches System Sie als Ziel haben), dass die JIT nicht benötigt. Dies ist die Technik, die verwendet wird, um Mono-Apps auf das iPhone zu bringen (wo das JIT/Framework nicht erlaubt ist) und hat außerdem die Vorteile schnellerer Startzeiten, geringerer Speicherauslastung und es macht es für Leute schwerer, Ihren Code zu dekompilieren. Du hast gesagt, du benutzt bereits Mono, also sollte es kompatibel sein.

Lesen Sie darüber at the mono-project.com website und at Miguel de Icaza's blog (und iPhone info).

Beachten Sie, dass keine dynamischen Code oder generische Schnittstellen wie

interface IFoo<T> { 
... 
    void SomeMethod(); 
} 

verwenden können, und Sie werden die DLLs aller Bibliotheken, die Sie verwenden, kompilieren müssen.

PS: Stellen Sie sicher, dass Sie "Full" AOT für Ihr Problem verwenden.

+0

Vielen Dank für Ihre Antwort. Es scheint, dass ich zuvor versucht habe, eine Beispiel-Hello-World-Assembly auf diese Weise zu kompilieren, aber es ist fehlgeschlagen. Möglicherweise, weil [Mono Full AOT] nicht mit jedem Prozessor kompatibel ist (ich habe Intel Core 2 Duo). Allerdings werde ich Full AOT gründlich untersuchen, da ich wahrscheinlich etwas falsch gemacht habe – Vlad

+0

Full AOT funktioniert mindestens für x86 und x86-64, sowie die ARM und PPC-Prozessoren. – Gonzalo

+0

Endlich habe ich es geschafft, eine Programm.exe.dll zu erzeugen, die keinen CLI-Header hat. Es sieht also wie eine native DLL aus. Allerdings kann ich nicht herausfinden, wie man diese DLL in exe konvertiert oder es funktionsfähig macht. Auch diese DLL scheint keine Funktionen von Interesse, wie die Hauptfunktion – Vlad

3

Es gibt ein Projekt namens CrossNet, das .NET-Assemblys analysiert und nicht verwalteten C++ - Code generiert, der in jedem Standardcompiler kompiliert werden kann.

+0

Analysiert es Baugruppen oder Code? Es tut mir leid zu fragen, aber das Projekt scheint mir verwirrend. –

8

2017 aktualisieren

Als @jenix's comment, ist .NET india nur für Windows Store Apps (UWP). Nach 3 Jahren der Ankündigung ist dies immer noch wahr, .net native für Desktop kann von Microsoft gelöscht werden. Also diese Antwort ist nicht mehr anwendbar.

Für Konsolenanwendungen können Sie .net core Self-contained deployments (SCD) verwenden. Selbst für eine Hallo Welt App wird Ihr Paket 50MB +. Sie müssen trotzdem VC-Laufzeit installieren.

========

Microsoft .NET india Vorschau auf Build-2014 angekündigt

Mit dem .NET india Developer Preview, Apps auf Geräten wie voll Endbenutzer erhalten Einsatz eigenständiger nativ kompilierter Code und keine Abhängigkeit von .NET Framework auf dem Zielgerät/der Zielmaschine. Also kein .NET Framework auf dem Zielrechner mit .NET Native erforderlich.

Announcing .NET Native Preview
Microsoft .NET Native

+3

.NET Native ist nur für Windows Store Apps obwohl .. – Jenix

+0

@JenixGuy Ja, nach 2 Jahren. – prime23