Мы разработали стратегию обеспечения обратной совместимости, когда между двумя версиями происходят критические изменения. Мы загружаем сборки предыдущей версии в текущий домен приложения, десериализуем некоторые данные со старыми типами версий и затем конвертируем их в их эквивалент в новой версии.
- Есть ли в этом подходе подводные камни, о которых мне следует знать?
- Что произойдет, если я попытаюсь загрузить тип путем отражения, когда его версия сборки опущена, всегда ли он будет загружать последнюю версию типа, если в текущем домене приложения существуют две его версии?
Изменить:
Вот сценарий вопроса №2,
Эти две сборки загружаются в один и тот же AppDomain:
MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089MyAssembly, 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 при десериализации типов, которые существуют в двух загруженных версиях одной и той же сборки.