问题很简单:我用ngen
生成了一个可执行文件,他的完整路径是:
"C:\Windows\assembly\NativeImages_v4.0.30319_32\NassilDotNet\eddb174e4a81e440633abddb977ab57a\NassilDotNet.ni.exe"
当我尝试打开/执行可执行文件时,会显示错误消息对话框:无法在您的系统上运行此应用程序。请联系计算机管理员(等)......
原始可执行文件在控制台上显示Hello World消息。
我做错了什么?
答案 0 :(得分:2)
ngen 程序集与正常程序集有几点不同。首先,它们始终标记为IL_LIBRARY
,即使它们是可执行的。如果您在 ildasm 中打开清单,则可以看到此信息:
.corflags 0x00000004 // IL_LIBRARY
普通程序集通常具有.corflags 0x00000001
(ILONLY
),即使它们只是库。
其次,(即使它们是 .exe ),标准PE入口点丢失(并且缺少DOS入口点)。它对CIL可执行文件并不重要,但已经有两个迹象告诉系统它不应该执行可执行文件。
我认为像这样的代码可以工作:
Assembly ass = Assembly.LoadFile(path);
ass.EntryPoint.Invoke(null, new object[]{new string[]{}});
但我总是在 LoadFile 中得到 BadImageFormatException 。奇怪的是,如果我以这种方式加载库文件,我就不会得到这个异常,但是没有可以调用的入口点。
我想您可以使用 ildasm 反汇编文件,更改.corflags
字段并使用 ilasm 生成可执行文件。但是,这将剥离文件中存在的本机代码,并将其基本上转换为原始可执行文件。
总结一下,只需运行原始文件即可。 ngen 文件是框架基础结构的一部分,并不意味着直接部署或运行。