【问题标题】:How to convert a .NET exe to native Win32 exe?如何将 .NET exe 转换为本机 Win32 exe?
【发布时间】:2009-05-11 06:44:25
【问题描述】:

如何将 .NET exe 转换为 Win32 exe? (我没有代码) 目的是使用 wine 在 Linux 中运行应用程序。我认为 .NET exe 不能在 wine 中运行,我不想使用单声道。

【问题讨论】:

    标签: c# winapi


    【解决方案1】:

    根据它是什么版本的 .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 下工作。

    【讨论】:

    • 我只有exe文件。我没有使用 NGen 编译的代码。
    • 同时我会尝试在 wine 中运行 .NET exe。
    • NGen 将 IL 编译为机器指令。它不会奇迹般地将 .NET 依赖项转换为本机 Win32 依赖项,或将托管堆内存转换为非托管本机堆内存。您仍然需要 CLR 来运行 NGen 模块。 @devnull:您不需要源代码来针对模块运行 NGen,就像您不需要源代码来运行 JIT 编译器一样。
    【解决方案2】:

    根据您的框架版本,它可能适用于 Wine .Net Framework compability in Wine

    【讨论】:

    • 我确认:我有一个相当大的应用程序,它使用了几个第三方程序集和 P/invoke 调用,它与 Wine + Mono 一起工作正常
    【解决方案3】:

    这对您来说可能是一个困难的解决方案,但为了完整起见,我在这里提及它。

    您可以使用 VMWare 的 Thinapp 包装一个 .net 应用程序。我相信这会产生一个 win32 可执行文件。

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

    【讨论】:

      【解决方案4】:

      也许它会在单声道下运行?

      【讨论】:

      • 这是一个 WinForm Account Manager 应用程序,它根据输入处理 Excel 文件。
      • 好的,那么我想让它在单声道下运行会很棘手(考虑到excel依赖)。
      【解决方案5】:

      使用带有静态库的提前编译器。 又名。单声道上的 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 可能更容易,而不必手动编译嵌入包装器:)
      【解决方案6】:

      根本不可能。对于托管代码,您需要某种 VM 来运行。在 Linux 中,您可以使用 Mono 或 dotgnuportable.net。也许某些超高级版本的 wine 将能够运行 MS .net 框架?

      【讨论】:

        猜你喜欢
        • 2020-11-23
        • 1970-01-01
        • 2010-11-23
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多