c# - .Net 接口(interface)何时被视为等效?

标签 c# interface assemblies

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

相关文章:

c# - Visual Studio Async CTP 必须安装在客户端机器上吗?

c# - 如何验证 DataGrid 中的 Null 或空单元格

c# - 如何将 OpenPop.NET MailMessage 转换为 System.Net.Mail.MailMessage?

C# 访问接口(interface)数组中对象的非接口(interface)方法

Java - 是否有 "convertible"接口(interface)?

c++ - 带有子类的类的纯接口(interface)

c# - Assembly.GetTypes() - ReflectionTypeLoadException

c++ - MSVCR100D.DLL 和 dependency walker

c# - 控制台应用程序平台始终为 "Active(x86)"

c# - 加载程序集无法正常工作