【发布时间】:2010-09-16 10:16:09
【问题描述】:
只是想知道 .NET 应用程序是否可以提前编译为本机机器代码?即使可以,我也不打算这样做;我只是好奇。
谢谢
【问题讨论】:
-
@Cody 感谢拼写更正,这将教会我在敲击输入之前不要校对。
标签: .net native compilation machine-code
只是想知道 .NET 应用程序是否可以提前编译为本机机器代码?即使可以,我也不打算这样做;我只是好奇。
谢谢
【问题讨论】:
标签: .net native compilation machine-code
您可以使用 NGen 提前编译它,但这仍然取决于 .NET 框架。 Remotesoft 的 Salamander(商业应用)可以制作无框架的应用。
【讨论】:
您可以将 IL 编译为本机二进制文件。有些产品可以做到这一点。
更大的问题是你应该...
如果要删除所有点网依赖以在没有点网的情况下运行
这些产品所做的基本上是预编译到机器级别(通常是 x86),然后在您的 exe 中静态包含所有必需的库。这通常会导致一个巨大的 exe。而且,更重要的是,您现在的目标机器上并没有真正的运行时。您拥有本地编译器选择合并的运行时的一部分。
如果您只想获得更快的 JIT 时间
您也可以使用 NGen 将其编译为本机二进制文件,但您仍然拥有 dot net 上的所有依赖项。目标机还需要框架等。
但是,当您使用 ngen 时,您将失去应用程序自动升级到 64 位的能力。如果您的应用程序是预编译的,您必须强制使用一种模式。如果用户在 64 位机器上运行,则您的 IL 代码会提升(除非您将其标记为不提升)。
JIT 时间并不是大多数应用程序的最大瓶颈。就是框架库和其他相关需求的加载。
如果你真的需要它,你可以在一个设置应用程序中获取当前用户的目标机器。
我最近还了解到,您不能对应用程序进行 NGEN 并期望它像使用 JIT 一样利用 CPU。当您运行 NGEN 时,出于某种原因,它总是会优化 PentiumPro 的输出,并且不会利用 SSE、SSE2 等功能。所以我想说的是,将 NGEN 移除为一个合理的用例。
【讨论】:
ngen 可用于“预 JIT”图像,因此它可以本地形式在磁盘上使用,以减少应用程序启动时间。
【讨论】:
Mono 有一个 Ahead of Time (AOT) compiler,可以发出本机代码。
【讨论】: