Bezdepbonusu7Программирование: статьи и ответы

Вопрос

.Net. Существуют ли потенциальные проблемы, когда две версии одной и той же сборки загружаются в один AppDomain?

Автор вопроса: Jeff CyrОтветов: 1

Мы разработали стратегию обеспечения обратной совместимости, когда между двумя версиями происходят критические изменения. Мы загружаем сборки предыдущей версии в текущий домен приложения, десериализуем некоторые данные со старыми типами версий и затем конвертируем их в их эквивалент в новой версии.

  1. Есть ли в этом подходе подводные камни, о которых мне следует знать?
  2. Что произойдет, если я попытаюсь загрузить тип путем отражения, когда его версия сборки опущена, всегда ли он будет загружать последнюю версию типа, если в текущем домене приложения существуют две его версии?

Изменить:

Вот сценарий вопроса №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 при десериализации типов, которые существуют в двух загруженных версиях одной и той же сборки.

versioningappdomainassemblies

Ответы

Ответ 1 · рейтинг 1 · Hans Passant

Я буду работать, исходя из предположения, что вы используете Assembly.LoadFile (). Отражение не может доставить вам неприятностей, ему нужна ссылка на сборку, чтобы сдвинуть дело с мертвой точки. Ваш код контролирует, когда решает, какую ссылку на сборку использовать. Ясно, что вам понадобится тот, который вы получили при предыдущем вызове LoadFile (), если вы хотите загрузить тип из старой версии.

В противном случае вызов LoadFile () не может испортить какие-либо другие решения сборки, сборка загружается без контекста загрузки.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы