C# .Net接口何时被认为是等效的?

C# .Net接口何时被认为是等效的?,c#,interface,assemblies,C#,Interface,Assemblies,我正在编写代码来实现插件类型的体系结构。我已经为插件定义了一个接口,让我们在名称空间MyStuff中将其称为IThing,我还拥有从DLL动态创建插件实例的代码。我的代码通过查看公开的类、字段和方法并最终测试它所发现的内容来实现这一点: if (typeof(IThing).IsAssignableFrom(instType)) 当接口由我自己的代码中的某个东西实现时,这一切都很好,并且工作正常,即引用提供MyStuff.IThing定义的程序集 位于不同国家的另一家公司的另一名开发人员正在编

我正在编写代码来实现插件类型的体系结构。我已经为插件定义了一个接口,让我们在名称空间
MyStuff
中将其称为
IThing
,我还拥有从DLL动态创建插件实例的代码。我的代码通过查看公开的类、字段和方法并最终测试它所发现的内容来实现这一点:

if (typeof(IThing).IsAssignableFrom(instType))
当接口由我自己的代码中的某个东西实现时,这一切都很好,并且工作正常,即引用提供
MyStuff.IThing
定义的程序集

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

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

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

我的问题是:既然名称空间匹配并且接口定义相同,那么在哪个程序集中找到它又有什么关系呢?如果程序集A包含与程序集B中的
MyStuff.IThing
接口定义完全相同的
MyStuff.IThing
,为什么这些程序集对于希望使用
MyStuff.IThing
实例的应用程序来说不可互换

既然名称空间匹配且接口定义相同,那么在哪个程序集中找到它又有什么关系呢

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


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

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


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

这很重要,因为程序集名称是标识类型的一部分。很好,谢谢。我假设正在对方法、属性等进行比较。