2009-05-11 16 views

Antwort

3

Je nachdem, welche Version von .NET es ist und welche Bibliotheken es verwendet, könnten Sie versuchen, es unter Mono auszuführen, ohne die IL auf nativen Code zu kompilieren.

die meisten Linux-Distributionen haben es unter ihren Paket-Management-Systemen zur Verfügung.

sehen: http://www.mono-project.com/Main_Page für mehr Details

die Alternative ist NGen zu verwenden, um die Compilierung (http://blogs.msdn.com/clrcodegeneration/archive/2007/09/15/to-ngen-or-not-to-ngen.aspx) zu tun. aber ich bin mir nicht sicher, dass das unter WEIN funktionieren würde.

+0

Alles, was ich habe, ist die exe. Ich habe nicht den Code, um mit NGen zu kompilieren. – devnull

+0

In der Zwischenzeit werde ich versuchen, die .NET-Exe in Wein zu laufen. – devnull

+0

NGen kompiliert IL zur Bearbeitung von Anweisungen. Es verwandelt die .NET-Abhängigkeiten auf wundersame Weise in native Win32-Abhängigkeiten oder verwaltete Heapspeicher in nicht verwalteten nativen Heapspeicher.Sie benötigen weiterhin die CLR, um ein NGen-Modul auszuführen. @devnull: Sie benötigen keinen Quellcode, um NGen gegen ein Modul auszuführen, ähnlich wie Sie keinen Quellcode zum Ausführen des JIT-Compilers benötigen. – IInspectable

0

Einfach nicht möglich. Für verwalteten Code benötigen Sie eine Art von VM zum Ausführen. Unter Linux können Sie Mono oder dotgnu portable.net verwenden. Vielleicht kann eine etwas hochentwickelte Version von Wine das MS.net-Framework einmal ausführen?

1

Vielleicht läuft es unter Mono?

+0

Es ist eine WinForm Account Manager-Anwendung, die eine Excel-Datei an den Eingängen basierten Prozesse. – devnull

+1

OK, dann denke ich, es wird schwierig sein, es unter Mono laufen zu lassen (angesichts der Excel-Abhängigkeit). –

2

Je nach Framework-Version kann es mit Wine arbeitet .Net Framework compability in Wine

+0

Ich bestätige, dass: Ich habe eine ziemlich große Anwendung mit mehreren Third-Party-Assemblys und P/Aufrufe aufrufen, und es funktioniert gut mit Wine + Mono –

2

Dies ist wahrscheinlich eine schwierige Lösung für Sie, aber ich erwähne es hier im Interesse der Vollständigkeit.

Sie können angeblich eine .net-Anwendung mit VMWare Thinapp umbrechen. Ich glaube, das führt zu einer ausführbaren win32-Datei.

https://www.vmware.com/products/thinapp

1

Verwenden Sie die Voraus-Time-Compiler mit statischen Bibliotheken. A.k.a. mkbundle on mono

Mono kommt mit einer Kommandozeilen-Schnittstelle zum Mono-JIT-Compiler, um AOT (vor der Zeit) zu kompilieren. Sie können dies verwenden, um eine statisch verknüpfte .o-Datei zu erstellen, die Sie dann mit einem trivialen Wrapper ausführen können, der den Mono-Laufzeit-Embedder mit der Objektdatei aufruft. Wenn Sie dann statisch auf die Monobibliotheken verweisen, haben Sie keine externen Abhängigkeiten zu einem installierten .NET-Framework.

Natürlich werden Sie alle statisch gelinkte Bibliotheken versenden oder mit einem hughe exe am Ende aber hey, es ist, was Sie für

fragte
mono --aot=static 

      static Create an ELF object file (.o) which can be statically linked into an executable when embedding the mono runtime. When this option is used, the object 
       file needs to be registered with the embedded runtime using the mono_aot_register_module function which takes as its argument the mono_aot_module_<ASSEM‐ 
       BLY NAME>_info global symbol from the object file: 

       extern void *mono_aot_module_hello_info; 

       mono_aot_register_module (mono_aot_module_hello_info); 

Während ich dies auf Linux verwendet wird, bin ich nicht Ganz sicher, dass es bei Fenstern genauso gut funktioniert.

aktualisieren Remembered das mkbundle Werkzeug:

[email protected]:~$ mkbundle --static test.exe -o hello 
OS is: Linux 
Note that statically linking the LGPL Mono runtime has more licensing restrictions than dynamically linking. 
See http://www.mono-project.com/Licensing for details on licensing. 
Sources: 1 Auto-dependencies: False 
    embedding: /home/sehe/test.exe 
Compiling: 
as -o temp.o temp.s 
cc -o hello -Wall `pkg-config --cflags mono` temp.c `pkg-config --libs-only-L mono` -Wl,-Bstatic -lmono -Wl,-Bdynamic `pkg-config --libs-only-l mono | sed -e "s/\-lmono //"` temp.o 
Done 
[email protected]:~$ ./hello 
hello world 

[email protected]:~$ ldd hello 
linux-gate.so.1 => (0xb7875000) 
libdl.so.2 => /lib/libdl.so.2 (0xb785f000) 
libpthread.so.0 => /lib/libpthread.so.0 (0xb7845000) 
libm.so.6 => /lib/libm.so.6 (0xb781e000) 
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb7819000) 
librt.so.1 => /lib/librt.so.1 (0xb7810000) 
libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0xb7741000) 
libc.so.6 => /lib/libc.so.6 (0xb75e4000) 
/lib/ld-linux.so.2 (0xb7876000) 
libpcre.so.3 => /lib/libpcre.so.3 (0xb75af000) 
+0

Ah, ich erinnere mich gerade, dass ist wahrscheinlich einfacher zu verwenden 'mkbundle mkbundle --static Test .exe -o test' direkt, anstatt den Einbettungs-Wrapper manuell kompilieren zu müssen :) – sehe

+0

Siehe auch hier: http://stackoverflow.com/questions/1948113/mono-mkbundle-windows – sehe

Verwandte Themen