31

标题说明了一切。我希望有人可以向我解释 .NET Native 带来了我们在 Ngen.exe 中还没有的东西。

4

2 回答 2

30

您可以将 .NET Native 视为桌面 CLR 使用的 NGen 技术的演变。.NET Native 和 NGEN 有几个主要的不同点——

  • 运行时依赖项 - NGEN 使用完整的桌面 CLR,.NET Native 使用应用程序本地的重构运行时 (mrt100_app.dll)。.NET Native 运行时已经过重构,将大部分功能移出应用程序并移入代码生成工具链。这使它更小,更多的游戏费用,并且(希望)在运行时更易于调试。.NET Native 应用程序也是自包含的,这对于应用程序来说是一个有用的属性。
  • 本机映像依赖项 - NGEN 映像与其运行的 CLR 及其依赖程序集的 NGEN 映像紧密绑定。例如,当对 mscorlib.dll 进行错误修复时,这会导致几乎所有 NGEN 映像都需要重新生成。
  • 编译位置- .NET Native 的目标是在应用商店中生成本机代码。NGEN 在最终用户设备上生成本机代码。您当然可以想象,对于某些类别的设备(例如手机、平板电脑),您宁愿不要浪费最终用户的电池寿命来生成代码。在商店中编译还允许 .NET Native 花费更多时间进行编译,因此允许它应用比 NGEN 所能承受的更多的优化。
  • 代码生成器- NGEN 使用 JIT 编译器生成代码,.NET Native 使用 Visual C++ 编译器的后端,这使我们能够应用诸如自动矢量化之类的优化,这些优化在 JIT 案例中应用过于昂贵
  • 整个程序分析- NGEN 一次为单个程序集生成代码,这允许 NGEN 图像在多个应用程序上下文中使用。.NET Native 为整个应用程序包生成代码,这允许它应用更广泛的优化集(例如,完全丢弃在运行时从未使用过的代码)。这与重构框架相结合,使这些优化能够尽可能地发挥作用。
  • IL Fallback - NGEN 图像包含程序集的本机代码和 MSIL(以及其他数据结构)。如果在运行时发生某些事情导致 CLR 需要它在 NGEN 映像中找不到的本机代码,它可以回退到 JITing。在 .NET Native 当前的开发者预览版中,本机映像中仅存在本机代码。这意味着如果图像中不存在代码,它将永远不会在运行时执行。
于 2014-05-12T23:54:36.587 回答
20

据我所知,Ngen 仍然依赖于框架,根据常见问题解答,.NET Native 在投入生产时并不依赖于框架。

这只是关于性能,还是这也允许构建本地编译为 Win32/64 并且不需要在目标计算机上安装 .NET Framework 的 C# 代码(比如说)?

没错:.NET Native 不仅关乎性能,还关乎生产力和一致的设备体验。.NET Native 允许您使用托管语言编写代码并像往常一样上传 MSIL 包。但是,应用程序将作为完全独立的本机编译代码部署在最终用户设备上(当 .NET Native 进入生产环境时),并且不会依赖于目标设备/机器上的 .NET Framework。如您所知,.NET 应用程序的范围很广。因此,我们也在对完整的 .NET Framework 进行大量投资(例如,我们刚刚发布了 RyuJIT 的 CTP)。

Microsoft .NET 本机常见问题解答

于 2014-04-07T08:43:03.837 回答