2

我正在编写代码来实现一种插件类型的架构。我已经为插件定义了一个接口,让我们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

4

2 回答 2

3

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

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

注意:当您与其他国家/地区的开发人员共享 DLL 时,请确保您的程序集具有强名称。这将确保你们都链接到同一个程序集,并及早检测到不匹配。例如,如果您更改了界面,但其他开发人员向您发送了一个使用旧 DLL 编译的插件,则该插件将无法加载。

于 2013-06-18T10:25:31.750 回答
0

.NET 不检查属性及其类型并得出等价结论。

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

于 2013-06-18T10:34:50.510 回答