【问题标题】:How to compile a .NET application to native code?如何将 .NET 应用程序编译为本机代码?
【发布时间】:2010-09-07 22:11:28
【问题描述】:

假设我想在 .NET 框架不可用的机器上运行 .NET 应用程序;有什么办法可以将应用程序编译成原生代码?

【问题讨论】:

    标签: .net compilation native-code


    【解决方案1】:

    Microsoft 有一篇文章描述了如何Compile MSIL to Native Code

    您可以使用Ngen

    本机图像生成器 (Ngen.exe) 是一种提高 托管应用程序的性能。 Ngen.exe 创建本机映像,它 是包含编译的文件 特定于处理器的机器代码,以及 将它们安装到本机映像中 缓存在本地计算机上。这 运行时可以使用来自 使用即时缓存代替 (JIT) 编译器编译原始 组装。

    不幸的是,您仍然需要框架中的库才能运行您的程序。我所知道的 MS .Net 框架 SDK 没有任何功能可以让您将所有必需的文件编译成单个可执行文件

    【讨论】:

    • 除了表演之外,我找不到任何其他理由使用它。仍然可以像以前一样读取 CLR 代码,并且您仍然需要 .NET。令人失望的是,微软没有提供可以解决我认为是大问题的工具(任何人都可以查看您的高级代码)
    • 我不同意 Espo。因为,灰色的文本表示“运行时”,这意味着 CLR,因此 .NET 框架,正如 Chris 正确指出的那样。但是,NGen 的观点是正确的。问题是,不使用 CLR/Runtime/.NET Framework 都是一样的。
    • 是时候兴奋起来了,看起来.net 框架终于有了一个原生编译器 - msdn.microsoft.com/en-US/vstudio/dotnetnative
    • ILMerge 您的 .NET 可执行文件及其依赖关系树中的所有内容,如果您想要一个可执行文件独立于 .NET,则为 Ngen。
    【解决方案2】:

    正如这里的一些其他答案所提到的,您可以使用 .NET Native 工具将您的应用程序编译为本机机器代码。然而,与这些答案不同的是,我将解释如何做到这一点。

    步骤:

    1. 安装 dotnet CLI(命令行界面)工具,它是新的 .NET Core 工具链的一部分。我们将使用它来编译我们的应用程序;你可以找到一篇关于它的好文章here.

    2. 打开一个 shell 提示符并 cd 进入您的应用目录。

    3. 输入这个:

      dotnet compile --native
      

    就是这样!完成后,您的应用将被编译为单个二进制文件,如下所示:

    它将是一个独立的可执行文件;不包含 PDB、程序集或配置文件(万岁!)。


    或者,如果你想要一个更快的程序,你可以运行这个:

    dotnet compile --native --cpp
    

    这将使用 C++ 代码生成器(而不是 RyuJIT)优化您的程序,因此您的应用针对 AOT 场景更加优化。

    您可以在 dotnet CLI GitHub repo 找到更多信息。

    【讨论】:

    • 注意:这仅支持使用 .NET Core 构建的项目。 (不过,+1)
    • 您忘记了 .NET Native 需要 Windows 10 的非常重要的细节。
    • 看起来不适用于 .net core 3.1 任何更新?
    【解决方案3】:

    RemoteSoft 制作了一个工具,可以将 .NET 应用程序编译成可以在不安装 .NET 的情况下运行的包。我没有任何经验:

    RemoteSoft Salamander

    【讨论】:

    • 这是我听说过的唯一一个不需要框架就可以做到的工具。当然,它的价格是 1249 美元。
    • 过去几年我尝试了几次,以获取信息或评估,但他们从未回复我有关定价或演示的电子邮件,所以我认为他们的产品可能有点可疑。
    【解决方案4】:

    Microsoft 已宣布其 .NET Native Preview 将允许在不安装框架的情况下运行 .NET 应用程序。

    看一看:http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx

    常见问题解答:http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx

    您可以从这里下载 Microsoft .NET Native for VS2013:http://msdn.microsoft.com/en-US/vstudio/dotnetnative

    【讨论】:

      【解决方案5】:

      我已经测试了其中的几个,目前唯一一个支持 .NET 3.5 并且具有出色的虚拟化堆栈的是 Xenocode Postbuild

      使用 ngen,您仍然需要安装 .NET 框架,但使用这样的工具,您的所有托管代码都会编译为本机代码,因此您可以将其部署到没有框架存在的机器上。

      【讨论】:

        【解决方案6】:

        是的,使用原生图像生成器 Ngen。但是,您需要注意一些事项:

        • 您仍然需要 CLR 来运行您的可执行文件。
        • CLR 不会根据其运行的环境(例如 486 与 586 与 686 等)动态优化您的程序集

        总而言之,只有在您需要减少应用程序的启动时间时才值得使用 Ngen。

        【讨论】:

          【解决方案7】:

          你可以!但是,您仅限于 .NET 1.1(没有适合您的泛型): Mono Ahead-Of-Time compilation (AOT)

          然而,这意味着编译是真正原生的,因此您将无法再部署一个单一的字节码程序集,您需要每个平台一个。

          最初设计它是因为没有适用于 iPhone 的 .NET 或 Mono,所以这就是他们制作 MonoTouch 的方式。

          【讨论】:

            【解决方案8】:

            您可以使用称为 .NET Native 的新预编译技术来做到这一点。在这里查看:http://msdn.microsoft.com/en-US/vstudio/dotnetnative

            目前它仅适用于 Windows 应用商店应用。它执行单个组件链接。因此 .NET Framework 库静态链接到您的应用程序中。一切都编译为本机,不再部署 IL 程序集。应用不针对 CLR 运行,而是针对称为托管运行时 (Mrt.dll) 的精简优化运行时

            如上所述,NGEN 使用混合编译模型并依赖 IL 和 JIT 处理动态场景。 .NET Native 不使用 JIT,但它支持各种动态场景。代码作者需要利用Runtime Directives 向.NET Native 编译器提供他们希望支持的动态场景的提示。

            【讨论】:

            • +1 - 我已经等了好几年了。我希望世界对“虚拟机”的迷恋能早日结束,但无论如何,它正在发生。我预计我们即将看到原生编译的复兴。正如您所说,目前是针对 Window 的 Store Apps,但桌面市场要求平等对待只是时间问题。
            【解决方案9】:

            您可以使用 ngen.exe 生成原生镜像您仍然需要分发原始的非原生代码,并且仍然需要安装框架在目标机器上。

            这并不能解决你的问题,真的。

            【讨论】:

              【解决方案10】:

              2019 答案:使用dotnet/corert。它可以将 .NET Core 项目编译成独立的 .exe 文件。没有依赖项(kernel32.dll 等系统库除外)。我敢打赌这正是 OP 所需要的。

              来自其 GitHub 主页:

              CoreRT 编译器可以将托管的 .NET Core 应用程序编译为易于部署的本机(特定于架构)单文件可执行文件。它还可以生成独立的动态或静态库,供以其他编程语言编写的应用程序使用。

              【讨论】:

              【解决方案11】:

              .NET 的本质是能够安装已编译为 MSIL 的应用程序,然后通过 JIT 或 Ngen,将 MSIL 编译为本机代码并存储在本地缓存中。它从来没有打算生成一个可以独立于 .NET 框架运行的真正的本机 .exe。

              也许有一些黑客可以做到这一点,但对我来说听起来并不安全。需要框架的动态太多了,比如:动态程序集加载、MSIL代码生成等。

              【讨论】:

                【解决方案12】:

                从 2021 年起,您可以使用 NativeAOT(以前称为 (CoreRT)[https://github.com/dotnet/corert])。

                这项技术有点限制,因为你不能过多地依赖反射,但总的来说你可以用它编译应用程序的范围。 Web 应用、WinForms 应用、控制台应用。

                您需要做的就是添加到您的项目文件中

                <ItemGroup>
                  <PackageReference Include="Microsoft.DotNet.ILCompiler" Version="7.0.0-*" />
                </ItemGroup>
                

                并像这样将dotnet-experimental Nuget 提要添加到您的 nuget.config 中

                <?xml version="1.0" encoding="utf-8"?>
                <configuration>
                 <packageSources>
                    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
                    <clear />
                    <add key="dotnet-public" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json" />
                    <add key="dotnet-experimental" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json" />
                 </packageSources>
                </configuration>
                

                您可以针对 .NET 5 应用程序,但随着 .NET 6 中的 ILTrim 改进,越来越多的代码将准备好进行本机编译。

                对于简单的应用程序,您可以尝试使用BFlat,这可能会给您带来更好的结果。

                【讨论】:

                  【解决方案13】:

                  编译成Native的主要原因是为了保护你的代码,否则编译的MSIL就像在客户端机器上部署源代码一样。

                  NGEN编译成native但也需要部署IL代码,这个目的只是为了减少启动时间,但也没有用。

                  CoreRt 是 alpha 版本,仅适用于简单的 helloworld 类型的应用程序。

                  .Net Core 编译成单个可执行文件,但它也不是原生 exe,这只是 IL 代码的压缩文件,它会在运行时将代码解压缩到 temp 文件夹中。

                  我的来自 Microsoft 的简单问题是,如果 RyuJIT 可以即时将 IL 编译为本机,那么为什么不可以提前 (AOT) 编译相同的 IL。

                  【讨论】:

                  • "CoreRt 是 alpha 版本,仅适用于简单的 helloworld 类型的应用程序。"这不是真的 - Steam 上有比 helloworld 更复杂的游戏(例如 streets4rage.com)。
                  • 但 CoreRT 无法编译任何 Winform 应用程序。我找到了另一个可以编译 Winform 应用程序的在线编译器 (dotnetnative.online)
                  【解决方案14】:

                  看起来像 net core RT 可行的解决方案; 很快所有应用程序都将转到 .net 核心; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://docs.microsoft.com/en-us/archive/msdn-magazine/2018/november/net-core-publishing-options-with-net-core

                  未测试可能与旧的 win .net sdk 可能类似。

                  【讨论】:

                    【解决方案15】:

                    试试这个 (http://www.dotnetnative.online/) 将 .net 编译的 exe 编译成本机 exe,我试过这个,它新但很好。

                    【讨论】:

                    • 请把链接的内容贴在答案里。
                    【解决方案16】:

                    我认为这是不可能的。您还需要分发 .NET FW。如果您想将 .NET 应用程序编译为本机代码,请使用 NGen tool

                    【讨论】:

                      猜你喜欢
                      • 2011-01-16
                      • 1970-01-01
                      • 2010-09-16
                      • 1970-01-01
                      • 2021-12-30
                      • 2013-11-06
                      • 2011-09-06
                      • 2020-03-11
                      • 2010-09-13
                      相关资源
                      最近更新 更多