我有一个关于.NET运行时如何处理从同一程序集的不同版本加载的类型的问题。我知道,这通常不是推荐的做法。另外我知道严格来说,如果它们来自不同版本,它们不是同一类型。我已成功复制并且(我认为)理解了这个例子:http://blogs.msdn.com/b/thottams/archive/2007/04/11/two-versions-of-an-assembly-in-an-appdomain.aspx。
然而,我创造了另一个例子,我不明白。这就是它的样子:
汇编“框架”,有一个简单的类“FrameworkClass”。我已经使用不同的版本号编译了这个类两次,并将它们存储在单独的文件夹中。这些DLL已签名&强大的名字。
public class FrameworkClass
{
public FrameworkClass()
{
Id = Guid.NewGuid().ToString();
}
public string Id { get; private set; }
}
引用Framework 1.0.0.0的程序集“Lib1”和引用Framework 2.0.0.0的“Lib2”。两者都实现方法“MakeFrameworkClass”来实例化并返回FrameworkClass,并使用“ProcessFrameworkClass”来接收FrameworkClass并以某种方式处理它。所以Lib1可以创建和处理FrameworkClass 1.0.0.0,而Lib2可以创建和处理FrameworkClass 2.0.0.0。
public class LibX
{
public FrameworkClass MakeFrameworkClass()
{
return new FrameworkClass();
}
public string ProcessFrameworkClass(FrameworkClass x)
{
return x.Id;
}
}
程序集“Main”,这是一个命令行应用程序,通过调用Lib1和Lib2中的方法并将结果写入控制台将它们连接在一起。在app.config中我使用了codeBase元素,因此两个Framework版本都按照Lib组件的要求加载和使用。
现在发生了什么:
但是:如果我从Lib1调用MakeFrameworkClass并将结果传递给Lib2的ProcessFrameworkClass,它就可以了!另外,反过来说,如果我从Lib2调用MakeFrameworkClass并将结果传递给Lib1的ProcessFrameworkClass,它就可以了!
FrameworkClass x;
x = lib2.MakeFrameworkClass();
Console.WriteLine(lib1.ProcessFrameworkClass(x) + " " + x.GetType().AssemblyQualifiedName);
x = lib1.MakeFrameworkClass();
Console.WriteLine(lib2.ProcessFrameworkClass(x) + " " + x.GetType().AssemblyQualifiedName);
我不明白#3如何运作。我通过输出AssemblyQualifiedName来验证,我从MakeFrameworkClass调用得到的实例是正确的版本,具体取决于使用的是什么Lib。当然,如果我使用其他Lib进行ProcessFrameworkClass调用,它必须期望另一个版本的FrameworkClass。这些应该是不同的类型。为什么我没有像链接示例那样得到异常?