能否将.NET IL代码编译成机器码?

30

我想在不安装 .NET Framework 的情况下分发我的 .NET 程序。是否有可能将 .NET 程序编译成机器码?

13个回答

21

是的,你可以使用Ngen.exe进行预编译,但这并不能消除CLR的依赖性。

你仍然需要同时提供IL程序集,Ngen的唯一好处在于应用程序可以在没有调用JIT的情况下启动,因此可以实现真正快速的启动时间。

根据《CLR Via C#》:

Ngen预编译的程序集通常比JIT编译的程序集慢,因为JIT编译器可以对目标机器进行优化(32位?64位?特殊寄存器?等等),而NGEN只会生成一个基准编译。

编辑:

关于CLR Via C#的上述信息存在一些争议,有人说你必须作为安装过程的一部分在目标机器上运行Ngen。


3
Jon,这要看情况。 ngen 可能会在目标机器上的安装过程中被调用,据我所知,这实际上已经为使用 .NET 实现的各种 Microsoft 产品完成了。 - Konrad Rudolph
1
然而,NGen可以成为应用程序安装过程的一部分,使其能够编译到目标机器上,我会编辑我的帖子。 - FlySwat
4
修改我的评论:你实际上是错的(我也是),ngen必须在目标机器上调用。ngen会在本地机器 GAC 中安装本机映像!在开发人员的机器上预编译是无用的。 - Konrad Rudolph
不要忘记 paint.NET。当它在安装过程中声明为您的计算机进行优化时,它正在使用 ngen。 - Morten Christiansen
此外,NGEN 无法考虑任何静态变量的当前值,而 JIT 可以。我们依赖 JIT 根据只读静态变量的值从机器指令中实际省略代码行。 - Walden Leverich
显示剩余3条评论

20

1
这个问题以前已经被问过了,现在再次回答,这是唯一正确的答案。也就是说,这是可能的,但代价很高。 - chrissie1

7

5

还有一个可以实现这一功能的产品是Xenocode Postbuild,但它很昂贵且需要购买许可证,起价为1599美元。虽然我自己没有使用过,因为它的价格大约相当于一个小非洲国家的国民生产总值...


4

1
注意,它不支持桌面平台。 - Jack

3
是否可以将.NET IL代码编译成机器码?
是的,但.NET Framework会在运行时(默认)或安装时(ngen)为您完成此操作。除其他原因外,这种IL ->机器码是在每个安装的计算机上单独完成的,因此可以针对该特定计算机进行优化。
我想在没有.NET框架的情况下分发我的.NET程序。是否可能将.NET程序编译为机器码?
不,就所有目的而言,您不能这样做。第三方解决方法在某些情况下可能有效,但到那时我不再认为它是“托管代码”或“.NET”了。

2

我希望能够得到这个编译器的独立可执行文件!但是根据我所了解的,它已经与VS集成,不再生成Windows可执行文件。 - Jack

1

我认为这是不可能的。你可以制作一个预编译的程序集,但仍然需要框架。


1

我认为你不应该这样做:这是JIT编译器的任务。

但你可以使用ClickOnce或Windows Installer来部署它,以便缺少的框架不会成为一个大问题:你可以告诉安装程序下载框架并安装它。


不好意思,我刚开始学VBnet。似乎你不需要下载框架。在编译vbnet项目时,您可以包括框架选项。我的部署时出现了一些错误,但这似乎是正确的方法。 - webzy

1

如果你只关心部署框架的大小,你可以阅读this的相关内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接