我正在编写代码来实现一种插件类型的架构。我已经为插件定义了一个接口,让我们IThing
在命名空间中调用它MyStuff
,并且我还有从 DLL 动态创建插件实例的代码。我的代码通过查看暴露的类、字段和方法并最终测试它找到的内容来做到这一点:
if (typeof(IThing).IsAssignableFrom(instType))
当接口由我自己的代码中的某些东西实现时,这一切都很好并且工作正常,即引用提供MyStuff.IThing
定义的程序集。
另一家位于不同国家/地区的公司的另一位开发人员正在编写可插拔组件。
我将接口定义(即 C# 源代码)MyStuff.IThing
发送给开发人员,他将其包含在代码中。
我们首先看到的问题是他的组件,即使它实现了MyStuff.IThing
,也会通过上述IsAssignableFrom
测试。失败的原因似乎是他(自然)在不同的程序集中有接口定义,即使它具有相同的命名空间并且接口定义没有改变。这里的解决方案很简单,就是我将包含接口的程序集 DLL 发送给他。
我的问题是:鉴于名称空间匹配并且接口定义相同,为什么在哪个程序集中找到它很重要?如果程序集 A 包含MyStuff.IThing
与程序集 B 中完全相同的接口定义MyStuff.IThing
,为什么这些程序集对于想要使用的实例的应用程序而言不可互换MyStuff.IThing
?