Как конвертировать.NET EXE в родной Win32 EXE?
Как я могу конвертировать.NET EXE в Win32 EXE? (У меня нет кода) Цель - запустить приложение в Linux, используя wine. Я предполагаю, что.NET EXE не может быть запущен в Wine, и я не хочу использовать моно.
6 ответов
В зависимости от того, какая это версия.NET и какие библиотеки она использует, вы можете попробовать запустить ее под Mono без компиляции IL-кода до нативного кода.
большинство дистрибутивов Linux имеют его в своих системах управления пакетами.
см.: http://www.mono-project.com/Main_Page для получения более подробной информации
альтернатива - использовать NGen для компиляции ( http://blogs.msdn.com/clrcodegeneration/archive/2007/09/15/to-ngen-or-not-to-ngen.aspx). но я не уверен, что это будет работать под WINE.
В зависимости от версии вашего фреймворка он может работать с совместимостью Wine .Net Framework в Wine
Возможно, это сложное решение для вас, но я упомяну это здесь в интересах полноты.
Вы можете предположительно обернуть приложение.net с Thinapp VMWare. Я считаю, что это приводит к выполнению Win32.
Используйте опережающий компилятор со статическими библиотеками. Ака мкбандл на моно
Mono поставляется с интерфейсом командной строки для моно JIT-компилятора для компиляции AOT (заранее). Вы можете использовать это для создания статически связанного.o, который затем можно запустить с помощью тривиальной оболочки, которая вызывает моно-кодировщик времени выполнения с объектным файлом. Если вы статически создадите ссылку на моно-библиотеки, у вас не будет никаких внешних зависимостей от установленной платформы.NET.
Конечно, вам придется отгрузить все статически связанные библиотеки или в итоге получить огромный exe, но эй, это то, что вы просили
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);
Хотя я использовал это на Linux, я не совсем уверен, что он работает на Windows одинаково хорошо.
Обновление Вспомнил инструмент mkbundle:
sehe@sehelap:~$ 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
sehe@sehelap:~$ ./hello
hello world
sehe@sehelap:~$ 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)
Просто не возможно. Для управляемого кода вам нужна какая-то виртуальная машина. В Linux вы можете использовать Mono или dotgnu portable.net. Может быть, какая-то гипер-продвинутая версия wine сможет когда-нибудь запустить среду MS .net?