【问题标题】:Is ngen used to compile .NET code into an binary that will not require .NET framework to be installed when running the code?ngen 是否用于将 .NET 代码编译成在运行代码时不需要安装 .NET 框架的二进制文件?
【发布时间】:2010-07-03 22:57:40
【问题描述】:

我在 Wikipedia 上阅读了以下关于 CLR 的文章:

或者,CIL 代码可以是 单独编译为本机代码 通过使用 本机图像生成器 (NGEN)。这 加快所有以后的运行 软件作为 CIL 到本机 不再需要编译。

这是否意味着我可以获取任何 .NET 程序并将其编译为二进制文件,然后该二进制文件将能够在未安装 .NET 框架的机器上运行?

【问题讨论】:

    标签: .net ngen


    【解决方案1】:

    没有。

    这意味着您在运行代码时不需要运行 JIT (Just-In-Time) 编译器,因为 NGen 已经将其转换为机器码。生成的二进制文件仍然依赖于 .Net 框架,并且必须在机器上单独安装。

    有一些工具可以打包 .Net 框架程序集,并以不需要 .Net 框架的方式将它们包含在您的二进制文件中。查看http://www.xenocode.com/。 VMWare 买了一个叫 Thinstall 的工具,我觉得也可以这样做:http://www.vmware.com/products/thinapp/

    【讨论】:

      【解决方案2】:

      阅读MSDN page for Ngen 的声明:

      Ngen.exe 创建本机映像,这些文件包含已编译的特定于处理器的机器代码,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机图像,而不是使用即时 (JIT) 编译器来编译原始程序集。

      意味着(对我来说)Ngen 只是执行 JIT 编译器所做的并保存结果。它没有说明在二进制文件中包含 .NET 运行时。

      【讨论】:

      • 看起来这几乎就是它的作用。另外,请注意分发 ngen'd 二进制文件是不安全的; JIT 确实使 ngen'd 图像的跨模块内联在运行时需要与 ngen 时基本相同的库,因此它们可能需要立即重建。 (我的印象是,并非每个库补丁都会使下游的所有内容失效,但任何库补丁可能都需要这样做。而且我不确定这个技巧是否适用在 mscorlib 之外进行更改。)
      【解决方案3】:

      'NGen' 只是编译你的代码。它不会将整个 .NET 框架静态链接到其中。

      Mono,然而,确实有一个静态编译器和链接器可以做到这一点。这就是 Mono 的 iPhone 支持的工作原理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 2020-01-22
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        相关资源
        最近更新 更多