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

时间:2014-12-02 08:11:06

标签: c# .net reflection interface

我有两个同名 ame公钥标记的程序集。 这两个程序集在相同的命名空间中包含相同的界面同名

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

但是在打电话时

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

我两次都 FALSE 。那些接口是不是可以相互分配?

2 个答案:

答案 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应该有效。