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

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

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


person Jeff Cyr    schedule 17.02.2010    source источник


Ответы (1)


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

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

person Hans Passant    schedule 17.02.2010
comment
Я использую Assembly.LoadFile для загрузки сборок предыдущей версии, но меня беспокоит, когда используется Assembly.Load или Type.GetType, когда версия сборки опущена. Обновил вопрос. - person Jeff Cyr; 17.02.2010
comment
Я специально обратился к этому в своем ответе: иначе не могу ничего испортить. - person Hans Passant; 17.02.2010
comment
Хорошо, у вас есть какие-либо ссылки или объяснения, почему иначе нельзя испортить? - person Jeff Cyr; 17.02.2010
comment
Контекст загрузки сборки Google. - person Hans Passant; 17.02.2010
comment
Лучшая документация по контексту загрузки: blogs.msdn.com/ suzcook / archive / 2003/05/29 / 57143.aspx. В принципе, если вы используете другой способ, кроме Assembly.Load (), вам необходимо подписаться на AppDomain.AssemblyResolve, чтобы избежать проблем. - person erikkallen; 18.02.2010
comment
Я немного почитал. Я думаю, что загрузка сборки частичного имени будет работать для текущей версии, но все будет запутано, если предыдущая версия, загруженная с помощью Assembly.LoadFile, полагалась на загрузку сборки частичного имени, поскольку она загружала бы версию текущего типа вместо предыдущей. - person Jeff Cyr; 18.02.2010
comment
Но этого не произошло, вы используете LoadFile (). - person Hans Passant; 18.02.2010
comment
Ганс, означает ли это, что пока я использую Assembly.LoadFile("v1").CreateInstance("SomeType") & Assembly.LoadFile("v2").CreateInstance("SomeType"), результирующие экземпляры будут иметь одинаковые имена типов, но на самом деле будут разными типами из разных версий, выполняя другой код? Изменится ли это, если я загружу сборки из byte[] вместо файла? Наконец, если две библиотеки DLL имеют одинаковую версию сборки, но разный код (разработчик не обновлял версию asm) и загружаются с разными именами файлов, останутся ли сборки и экземпляры типов, созданные непосредственно из сборок, изолированными? - person JoeBrockhaus; 27.11.2014