我在项目(MyProject)中有一段代码,它包含来自引用程序集的早期绑定对象(我们称之为CommonAssembly):
Dim myObject As CommonAssembly.MyEarlyBoundType
现在我有另一个动态加载的程序集,因为它不存在于所有项目中:
Dim myLateBoundObject As Object = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("Utils", "Utils.MyLateBoundType")
MyLateBoundType派生自CommonAssembly.MyEarlyBoundType,我想将myObject强制转换为myLateBoundObject,然后以编程方式调用其他成员方法 通过反思。 我曾经想过通过提取myLateBoundOject的类型并将myObject强制转换为myLateBoundObject,这样可行,但CType()和DirectCast()方法都不会接受提取的类型,引用“关键字不命名类型”错误:
myLateBoundObject = DirectCast(myObject, GetType(myLateBoundObject))
我不完全确定为什么动态加载的类型不能用于DirectCast(非常确定它不是类型安全检查?)方法,因为如果在“MyPrjoect”中引用了Utils.MyLateBoundType,我可以执行:
myLateBoundObject = DirectCast(myObject, Utils.MyLateBoundType)
没有任何问题 - 但这不是一个动态的解决方案。
有什么建议吗?
干杯,
荫
答案 0 :(得分:0)
您应该使用接口类型。使用您希望在主程序中可用的所有属性和方法,在单独的程序集中声明该类型。您的主程序和插件都将依赖它。动态类型应该继承它以提供实现。您现在可以将CreateInstance的返回值强制转换为该接口类型。