8

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

谢谢

4

4 回答 4

11

您可以使用 NGen 提前编译它,但这仍然取决于 .NET 框架。Remotesoft 的 Salamander(一个商业应用程序)可以制作一个无框架的应用程序。

于 2008-10-10T00:57:19.393 回答
5

您可以将 IL 编译为本机二进制文件。有些产品可以做到这一点。

更大的问题是你应该...

如果要删除所有 dot net 依赖项以在没有 dot net 的情况下运行

基本上,这些产品正在做的是预编译到机器级别(通常是 x86),然后在您的 exe 中静态包含所有必需的库。这通常会导致一个巨大的 exe。而且,更重要的是,您现在的目标机器上并没有真正的运行时。您拥有本机编译器选择合并的运行时的一部分。

如果您只想获得更快的 JIT 时间

您也可以使用 NGen 将其编译为本机二进制文件,但您仍然拥有 dot net 上的所有依赖项。目标机器仍然需要框架等。

但是,当你 ngen 你失去了应用程序自动升级到 64 位的能力。如果您的应用程序是预编译的,您必须强制使用一种模式。如果用户在 64 位机器上运行,则您的 IL 代码将被提升(除非您将其标记为不提升)。

JIT 时间并不是大多数应用程序的最大瓶颈。它是框架库和其他相关需求的加载。

如果你真的需要它,你可以在安装应用程序中获取当前用户的目标机器。

我最近还了解到,您不能对应用程序进行 NGEN 并期望它像使用 JIT 一样利用 CPU。当您运行 NGEN 时,出于某种原因,总是会优化 PentiumPro 的输出,并且不会利用 SSE、SSE2 等内容。所以我会说将 NGEN 删除为一个合理的用例。

于 2008-10-10T01:12:48.910 回答
1

ngen可用于“pre-JIT”图像,因此它以原生形式在磁盘上可用,以减少应用程序启动时间。

于 2008-10-10T00:57:46.257 回答
1

Mono 有一个可以发出本机代码的 Ahead of Time (AOT)编译器。

于 2010-01-19T07:33:01.460 回答