错误信息
首先,让我们看一下错误信息:
System.BadImageFormatException:“无法加载文件或程序集'System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'。 引用程序集不应在执行过程中加载。 它们只能在反射加载器上下文中加载。(0x80131058)”
根据我的经验,这种类型的错误通常是由于缺少DLL文件或者文件格式/版本不符合预期导致的。然而,我无法确定如何解决此错误。
设置
主要项目是一个ASP.Net Core 3.1应用程序。
它配置为能够作为Windows服务运行并支持Web API和MVC框架。因此,我的Program.cs看起来像这样:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
var builder = Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
builder.UseWindowsService();
return builder;
}
}
那部分都很好,我可以将应用程序作为Windows服务运行并提供剃刀视图和Web API端点等。
然而,在此解决方案中还有更多的项目。我有几个.NET 4.6类库项目被服务应用程序引用。因此,我的解决方案看起来像这样:
- 服务应用程序(NET CORE 3.1)
- Lib 1(NET 4.6)
- Lib 2(NET 4.6)
Service App引用Lib 1,并且Lib 1引用Lib 2。
任何这两个库中的代码都可以正常工作,并且可以被服务应用程序使用。
问题在于Lib 2引用了System.Management DLL,这就是导致错误的原因。每当我使用一个使用该DLL的函数时,我就会收到上面的错误。
迄今为止的尝试
我迄今为止的尝试包括:
- 将DLL设置为“复制到输出”
- 直接将DLL引用添加到Web服务应用程序中
- 手动将DLL复制到输出文件夹。调试和发布文件夹(注意:发布设置为“自包含”应用程序)
问题
基本上,我如何解决这个问题?或者至少,我如何进一步调试问题以潜在地找到解决方案。