【发布时间】:2012-11-21 05:38:06
【问题描述】:
我之前在 C# 中为一个运行良好的插件系统做过这个,这就是为什么我不明白为什么这个新的、独立的插件系统不能按我预期的方式运行。
我有我的插件程序集——我们称之为“plugin.dll”,我有我的主程序集——我们称之为 App.exe。
我有一个名为IMyObject 的接口及其实现MyObject,两者都在plugin.dll 中定义。我已将 IMyObject(插件开发人员提供给我)的确切代码文件复制到我的主 App.exe 程序集中。
当我尝试将使用反射加载的对象投射到对象实现的接口时,我得到一个InvalidCastException。我知道对象实现了它,因为
t.GetInterface(typeof(IMyObject).FullName) != null
是真的。我也可以在 Visual Studio 的对象资源管理器中浏览MyObject,我可以看到它实现了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
}
}
我现在所做的与我之前实现的方式之间唯一的区别是接口是在两个单独的程序集中定义的(即使代码文件相同并且它们属于同一个命名空间)。
这就是我麻烦的原因吗?如果是这样,我怎样才能连接到我的插件而不在编译时链接,并使用插件本身定义的接口?
除了界面之外,我应该补充一点,我无法访问插件的源代码。
【问题讨论】:
-
您是否考虑过可以同时引用的第三个程序集?我不能 100% 确定您尝试做的事情会“正常工作”。
-
这就是我以前做过一次的方式并且有效,但是这一次,情况是我无法访问除接口本身之外的插件代码。
-
你说的没有任何意义。您不需要访问插件代码。您公开一个接口并从程序集中加载实现该接口的类型。然后您针对接口调用函数..这如何转换为“您需要访问插件代码”..?
-
我不是说难。如果我可以访问代码,我确实可以添加一个公共的第三个程序集,并且我的主程序集和插件都可以引用该公共程序集。正如我所说,我无权访问插件代码,因此无法自己编译插件。
-
那么,您试图通过复制该程序集中的接口并动态加载它来从另一个程序集中加载一段代码?你怎么知道这个接口存在于另一个程序集中?
标签: c# plugins interface late-binding .net