Asp.net core 作为Windows服务运行的自足.Net核心web应用中的嵌套DLL引用问题

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

错误

首先,让我们从错误消息开始:

System.BadImageFormatException:'无法加载文件或程序集'System.Management,版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'。不应加载引用程序集以执行。它们只能在仅反射加载程序上下文中加载。(0x80131058)'

根据我的经验,如果DLL丢失,或者不是预期的格式/版本,通常会发生这种类型的错误。但是,我无法确定我需要做什么来解决此错误

设置

主要项目是一个ASP.NETCore3.1应用程序

它被配置为能够作为窗口服务运行,并支持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;
    }
}
公共类程序
{
公共静态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)
服务应用程序引用库1,库1引用库2

这两个库中的任何一个都可以正常工作,并且可以被服务应用程序使用

问题是lib2引用了,这就是导致错误的原因。每当我使用使用该DLL的函数时,我都会得到上面的错误

到目前为止的尝试

迄今为止,我的努力包括:

  • 将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这很奇怪,因为我想我在几周前最后一次研究这个问题的时候就试过了,从记忆中我认为实际上没有相同的版本。。。但我一直在和微软、管理层打交道,所以我可能把自己弄糊涂了。无论如何,谢谢你的帮助。请发布答案,您将获得分数!