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

时间:2010-02-17 15:46:42

标签: .net assemblies versioning appdomain

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

  1. 我应该注意这种方法有什么缺陷吗?
  2. 如果我在省略汇编版本时尝试通过反射加载类型会发生什么情况,如果当前AppDomain中存在两个版本的版本,它是否会始终加载该类型的最新版本?
  3. 修改

    以下是问题#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 个答案:

答案 0 :(得分:1)

我将假设您使用Assembly.LoadFile()。反射不能真正让你陷入麻烦,它需要一个装配参考来让球滚动。在确定要使用的程序集引用时,您的代码处于控制之下。显然,如果你想从旧版本加载一个类型,你需要从之前调用LoadFile()获得的那个。

LoadFile()调用不会搞乱任何其他程序集解析,加载程序集时没有加载上下文。