You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core动态加载含SignalR Hub的DLL时出现无法加载程序集异常求助

问题根因

从.NET Core 3.0开始,Microsoft.AspNetCore.SignalR.Core这类ASP.NET Core核心组件不再单独发布NuGet包,而是全部整合到Microsoft.AspNetCore.App共享框架中。你需要加载的GameServer.dll属于ASP.NET Core项目,默认依赖该共享框架,但用于加载DLL的普通.NET Core控制台项目默认未引用该共享框架,因此反射获取继承自Hub的MyHub类型时,CLR无法解析Hub对应的依赖程序集,抛出加载失败异常。
你尝试查找5.0版本的Microsoft.AspNetCore.SignalR.Core NuGet包无法找到,是因为该包最高仅发布到1.0版本,后续版本均已合并到共享框架中,不存在独立NuGet包。

解决方案

方案1(推荐):控制台项目引用ASP.NET Core共享框架

直接修改加载DLL所用的控制台项目的.csproj文件,添加对ASP.NET Core共享框架的引用,即可自动补齐所有依赖:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>
  <!-- 添加以下配置 -->
  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>
</Project>

修改完成后重新编译控制台项目,原有加载代码即可正常运行,无需其他改动。

方案2:手动注册程序集解析事件

如果不需要控制台项目依赖ASP.NET Core共享框架,可以通过注册程序集解析事件,自动从GameServer.dll的输出目录加载所需依赖:

public class Program
{
    public static void Main(string[] args)
    {
        string dllPath = @"C:\Users\Dreamer\Desktop\git Repos\GameServer\bin\Debug\net5.0\GameServer.dll";
        string dllDir = Path.GetDirectoryName(dllPath);

        // 注册依赖解析事件,找不到程序集时从DLL所在目录加载
        AppDomain.CurrentDomain.AssemblyResolve += (sender, eventArgs) =>
        {
            var assemblyName = new AssemblyName(eventArgs.Name).Name + ".dll";
            var targetPath = Path.Combine(dllDir, assemblyName);
            return File.Exists(targetPath) ? Assembly.LoadFrom(targetPath) : null;
        };

        var dll = Assembly.LoadFile(dllPath);
        foreach(Type type in dll.GetExportedTypes())
        {
            Console.WriteLine(type);
        }
    }
}

内容的提问来源于stack exchange,提问作者Dreamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:36:03