C#中无法访问.dll内类:加载程序集后获取类型抛出依赖异常
问题分析与解决办法
你的问题核心是类库的依赖项(System.Runtime 6.0.0.0)未被正确加载,虽然Assembly.Load()成功加载了ClassLibrary1.dll,但CLR在解析该类库的依赖时找不到对应的System.Runtime版本,导致调用GetTypes()时抛出反射加载异常。
以下是具体解决步骤:
1. 统一项目的.NET目标框架版本
检查类库项目(ClassLibrary1)和主项目(First_dll_just_connectLib_96)的目标框架是否一致:
- 右键类库项目 → 属性 → 应用 → 目标框架
- 右键主项目 → 属性 → 应用 → 目标框架
确保两者使用相同的.NET版本(比如都是.NET 6,或都是.NET Framework 4.8)。跨版本引用(如.NET Core类库引用到.NET Framework项目)会引发依赖项不兼容问题。
2. 正确添加项目引用,避免手动复制DLL
不要手动将ClassLibrary1.dll复制到主项目的Debug目录:
- 在主项目中右键“依赖项” → 添加项目引用 → 选择ClassLibrary1项目
这样Visual Studio会自动处理依赖项的复制,确保所有必要的DLL(包括System.Runtime)都被同步到主项目的输出目录。
如果必须引用已编译的DLL文件:
- 右键添加引用 → 浏览选择ClassLibrary1.dll
- 选中该引用 → 在属性窗口中设置“复制本地”为
True,其依赖项会被自动复制到输出目录。
3. 安装缺失的依赖NuGet包
如果主项目缺少System.Runtime 6.0.0.0,直接通过NuGet安装对应版本:
打开Package Manager Console执行:
Install-Package System.Runtime -Version 6.0.0
或使用.NET CLI:
dotnet add package System.Runtime --version 6.0.0
4. 改用Assembly.LoadFrom()加载DLL
如果需要手动加载DLL,使用Assembly.LoadFrom()指定DLL的完整路径,CLR会从该路径所在目录加载依赖项:
// 替换为你的ClassLibrary1.dll实际路径 as1 = Assembly.LoadFrom(@"C:\Projects\First_dll_just_connectLib_96\bin\Debug\ClassLibrary1.dll");
调整后的主项目代码示例:
using System; using System.Reflection; namespace First_dll_just_connectLib_96 { internal class Program { static void Main(string[] args) { Assembly as1; try { // 使用LoadFrom指定DLL路径 as1 = Assembly.LoadFrom(@"bin\Debug\ClassLibrary1.dll"); Console.WriteLine("ClassLibrary1 exists"); } catch (Exception e) { Console.WriteLine($"加载DLL失败:{e.Message}"); Console.ReadLine(); return; } Type[] types; try { types = as1.GetTypes(); } catch (ReflectionTypeLoadException e) { foreach (Exception ex in e.LoaderExceptions) { Console.WriteLine(ex.Message); } Console.ReadLine(); return; } foreach (Type t in types) { Console.WriteLine(t.Name); } Console.ReadLine(); } } }
内容的提问来源于stack exchange,提问作者Ilya_M87
相关产品推荐
相关产品推荐

