我有两个同名和 ame公钥标记的程序集。 这两个程序集在相同的命名空间中包含相同的界面和同名。
两个程序集之间的唯一区别是它们的版本(1.0.0 vs 1.0.1)。
但是在打电话时
bool assignable1 = typeof(Interface1).IsAssignableFrom(typeof(Interface2));
bool assignable2 = typeof(Interface2).IsAssignableFrom(typeof(Interface1));
我两次都 FALSE 。那些接口是不是可以相互分配?
答案 0 :(得分:2)
答案 1 :(得分:2)
我想知道即使您的代码确实有效,因为您无法在一个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
应该有效。