.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
相关产品推荐
相关产品推荐

