插件加载时IPlugIn接口强制转换抛出Invalid Cast Exception原因排查
以下是几种可能导致该异常的核心原因:
接口程序集被重复加载:主应用和插件可能各自加载了一份
CorePlugIn.dll,导致IPlugIn类型处于不同的程序集加载上下文。CLR会将同一程序集的不同加载实例视为完全不同的类型,哪怕代码完全一致,强制转换也会失败。比如插件项目把CorePlugIn.dll复制到了自身输出目录,主应用同时也加载了原路径下的该文件,两者的加载上下文独立,类型无法兼容。插件未同步接口变更:如果
CorePlugIn.dll中的IPlugIn接口有过修改(比如新增方法、修改签名),但插件项目没有重新引用更新后的程序集并重新编译,就会出现插件类实现的是旧版接口,而主应用使用的是新版接口的情况,此时类型转换必然失败。插件加载方式导致的上下文隔离:使用
Assembly.LoadFile加载插件时,CLR会为该程序集创建独立的加载上下文,插件中的类型与主应用中同一程序集的类型无法互相转换。建议改用Assembly.LoadFrom,或者使用应用程序域来管理插件加载,确保共享的CorePlugIn.dll被加载到同一个上下文。泛型/嵌套类型的上下文不匹配:如果
IPlugIn是泛型接口,或者包含嵌套类型,可能因为泛型参数、嵌套类型来自不同的程序集加载实例,导致CLR判定类型不兼容,进而转换失败。隐性访问权限问题:如果
AisCorePlugIn是内部类(internal),主应用通过反射获取实例后,虽然能拿到对象,但由于CLR的类型访问规则,可能无法正常转换为公共的IPlugIn接口。这种情况编译时通常会有警告,但反射绕过访问检查后可能触发隐性的类型识别错误。
内容的提问来源于stack exchange,提问作者coexire

