具有不同版本的两个匹配接口的可分配性
本文关键字:两个 接口 可分配 版本 | 更新日期: 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
的接口应该可以工作了。
不,他们不应该。它们是不同的类型,来自不同的程序集和模块。