ngen如何工作?

所以,据我所知,它确实需要用MSIL编写的可执行文件和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框架?

但是,生成图像不起作用,并给“这个应用程序无法在您的电脑上运行”错误信息。

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

把它看作是编写一个动态链接到C ++运行时的本地程序,必须安装c ++运行时才能使程序工作。 .net没有与本机应用程序一样的静态链接,您必须始终安装运行时。

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