我正在编写代码来实现插件类型的架构。我已经为插件定义了一个接口(interface),我们在命名空间 MyStuff
中将其称为 ITing
,并且我还拥有用于动态创建插件实例的代码一个DLL。我的代码通过查看公开的类、字段和方法并最终测试它找到的内容来实现此目的:
if (typeof(IThing).IsAssignableFrom(instType))
当接口(interface)由我自己的代码中的某些内容实现时,这一切都很好并且工作正常,即引用提供 MyStuff.IThing
定义的程序集。
位于不同国家/地区的另一家公司的另一位开发人员正在编写可插入组件。
我将 MyStuff.IThing
的接口(interface)定义(即 C# 源代码)发送给开发人员,他将其包含在自己的代码中。
我们首先看到的问题是,即使他的组件实现了 MyStuff.IThing
,也会无法通过上述 IsAssignableFrom
测试。失败的原因似乎是他在不同的程序集中(自然地)具有接口(interface)定义,即使它具有相同的命名空间并且接口(interface)定义没有改变。这里的解决方案很简单,就是我将包含接口(interface)的程序集 DLL 发送给他。
我的问题是:鉴于命名空间匹配并且接口(interface)定义相同,为什么它在哪个程序集中找到很重要?如果程序集 A 包含的 MyStuff.IThing
与程序集 B 中的 MyStuff.IThing
具有完全相同的接口(interface)定义,那么为什么这些程序集对于想要实现以下目的的应用程序不能互换:使用 MyStuff.IThing
的实例?
最佳答案
given that the namespace matches and the interface definition is identical, why should it matter which assembly it is found in?
选择将这些接口(interface)视为等效将使比较接口(interface)变得更加困难:CLR 需要比较限定名称和所有项目的列表,而不是比较一组固定的项目(即限定名称和程序集)属性和所有方法,以及它们的参数类型,这将是递归的。这样做会非常慢,特别是如果您想要一致地执行此操作并将类和struct
包含到类似的比较方案中。
注意:当您与其他国家/地区的开发人员共享 DLL 时,请确保您的程序集具有 strong name 。这将确保你们都链接到同一个程序集,并尽早检测到不匹配。例如,如果您更改了界面,但其他开发人员向您发送了一个使用旧 DLL 编译的插件,则该插件将无法加载。
关于c# - .Net 接口(interface)何时被视为等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17166377/