什么时候.Net接口被认为是等价的?

时间:2013-06-18 10:18:59

标签: c# interface assemblies

我正在编写代码来实现插件式架构。我已经定义了一个接口,让我们在命名空间IThing中调用它MyStuff,插件和我也有代码从DLL动态创建插件的实例。我的代码通过查看暴露类,字段和方法并最终测试它找到的内容来完成此任务:

if (typeof(IThing).IsAssignableFrom(instType))

这很好,当我自己的代码中的某些东西实现接口时,即可以引用提供MyStuff.IThing定义的程序集。

另一家位于不同国家/地区的公司的开发人员正在编写可插拔组件。

我将MyStuff.IThing的接口定义(即C#源)发送给开发人员,并将其包含在他的代码中。

我们首先看到的问题是,即使它实现了MyStuff.IThing,他的组件也会失败上述IsAssignableFrom测试。失败的原因似乎是他在不同的程序集中(自然地)具有接口定义,即使它具有相同的命名空间并且接口定义没有改变。这里的解决方案很简单,就是我向他发送包含接口的汇编DLL。

我的问题是:鉴于命名空间匹配且接口定义相同,为什么它在哪个程序集中找到它是否重要?如果程序集A包含MyStuff.IThing与程序集B中的MyStuff.IThing具有完全相同的接口定义,为什么这些程序集不能与希望使用MyStuff.IThing实例的应用程序互换?

2 个答案:

答案 0 :(得分:3)

  

鉴于命名空间匹配且接口定义相同,为什么它在哪个程序集中找到它?

将这些接口视为等效的选择会使得比较接口变得更加困难:而不是比较一组固定的项目(即限定名称和程序集),CLR需要比较限定名称和所有列表属性和所有方法,以及它们的参数类型,这将是递归的。这样做会非常慢,特别是如果你想要一致地做,并将类和struct包含在类似的比较方案中。

注意:与其他国家/地区的开发人员共享DLL时,请确保程序集中包含strong name。这将确保您链接到同一个程序集,并尽早检测到不匹配。例如,如果您更改了界面,但是其他开发人员向您发送了使用旧DLL编译的插件,则插件将无法加载。

答案 1 :(得分:0)

.NET不会检查属性及其类型,并对等效性做出结论。

在您的情况下,最简单的方法是将您的接口放在类库中,并与那些想要实现接口的人共享该DLL。