我以前在 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
}
}
我现在所做的和我之前实现的方式之间唯一的区别是接口是在两个单独的程序集中定义的(即使代码文件是相同的并且它们属于同一个命名空间)。
这就是我麻烦的原因吗?如果是这样,我如何连接到我的插件而不在编译时链接,并使用插件本身定义的接口?
我应该补充一点,除了界面之外,我无权访问插件的源代码。