c# - C# 中的接口(interface)和后期绑定(bind)

标签 c# plugins interface late-binding .net

我之前在 C# 中为一个工作正常的插件系统做过这件事,这就是为什么我对为什么这个新的、独立的插件系统没有按我预期的方式工作感到困惑。

我有我的插件程序集——我们称之为“plugin.dll”,我有我的主程序集——我们称之为 App.exe。

我有一个名为IMyObject 的接口(interface)及其实现MyObject,两者都在plugin.dll 中定义。我已将 IMyObject 的确切代码文件(插件开发人员提供给我)复制到我的主 App.exe 程序集中。

当我尝试将使用反射加载的对象转换为该对象实现的接口(interface)时,我得到了一个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
    }               
 }

我能看到我现在所做的和我以前实现它的方式之间的唯一区别是接口(interface)是在两个单独的程序集中定义的(即使代码文件是相同的并且它们属于同一个命名空间)。

这就是我遇到麻烦的原因吗?如果是这样,我如何在不在编译时链接的情况下连接到我的插件,并使用插件本身定义的接口(interface)?

我应该补充一点,除了界面之外,我无权访问插件的源代码。

最佳答案

尽管这些接口(interface)具有相同的代码,但它们是两个不同程序集中的两个独立接口(interface)(您可以打印它们的 AssemblyQualifiedNames 并查看差异)。

关于c# - C# 中的接口(interface)和后期绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13487016/

相关文章:

android - 在 Kotlin 中实例化接口(interface)监听器

c# - 在 C# 中返回集合时如何处理协方差?

c# - 如何在 .Net 标准类库中引用 Microsoft.VisualBasic?

c# - 64 位进程不支持 Explorer OM

Jquery 表单插件在 IE 8 中不起作用

java - 为什么要将 Java 接口(interface)方法声明为抽象的?

c# - 重载 protected 通用方法单元测试导致 AmbigeousMatchException

c# - 如何使流体阻力方程不依赖于帧速率

wordpress - 向 WooCommerce Checkout 添加一个步骤

Eclipse 插件开发——Bundle-ClassPath 定义