.NET Core 3.0中加载exe时出现坏的IL格式

8

我有两个 .NET Core 3.0 WPF 项目。其中一个我发布为名为“DefaultPlugin.exe”的可执行文件。

在我的第二个 WPF 项目中,我尝试使用 Assembly.Load 加载第一个项目并读取类型信息。然而,当我这样做时,会出现异常“Bad IL Format”来自 System.Private.CoreLib。如果我从 bin 文件夹加载 DefaultPlugin.dll,则可以正常工作。我还检查了 CPU 配置以确保它们匹配。

///Works:
string path = @"C:\Users\S-D81\source\repos\DefaultPlugin\DefaultPlugin\bin\Debug\netcoreapp3.0\win-x64\DefaultPlugin.dll";
///Does not work:
//string path = @"C:\Users\S-D81\source\repos\DefaultPlugin\DefaultPlugin\bin\Debug\netcoreapp3.0\win-x64\DefaultPlugin.exe";
//string path = @"C:\Users\S-D81\source\repos\DefaultPlugin\DefaultPlugin\bin\Release\netcoreapp3.0\win-x64\publish\DefaultPlugin.exe";

Assembly assembly = Assembly.LoadFrom(path);

是否有方法可以在发布后的.NET Core 3.0程序集上使用Assembly.Load,还是这只是新框架的限制?


你如何发布你的项目?有许多不同的发布模式。 - canton7
它以单个文件的形式发布,经过修剪,使用发布配置,针对x64进行目标设置。但是即使我只是尝试从bin / Debug文件夹加载.exe文件,它仍然会出现相同的错误。 - Alienator
1
如果它作为一个名为“DefaultPlugin.exe”的单个(修剪过的)文件发布,那么你如何能够加载名为“DefaultPlugin.dll”的文件?另外,如果它是一个发布版本,为什么它在Debug文件夹中? - canton7
我只是想在任何已构建的程序集上使用Assembly.Load,以查看哪些程序集可以工作。无论如何构建它(无论是在调试、发布还是已发布文件夹中),似乎都无法加载.exe文件。这告诉我,.net core可能存在读取任何已构建的.exe文件的问题。我的问题可能表述不清,但最终我需要仅从已发布版本中读取可执行文件。 - Alienator
1个回答

15
在.NET Core 3.0应用中生成的.exe文件不是IL程序集,而是本机主机可执行文件。该主机文件在加载实际的IL应用程序集(具有.dll扩展名)之前,会找到并启动运行时。
您可以通过加载与项目名称相同的.exe文件旁边的.dll文件来加载插件。

在将项目发布为自包含可执行文件后,是否有任何方法可以加载或引用该dll? - Alienator
你的意思是单文件发布吗?那不行,因为单文件发布是一种本地捆绑包,它会将嵌入的文件提取到临时目录中,然后执行它们。 - Martin Ullrich
啊,我担心就是这种情况。谢谢。 - Alienator
简单 - 使用dll文件而不是exe文件。 这种情况下你会觉得它会给出更好的错误信息。 - mcmillab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接