ngen 是如何工作的?

How does ngen works?

因此,据我所知,它确实需要一个用 MSIL 编写的 executable/dll 文件并执行 JIT 作业:将 MSIL 代码转换为本机机器代码。正确的? 所以 运行 ngen 使用命令生成我的程序的本地图像:

ngen install myProgram.exe

这需要一段时间,但我发现生成的文件位于 C:\Windows\assembly\NativeImages_v4.0.30319_32\myProgram\db1496cf0295bbe6a9242d86c0d8e091\myProgram.ni.exe

但是那个可执行文件的具体内容是什么?我的 C# 程序的机器代码版本?它没有 运行(见下文)。如果我想向用户提供我的程序的本机版本,如果我在每个 *.exe*.dll 中 运行 ngen 并将生成的图像文件提供给用户,会 运行 好吗?它还需要 .NET 框架吗?

但是,生成图像不起作用并给出 "This app can't run on your PC" 错误消息。

您说 ngen 将 JIT 代码编译为机器代码是正确的,但您仍然需要 .net 运行time 库来 运行 程序。如果您的目标是制作一个不需要 .net 框架的程序,它将无法运行。

把它想象成编写动态链接到 C++ 运行time 的本机程序,必须安装 c++ 运行time 才能使程序运行。 .net 没有像本机应用程序那样的等效静态链接,您必须始终安装 运行time。

此外,您不能 运行 ngen 直接构建图像,当您 运行 ngen 时,它会在您 运行 您的 .net 时将其安装到程序集缓存(列出的目录)中app 它在缓存中找到副本并使用预生成的代码,你不能直接 运行 它。