【发布时间】:2010-07-03 22:57:40
【问题描述】:
我在 Wikipedia 上阅读了以下关于 CLR 的文章:
或者,CIL 代码可以是 单独编译为本机代码 通过使用 本机图像生成器 (NGEN)。这 加快所有以后的运行 软件作为 CIL 到本机 不再需要编译。
这是否意味着我可以获取任何 .NET 程序并将其编译为二进制文件,然后该二进制文件将能够在未安装 .NET 框架的机器上运行?
【问题讨论】:
我在 Wikipedia 上阅读了以下关于 CLR 的文章:
或者,CIL 代码可以是 单独编译为本机代码 通过使用 本机图像生成器 (NGEN)。这 加快所有以后的运行 软件作为 CIL 到本机 不再需要编译。
这是否意味着我可以获取任何 .NET 程序并将其编译为二进制文件,然后该二进制文件将能够在未安装 .NET 框架的机器上运行?
【问题讨论】:
没有。
这意味着您在运行代码时不需要运行 JIT (Just-In-Time) 编译器,因为 NGen 已经将其转换为机器码。生成的二进制文件仍然依赖于 .Net 框架,并且必须在机器上单独安装。
有一些工具可以打包 .Net 框架程序集,并以不需要 .Net 框架的方式将它们包含在您的二进制文件中。查看http://www.xenocode.com/。 VMWare 买了一个叫 Thinstall 的工具,我觉得也可以这样做:http://www.vmware.com/products/thinapp/。
【讨论】:
阅读MSDN page for Ngen 的声明:
Ngen.exe 创建本机映像,这些文件包含已编译的特定于处理器的机器代码,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机图像,而不是使用即时 (JIT) 编译器来编译原始程序集。
意味着(对我来说)Ngen 只是执行 JIT 编译器所做的并保存结果。它没有说明在二进制文件中包含 .NET 运行时。
【讨论】:
'NGen' 只是编译你的代码。它不会将整个 .NET 框架静态链接到其中。
Mono,然而,确实有一个静态编译器和链接器可以做到这一点。这就是 Mono 的 iPhone 支持的工作原理。
【讨论】: