可以 运行 .NET 本机映像可执行文件吗?

It's possible to run an .NET Native Image executable?

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

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

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

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

我做错了什么?

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