Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
它';是否可以运行.NET本机映像可执行文件?_.net_Windows_Native_.net Assembly_Cil - Fatal编程技术网

它';是否可以运行.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[]{}});