Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有不同版本的两个匹配接口的可分配性_C#_.net_Reflection_Interface - Fatal编程技术网

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

C# 具有不同版本的两个匹配接口的可分配性,c#,.net,reflection,interface,C#,.net,Reflection,Interface,我有两个程序集,它们具有相同的名称和same公钥令牌。 两个程序集在相同的命名空间中都包含具有相同名称的相同接口 这两个程序集之间的唯一区别是它们的版本(1.0.0 vs 1.0.1) 但是打电话的时候 bool assignable1 = typeof(Interface1).IsAssignableFrom(typeof(Interface2)); bool assignable2 = typeof(Interface2).IsAssignableFrom(typeof(Interface1

我有两个程序集,它们具有相同的名称和same公钥令牌。 两个程序集在相同的命名空间中都包含具有相同名称的相同接口

这两个程序集之间的唯一区别是它们的版本(1.0.0 vs 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
接口,应该可以工作。

不,不应该。版本很重要。它们只是两个不同背景下的两个不同类

我想知道你的代码是否真的能工作,因为你不能在一个
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>



然后,实现旧版本的
ClassLibrary1
接口的
ClassLibrary2
应该可以工作。

接口1在Assembly_1中定义,接口2在Assembly_2中定义?您是否在AppDomain中加载了这两个程序集?如果是,那么您将面临一个.Net反射错误,简言之,它看起来是这样的:如果您有一些接口并将两个LIB加载到AppDomain中,那么.Net无法解析此接口,因此像(IInterface)对象这样的强制转换将不起作用,而且assignable也不起作用。检查这个,希望我不正确。如何加载这两个程序集?你能给出更多的上下文吗?是的,接口1来自第一个程序集,接口2来自第二个程序集。我使用“Assembly.LoadFrom(filname)”和“Assembly.GetType(name)”加载这两个程序集。问题仍然存在:为什么您希望能够加载同一程序集的两个不同版本,并能够在这两个版本之间分配类型?您已经在动态加载程序集(显然),因此这两种类型都不会编译到主程序中。在什么情况下,这两种不同类型的实例会相遇?字面上的问题(“这不是工作吗”)被简单地回答为“不”。但是有了更多的上下文,您可能会得到您和其他人实际使用的答案。Interface1在Assembly_1中定义,interface2在Assembly_2中定义?您在AppDomain中加载了这两个程序集了吗?如果是,那么您将面临一个.Net反射错误,简言之,它看起来是这样的:如果您有一些接口并将两个LIB加载到AppDomain中,那么.Net无法解析此接口,因此像(IInterface)对象这样的强制转换将不起作用,而且assignable也不起作用。检查这个,希望我不正确。如何加载这两个程序集?你能给出更多的上下文吗?是的,接口1来自第一个程序集,接口2来自第二个程序集。我使用“Assembly.LoadFrom(filname)”和“Assembly.GetType(name)”加载这两个程序集。问题仍然存在:为什么您希望能够加载同一程序集的两个不同版本,并能够在这两个版本之间分配类型?您已经在动态加载程序集(显然),因此这两种类型都不会编译到主程序中。在什么情况下,这两种不同类型的实例会相遇?字面上的问题(“这不是工作吗”)被简单地回答为“不”。但是有了更多的上下文,你可能会得到一个你和其他人都可以使用的答案。我该怎么做才能使它们成为相同的类型呢?一定有可能在不破坏所有使用程序集的应用程序的兼容性的情况下,将我的程序集更新为新版本,对吗?@Boris:为什么要这样做,你需要什么,也许有更好的解决方案?我有两个官方程序集(v1.0.0和v1.0.1)包含相同的接口。我的任务是提供一个实现v1.0.1接口的程序集。但是我的类也应该能够从v1.0.0转换为接口,因为两个接口是相同的。@Ricardo是对的。不能将
Interface1
分配给C#中的
Interface2
,即使它们代表具有相同签名的同一组方法;即使他们在同一个集会上。这实际上是两种不同的类型。C#还没有那种duck类型。@Boris:你可以使用composition,一个类实现接口(1.0.0版),另一个类实现接口(1.0.1版)。现在有一个类实例化这些类并在它们之间切换。我需要做什么才能使它们成为相同的类型?一定有可能在不破坏所有使用程序集的应用程序的兼容性的情况下,将我的程序集更新为新版本,对吗?@Boris:为什么要这样做,你需要什么,也许有更好的解决方案?我有两个官方程序集(v1.0.0和v1.0.1)包含相同的接口。我的助教