如何在C#中使用System.Reflection.Assembly.GetType()访问私有类?加载私有类报错的解决咨询
解决加载私有类时“无法加载程序集类型”的可行思路
我来帮你梳理几个实用的思路,解决你遇到的这个问题:
先确认类型的完全限定名是否准确
很多时候这个错误是因为类型名写错了!如果类B是嵌套在类A里的私有类,它的完全限定名应该是X.Y.Z.A+B(用加号分隔嵌套类),而不是你写的X.Y.Z.A.B。你可以用这段代码遍历程序集里的所有类型,打印出真实的完全限定名来核对:foreach (var type in asm.GetTypes()) { Console.WriteLine(type.FullName); }验证程序集的加载路径和状态
先确认CurrentExecutingDirectory + "X.Y.Z.dll"这个路径是否真的指向了正确的程序集文件:- 用
File.Exists(CurrentExecutingDirectory + "X.Y.Z.dll")检查文件是否存在 - 检查路径里有没有拼写错误(比如大小写、目录分隔符)
另外,Assembly.LoadFrom()对依赖项的搜索有规则,如果目标dll依赖其他程序集,要确保这些依赖文件和目标dll在同一目录,或者在当前应用的可搜索路径中。
- 用
处理私有类的反射访问权限
就算成功找到私有类型,后续访问它的构造函数、方法时也需要指定正确的BindingFlags来突破访问限制。比如创建私有类实例的示例代码:// 获取私有无参构造函数 var constructor = serviceHelper.GetConstructor( BindingFlags.Instance | BindingFlags.NonPublic, null, Type.EmptyTypes, null); // 创建实例 var instance = constructor.Invoke(null);检查程序集的版本与兼容性
确认目标X.Y.Z.dll的.NET版本和当前应用的运行时版本是否兼容(比如当前用.NET 7,目标dll是.NET Framework 4.6.1可能会有加载问题)。另外,如果程序集是强签名的,要确保当前应用和目标dll的签名信息匹配,否则也会导致加载失败。
内容的提问来源于stack exchange,提问作者Gourango Ghosh
相关产品推荐
相关产品推荐

