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

Lev*_*lho 31 c# ngen .net-native

标题说明了一切.我希望有人可以向我解释一下.NET Native带来了什么,我们还没有使用Ngen.exe.

小智 29

您可以将.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当前的开发人员预览中,本机映像中仅存在本机代码.这意味着如果代码不存在于图像中,它将永远不会在运行时执行.

  • @ThomasNguyen:是的,微软[说](https://msdn.microsoft.com/en-US/vstudio/dn642499.aspx)"是的,框架代码将被编译到应用程序中." (2认同)

sch*_*ien 20

据我所知,Ngen仍然依赖于框架,根据常见问题,.NET Native在生产时不会这样做.

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

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

Microsoft .NET Native FAQ

  • 要让.NET代码本地运行而不需要在目标上使用.NET Framework,这是否意味着我的意思:框架被编译为本机代码并与应用程序合并?否则应用程序如何获得GC服务?谢谢, (2认同)
  • 忘记提到它只需要你从.NET类库实际使用的块.例如,如果您的项目仅使用来自`System.IO`的内容,则不会引入`System.Web`. (2认同)