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


89

如果要在无法使用.NET框架的计算机上运行.NET应用程序,请执行以下操作:有什么方法可以将应用程序编译为本地代码?

Answers:


45

Microsoft有一篇文章描述了如何将MSIL编译为本机代码

您可以使用Ngen

本机映像生成器(Ngen.exe)是可提高托管应用程序性能的工具。Ngen.exe创建本机映像,即包含已编译的特定于处理器的机器代码的文件,并将其安装到本地计算机上的本机映像缓存中。运行时可以使用来自缓存的本机映像,而不是使用即时(JIT)编译器来编译原始程序集。

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


1
除了表演外,我没有其他理由使用它。CLR代码仍然可以像以前一样读取,并且您仍然需要.NET。因此,令人失望的是,微软没有提供能够解决我认为是个大问题的工具(任何人都可以按原样查看您的高级代码)
MasterMastic 2012年

我不同意Espo。因为,灰色文字表示“运行时”,这意味着CLR,也就是Chris正确指出的出现在其中的.NET Framework。但是,NGen的观点是正确的。问题是,不使用CLR / Runtime / .NET Framework都是一样的。
茉莉花

1
这是时间来然而兴奋,看起来像在.NET Framework终于得到本地编译器- msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder

如果需要独立于.NET的可执行文件,则ILMerge您的.NET可执行文件及其相关性树中的所有内容,然后将其合并到Ngen

24

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

RemoteSoft am


5
这是我所听说过的唯一不需要框架的工具。当然,它的价格为1249美元。
Slapout

3
在过去的几年中,我曾尝试过几次以获取信息或评估,但是他们从不回覆我有关定价或演示的电子邮件,因此我认为他们的产品可能有点可疑。
Codenheim 2014年

21

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

脚步:

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

  2. 打开一个shell提示符,然后cd进入您的应用程序目录。

  3. 输入:

    dotnet compile --native
    

而已!完成后,您的应用程序将被编译为单个二进制文件,如下所示:

本机编译的.NET Core EXE

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


另外,如果您想要一个更快的程序,可以运行以下命令:

dotnet compile --native --cpp

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

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


注意:只有使用.NET Core构建的项目才支持此功能。(不过,+ 1)
Mahmoud Al-Qudsi '17

您忘记了.NET Native需要Windows 10的非常重要的细节
。– Elmue

似乎无法与.net core 3.1一起使用,是否有任何更新?
user1005462

19

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

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



11

是的,使用Ngen,本机图像生成器。但是,您需要注意许多事项:

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

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


9

您可以!但是,您只能使用.NET 1.1(没有通用名称): 单声道提前编译(AOT)

但是,这意味着编译实际上是本机的,因此您将不再能够部署单个字节码程序集,每个平台将需要一个。

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


6

您可以使用称为.NET Native的新的预编译技术来执行此操作。在此处查看:http : //msdn.microsoft.com/zh-CN/vstudio/dotnetnative

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

如上所述,NGEN使用混合编译模型,并在动态场景中依赖IL和JIT。.NET Native不使用JIT,但它支持各种动态方案。代码作者需要利用 运行时指令为他们希望支持的动态方案提供提示。


1
+1-我已经等了好几年了。我希望全世界对“虚拟机”的迷恋会早日实现,但是尽管如此,它正在发生。我希望我们将看到本机编译的复兴。就像您说的那样,它目前适用于Window的Store Apps,但是台式机市场要求平等对待只是时间问题。
Codenheim 2014年

4

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

确实不能解决您的问题。


2

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

在其GitHub主页上:

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


1

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

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


0

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

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

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

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

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


“ CoreRt是Alpha版本,仅适用于简单的helloworld类型的应用程序。” 事实并非如此-Steam上有一些游戏(例如helloworld)要复杂得多。
S Waye

但是CoreRT无法编译任何Winform应用程序。我找到了另一个可以编译Winform应用程序(dotnetnative.online)的在线编译器
Rahim Surani



-3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.