.NET Native和Ngen.exe有什么区别

本文关键字:什么 区别 exe Ngen Native NET | 更新日期: 2023-09-27 17:57:00

标题说明了一切。我希望有人能向我解释 .NET Native 带来了什么,而我们在 Ngen.exe 中还没有

.NET Native和Ngen.exe有什么区别

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

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

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

这仅仅是关于性能,还是这也允许构建 本机编译为 Win32/64 且不 需要在目标计算机上安装 .NET 框架?

这是正确的:.NET Native不仅与性能有关,而且与 关于生产力和一致的设备体验。.NET 本机 允许您使用托管语言编写代码并上传 MSIL 包一如既往。但是,应用程序将部署在最终用户上 设备作为完全自包含的本机编译代码(当 .NET 本机进入生产),并且不会依赖于 .NET 目标设备/计算机上的框架。如您所知,.NET 应用程序 跨越广泛的范围。因此,我们正在对完整的 .NET 进行大量投资 框架也是如此(例如,我们刚刚发布了RyuJIT的CTP)。

Microsoft .NET 本机常见问题解答