使用来自程序集的不同版本的相同类

时间:2013-12-06 13:45:18

标签: .net assemblies versioning

我有一个关于.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组件的要求加载和使用。

现在发生了什么:

  1. 如果我调用Lib1 MakeFrameworkClass并将结果传递给Lib1 ProcessFrameworkClass,它显然有效。仅使用Lib2时也是如此。
  2. 如果我使用Activator.CreateInstance实例化FrameworkClass 1.0.0.0并将其转换为FrameworkClass 2.0.0.0(如上面链接中的示例所示),它显然会失败。这是有道理的,因为FrameworkClass 1.0.0.0和FrameworkClass 2.0.0.0实际上是不同的类型,彼此不可分配。到目前为止一直很好......
  3. 但是:如果我从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);
    
  4. 我不明白#3如何运作。我通过输出AssemblyQualifiedName来验证,我从MakeFrameworkClass调用得到的实例是正确的版本,具体取决于使用的是什么Lib。当然,如果我使用其他Lib进行ProcessFrameworkClass调用,它必须期望另一个版本的FrameworkClass。这些应该是不同的类型。为什么我没有像链接示例那样得到异常?

0 个答案:

没有答案