.Net Есть ли потенциальные проблемы, когда две версии одной сборки загружаются в один домен приложений? - PullRequest
2 голосов
/ 17 февраля 2010

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

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

Edit:

Вот сценарий вопроса № 2,

Эти две сборки загружаются в одном домене приложений:

  • 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 Ответ

1 голос
/ 17 февраля 2010

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

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

...