可以运行.NET Native Image可执行文件吗?

时间:2018-01-20 04:24:08

标签: .net windows native .net-assembly cil

问题很简单:我用ngen生成了一个可执行文件,他的完整路径是:

"C:\Windows\assembly\NativeImages_v4.0.30319_32\NassilDotNet\eddb174e4a81e440633abddb977ab57a\NassilDotNet.ni.exe"

当我尝试打开/执行可执行文件时,会显示错误消息对话框:无法在您的系统上运行此应用程序。请联系计算机管理员(等)......

原始可执行文件在控制台上显示Hello World消息。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

ngen 程序集与正常程序集有几点不同。首先,它们始终标记为IL_LIBRARY,即使它们是可执行的。如果您在 ildasm 中打开清单,则可以看到此信息:

.corflags 0x00000004    //  IL_LIBRARY

普通程序集通常具有.corflags 0x00000001ILONLY),即使它们只是库。

其次,(即使它们是 .exe ),标准PE入口点丢失(并且缺少DOS入口点)。它对CIL可执行文件并不重要,但已经有两个迹象告诉系统它不应该执行可执行文件。

我认为像这样的代码可以工作:

Assembly ass = Assembly.LoadFile(path);
ass.EntryPoint.Invoke(null, new object[]{new string[]{}});

但我总是在 LoadFile 中得到 BadImageFormatException 。奇怪的是,如果我以这种方式加载库文件,我就不会得到这个异常,但是没有可以调用的入口点。

我想您可以使用 ildasm 反汇编文件,更改.corflags字段并使用 ilasm 生成可执行文件。但是,这将剥离文件中存在的本机代码,并将其基本上转换为原始可执行文件。

总结一下,只需运行原始文件即可。 ngen 文件是框架基础结构的一部分,并不意味着直接部署或运行​​。