当两个版本之间发生重大变化时,我们已经提出了一种处理向后兼容性的策略。我们在当前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
,则会出现相同的情况。
答案 0 :(得分:1)
我将假设您使用Assembly.LoadFile()。反射不能真正让你陷入麻烦,它需要一个装配参考来让球滚动。在确定要使用的程序集引用时,您的代码处于控制之下。显然,如果你想从旧版本加载一个类型,你需要从之前调用LoadFile()获得的那个。
LoadFile()调用不会搞乱任何其他程序集解析,加载程序集时没有加载上下文。