具有不同版本的两个匹配接口的可分配性

本文关键字:两个 接口 可分配 版本 | 更新日期: 2023-09-27 18:32:41

我有两个同名的程序集和s ame 公钥标记。这两个程序集在同一命名空间中包含具有相同名称相同接口

这两个程序集之间的唯一区别是它们的版本(1.0.0 与 1.0.1)。

但是当打电话时

bool assignable1 = typeof(Interface1).IsAssignableFrom(typeof(Interface2));
bool assignable2 = typeof(Interface2).IsAssignableFrom(typeof(Interface1));

我两次都了。这些接口不应该相互分配吗?

具有不同版本的两个匹配接口的可分配性

不,他们不应该。版本很重要,很多。它们只是两个不同上下文中的两个不同类。

我想知道即使您的代码是否真的有效,因为您无法在一个AppDomain中加载两个同名的程序集.它只需要它加载的第一个。

我试图使用这个来重现你的代码:

Assembly a = Assembly.LoadFile(@"..'..'..'ClassLibrary2'bin'Debug'ClassLibrary2.dll");
//
// Last Interface1 loaded from referenced assembly
//
bool b = a.GetType("ClassLibrary1.Interface1").IsAssignableFrom(typeof(Interface1));

这永远不会起作用,除非Interface1真的完全匹配(所以版本明智)。即使您派生接口,只要版本不匹配,它就不起作用。不过,您应该能够使用assemblyBinding解决此问题。

<dependentAssembly>
    <assemblyIdentity name="ClassLibrary1" publicKeyToken="12345" />
    <bindingRedirect oldVersion="1.0.0.0-1.0.0.1" newVersion="1.0.0.1" />
</dependentAssembly>

那么你的ClassLibrary2,它实现了旧版本的ClassLibrary1的接口应该可以工作了。

不,他们不应该。它们是不同的类型,来自不同的程序集和模块。