因此,据我所知,它确实需要一个用 MSIL
编写的可执行文件/dll文件,并执行JIT-job:将MSIL代码转换为 native 代码。正确的?
因此,运行 ngen
以使用以下命令生成我的程序的 native 镜像:
ngen install myProgram.exe
需要一段时间,但我发现生成的文件位于
C:\Windows\assembly\NativeImages_v4.0.30319_32\myProgram\db1496cf0295bbe6a9242d86c0d8e091\myProgram.ni.exe
但是该可执行文件的确切内容是什么?我的C#程序的机器代码版本?它不会运行(请参阅下文)。如果我想向用户提供程序的 native 版本,如果我在每个
ngen
和*.exe
中运行*.dll
并将生成的图像文件提供给用户,它将运行正常吗?它仍然需要.NET框架吗?但是,该生成图像不起作用,并显示“此应用程序无法在您的PC上运行”错误消息。
最佳答案
您是正确的,ngen将JIT代码编译为机器代码,但是您仍然需要.net运行时库来运行该程序。如果您的目标是制作不需要.net框架的程序,则它将无法正常工作。
可以将其想像为编写动态链接到C++运行时的 native 程序,必须安装c++运行时才能使程序正常工作。 .net没有像 native 应用程序那样具有静态链接的等效功能,因此必须始终安装运行时。
另外,您不能直接运行ngen生成的镜像,当您运行.net应用程序时,运行ngen会将其安装到程序集缓存(列出的目录)中,它会在缓存中找到副本并使用预先生成的代码,您可以不要直接运行它。