.NET应用程序可以编译成本地应用程序吗?

8

我想知道一个.NET应用程序是否可以提前编译成本机代码?即使我有这个能力,我也不打算这样做;我只是好奇。

谢谢


1
@Cody 感谢你的拼写纠正,这会教训我在按回车键之前不要忘记校对。 - Nathan W
4个回答

11

您可以使用NGen进行预编译,但这仍然取决于.NET框架。Remotesoft的Salamander(一款商业应用程序)可以创建一个无需框架的应用程序。


5
您可以将IL编译为本机二进制文件。有一些产品可以实现这个功能。
更大的问题是,您是否应该这样做...
如果您想要删除所有与dot net相关的依赖项以在没有dot net的情况下运行
基本上,这些产品正在将代码预编译到机器级别(通常是x86),然后在exe文件中静态地包含所有所需的库。这通常会导致一个非常庞大的exe文件。更重要的是,您现在实际上并没有在目标机器上运行时环境(runtime)。您只有本地编译器选择合并的运行时环境的一部分。
如果您只想获得更快的JIT时间
您还可以使用NGen将其编译为本机二进制文件,但仍需要所有与dot net相关的依赖项。目标机器仍然需要框架等。
但是,当您使用ngen时,您失去了应用程序自动升级到64位的能力。如果您的应用程序已经预编译,您必须强制指定一种模式。如果用户在64位机器上运行您的应用程序,则您的IL代码将被升级(除非您标记它不升级)。
在大多数应用程序中,JIT时间并不是最大的瓶颈。最大的瓶颈是加载框架库和其他相关要求。
如果确实需要,您可以在安装应用程序中使用ngen来获取当前用户的目标机器。
我最近还了解到,您不能NGEN一个应用程序并期望它像JIT一样利用CPU。当您运行NGEN时,它总是为PentiumPro进行优化,原因不明,并且不会利用SSE、SSE2等功能。因此,我认为这就排除了NGEN作为合理用例的可能性。

1

Mono有一个Ahead of Time(AOT)编译器,可以生成本机代码。


1

ngen 可以用于“预JIT”图像,因此它在磁盘上以本地形式可供使用,从而缩短应用程序的启动时间。


顺便问一下:与标准的.NET相比(尽管启动时间较长),ngen编译的应用程序是否运行更慢?我认为JIT编译器可以在运行时特别是使用lambda表达式时进行大量优化。 - Dario

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