【问题标题】:It's possible to run an .NET Native Image executable?可以运行 .NET Native Image 可执行文件吗?
【发布时间】:2018-01-20 04:24:08
【问题描述】:

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

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

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

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

我做错了什么?

【问题讨论】:

  • 原生映像是由 CLR 在启动原始可执行文件时启动的(它会跳过可执行文件会受到的 JIT 进程),因此您不应该直接打开它们。我觉得微软把生成的图片命名为.exe是错误的。
  • 输出图像上存储的原始可执行内容静止不动,那么,如何执行呢?
  • 请改写“存储在输出图像上的原始可执行内容剧照” - 我不明白你的意思。
  • NGEN 的输出是在原始可执行文件中添加了 X86 程序集以在汇编代码中运行,但此代码与原始代码存储在同一输出文件中。所以只能运行X86生成的代码...

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


【解决方案1】:

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 文件是框架基础结构的一部分,并不打算直接部署或运行​​。

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2013-01-13
    • 2018-06-15
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多