如何将.NET应用程序编译为本机代码?

时间:2008-09-05 12:46:25

标签: .net compilation native-code

如果我想在.NET框架不可用的机器上运行.NET应用程序;有没有办法将应用程序编译为本机代码?

16 个答案:

答案 0 :(得分:43)

Microsoft有一篇文章介绍了如何Compile MSIL to Native Code

您可以使用Ngen

  

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

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

答案 1 :(得分:23)

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

RemoteSoft Salamander

答案 2 :(得分:19)

我已经测试了其中的几个,此时唯一一个支持.NET 3.5并且还有一个很棒的虚拟化堆栈是Xenocode Postbuild

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

答案 3 :(得分:18)

微软宣布推出 .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

答案 4 :(得分:17)

正如此处提到的其他一些答案,您可以使用.NET Native工具将您的应用编译为本地机器代码。然而,与那些答案不同,我将解释如何来完成它。

步骤:

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

  2. 打开shell提示并cd到您应用的目录。

  3. 输入:

    dotnet compile --native
    
  4. 就是这样!完成后,您的应用程序将被编译为单个二进制文件,如下所示:

    Native compiled .NET Core EXE

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

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

    dotnet compile --native --cpp
    

    这将使用C ++代码生成器(而不是RyuJIT)优化您的程序,因此您的应用程序甚至更适合AOT方案。

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

答案 5 :(得分:11)

是的,使用Ngen,本机图像生成器。但是,您需要注意以下几点:

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

总而言之,如果您需要缩短应用程序的启动时间,那么使用Ngen是值得的。

答案 6 :(得分:9)

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

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

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

答案 7 :(得分:6)

您可以使用名为.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编译器提供提示。

答案 8 :(得分:4)

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

真的没有解决你的问题。

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

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

在其GitHub主页上:

  

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

答案 11 :(得分:0)

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

NGEN可以编译为本机,但也需要部署IL代码,此目的只是为了减少启动时间,但它也没有用。

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

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

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

答案 12 :(得分:0)

看起来像网络核心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可能做类似的事情。

答案 13 :(得分:0)

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

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

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

<ItemGroup>
  <PackageReference Include="Microsoft.DotNet.ILCompiler" Version="6.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,这可能会给您带来更好的结果。

答案 14 :(得分:-1)

尝试使用此(http://www.dotnetnative.online/)将.net编译的exe编译为本机exe,我尝试了此方法,它是新的但很好。

答案 15 :(得分:-3)

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