代码之家  ›  专栏  ›  技术社区  ›  Jeff Cyr

.Net在一个AppDomain中加载同一程序集的两个版本时是否存在潜在问题?

  •  2
  • Jeff Cyr  · 技术社区  · 16 年前

    我们已经提出了一个策略,当两个版本之间发生重大变化时,可以处理向后兼容性。我们在当前AppDomain中加载以前的版本程序集,用旧版本类型反序列化一些数据,然后在新版本中将这些数据转换为等价的数据。

    1. 这种方法有什么我应该注意的缺陷吗?
    2. 如果我尝试通过反射加载一个类型,而忽略了它的程序集版本,那么会发生什么情况?如果当前AppDomain中存在该类型的两个版本,它是否总是加载该类型的最新版本?

    下面是问题2的场景,

    这两个程序集加载在同一AppDomain中:

    • MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089
    • MyAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089

    两个程序集都定义了类型 MyAssembly.MyType .

    Type t = Type.GetType("MyAssembly.MyType, MyAssembly, Culture=neutral, PublicKeyToken=b17a5c561934e089");
    

    这个电话一定会回吗 MyAssembly.MyType, MyAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089 ?

    BinaryFormatter.AssemblyFormat = FormatterAssemblyStyle.Simple 反序列化同一程序集的两个加载版本中存在的类型时。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Hans Passant    16 年前

    我将假定您使用Assembly.LoadFile()。反射并不能真的让你陷入麻烦,它需要一个程序集引用来启动程序。当您的代码决定要使用什么程序集引用时,它就处于控制之中。显然,如果要从旧版本加载类型,则需要从上一次对LoadFile()的调用中获得的类型。