【发布时间】:2009-05-11 06:44:25
【问题描述】:
如何将 .NET exe 转换为 Win32 exe? (我没有代码) 目的是使用 wine 在 Linux 中运行应用程序。我认为 .NET exe 不能在 wine 中运行,我不想使用单声道。
【问题讨论】:
如何将 .NET exe 转换为 Win32 exe? (我没有代码) 目的是使用 wine 在 Linux 中运行应用程序。我认为 .NET exe 不能在 wine 中运行,我不想使用单声道。
【问题讨论】:
根据它是什么版本的 .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 compability in Wine
【讨论】:
这对您来说可能是一个困难的解决方案,但为了完整起见,我在这里提及它。
您可以使用 VMWare 的 Thinapp 包装一个 .net 应用程序。我相信这会产生一个 win32 可执行文件。
【讨论】:
也许它会在单声道下运行?
【讨论】:
使用带有静态库的提前编译器。 又名。单声道上的 mkbundle
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)
【讨论】:
mkbundle mkbundle --static test.exe -o test 可能更容易,而不必手动编译嵌入包装器:)
根本不可能。对于托管代码,您需要某种 VM 来运行。在 Linux 中,您可以使用 Mono 或 dotgnuportable.net。也许某些超高级版本的 wine 将能够运行 MS .net 框架?
【讨论】: