它';是否可以运行.NET本机映像可执行文件?
问题很简单:我用它';是否可以运行.NET本机映像可执行文件?,.net,windows,native,.net-assembly,cil,.net,Windows,Native,.net Assembly,Cil,问题很简单:我用ngen生成了一个可执行文件,他的完整路径是: "C:\Windows\assembly\NativeImages_v4.0.30319_32\NassilDotNet\eddb174e4a81e440633abddb977ab57a\NassilDotNet.ni.exe" 当我试图打开/执行该可执行文件时,会显示一个错误消息对话框:无法在您的系统上运行该应用程序。请联系计算机管理员(etc) 原始可执行文件在控制台上显示Hello World消息 我做错了什么?ngen组件
ngen
生成了一个可执行文件,他的完整路径是:
"C:\Windows\assembly\NativeImages_v4.0.30319_32\NassilDotNet\eddb174e4a81e440633abddb977ab57a\NassilDotNet.ni.exe"
当我试图打开/执行该可执行文件时,会显示一个错误消息对话框:无法在您的系统上运行该应用程序。请联系计算机管理员(etc)
原始可执行文件在控制台上显示Hello World消息
我做错了什么?ngen组件与普通组件有几个不同之处。首先,即使它们是可执行的,也总是标记为
IL_库
。如果在ildasm中打开清单,可以看到:
而普通程序集通常具有.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文件是框架基础结构的一部分,不打算直接部署或运行。原始可执行文件启动时,CLR会启动本机映像(它跳过了可执行文件可能要执行的JIT过程),因此您不打算直接打开它们。我觉得Microsoft将生成的图像命名为
.exe
,这是一个错误。原始可执行内容仍存储在输出图像上,因此,如何执行该操作?请重新表述“原始可执行内容仍存储在输出图像上”-我不明白你的意思。NGEN的输出是原始可执行程序集代码中X86程序集的添加,可在程序集代码中运行,但此代码与原始代码存储在同一输出文件中。所以只能运行X86生成的代码。。。
Assembly ass = Assembly.LoadFile(path);
ass.EntryPoint.Invoke(null, new object[]{new string[]{}});