Asp.net core 作为Windows服务运行的自足.Net核心web应用中的嵌套DLL引用问题
错误 首先,让我们从错误消息开始: System.BadImageFormatException:'无法加载文件或程序集'System.Management,版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'。不应加载引用程序集以执行。它们只能在仅反射加载程序上下文中加载。(0x80131058)' 根据我的经验,如果DLL丢失,或者不是预期的格式/版本,通常会发生这种类型的错误。但是,我无法确定我需要做什么来解决此错误 设置 主要项目是一个ASP.NETCore3.1应用程序 它被配置为能够作为窗口服务运行,并支持Web API和MVC框架。所以我的Program.cs看起来像这样:Asp.net core 作为Windows服务运行的自足.Net核心web应用中的嵌套DLL引用问题,asp.net-core,windows-services,Asp.net Core,Windows Services,错误 首先,让我们从错误消息开始: System.BadImageFormatException:'无法加载文件或程序集'System.Management,版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'。不应加载引用程序集以执行。它们只能在仅反射加载程序上下文中加载。(0x80131058)' 根据我的经验,如果DLL丢失,或者不是预期的格式/版本,通常会发生这种类型的错误。但是,我无法确定我需要做什么来解决此错误 设置 主要项目是一个AS
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;
}
}
公共类程序
{
公共静态void Main(字符串[]args)
{
CreateHostBuilder(args.Build().Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)
{
var builder=Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
builder.UseWindowsService();
返回生成器;
}
}
这部分都很好,我可以将应用程序作为Windows服务运行,并提供razor视图和web API端点等服务
但是,此解决方案中有更多的项目。我有两个.NET4.6类库项目,它们被服务应用程序引用。因此,我的解决方案如下所示:
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;
}
}
- 服务应用程序(NET CORE 3.1)
- 图书馆1(净4.6)
- 图书馆2(净4.6)
- 将DLL设置为“复制到输出”
- 将DLL引用直接添加到web服务应用程序
- 手动将DLL复制到输出文件夹。调试和发布文件夹(注意:发布设置为“自包含”应用程序)
基本上,我如何解决这个问题?或者至少,我如何进一步调试该问题以找到潜在的解决方案。我当时无法对此进行重新调试,但我怀疑这是一个缺陷,因为使用的自包含发布过程解决了可传递依赖项 关键是,您的.NETCore3.1应用程序,而您所引用的库称之为“lib2”,确实如此 您的lib2还引用了NuGet包System.Management,当它安装在以.NET Framework为目标的项目上时。。。除了使项目引用
System.Management
的.NET Framework引用程序集外,不执行任何操作,该程序集位于C:\Program Files(x86)\reference Assemblys\Microsoft\Framework\.NETFramework\v4.6.1
中。在运行时,.NET Framework将从GAC加载适当的程序集,但.NET核心运行时不会这样做
现在,在发布.NET Core应用程序时,MSBuild将遍历要复制的依赖项,并且(我想也是这样)查看引用程序集并选择“我想要那个!”并将其复制到输出目录
但您不能运行引用程序集,只能引用它们,因此在运行时,您的应用程序会出现一个异常,确切地说:
不应加载引用程序集以执行
一种解决方法,但肯定不是解决方案,是从.NET核心应用程序中引用相同的System.Management包,该包将实际提取一个包含可运行代码的DLL,并将该DLL复制到输出目录。但这可能会导致其他问题,例如DLL在使用引用DLL构建期间被覆盖
我建议查看GitHub,这是一个已知问题,还是由项目设置引起的问题。System.Management是.NET Framework的一部分,但在.NET Core上,它显然是从程序文件复制引用程序集。那不行。如果在服务应用程序中安装System.Management软件包,会发生什么情况?@CodeCaster。。。呵呵。。。它是有效的:D这很奇怪,因为我想我在几周前最后一次研究这个问题的时候就试过了,从记忆中我认为实际上没有相同的版本。。。但我一直在和微软、管理层打交道,所以我可能把自己弄糊涂了。无论如何,谢谢你的帮助。请发布答案,您将获得分数!