我在C#这样做之前的插件系统的正常工作,这就是为什么我很困惑,为什么这个新的,独立的插件系统不工作我所期望的方式。
我有我的插件组装 - 我们称之为“plugin.dll”我有我的主要部件 - 姑且称之为APP.EXE。
我有一个名为接口IMyObject
及其实现, MyObject
无一不是在plugin.dll定义。 我已经复制了确切的代码文件IMyObject
(该插件开发者提供给我)到我的主要APP.EXE组装。
我得到一个InvalidCastException
,当我尝试我加载使用反射对象映射到该对象实现的接口。 我知道对象实现它,因为
t.GetInterface(typeof(IMyObject).FullName) != null
是真的。 我还可以浏览MyObject
在Visual Studio中的对象资源管理器,我可以看到它实现IMyObject
。
这里的地方出了问题:
if (ifaceType != null)
{
ConstructorInfo constructor = ifaceType.GetConstructor(new Type[] { });
if (constructor != null)
{
object obj = constructor.Invoke(null); // this works - obj is assigned an
// instance of MyObject
IMyObject myObj = (IMyObject)obj; // triggers InvalidCastException
}
}
我可以什么我现在做的和我之前实施这种方式之间看到的唯一区别是 , 接口是两个独立的组件定义 (即使代码文件是相同的,它们属于同一个命名空间)。
这是我的麻烦的原因是什么? 如果是这样,我怎么可以连接到我的插件没有在编译时链接,并使用在插件本身定义的接口?
我要补充的是,除了界面,我没有访问该插件的源代码。