Загрузка нескольких версий одной и той же сборки
Я работаю с сторонней сборкой, и, к сожалению, теперь мне нужно загрузить свою последнюю и предыдущую версию в мой проект, поэтому во время выполнения я могу решить, какой из них загрузить. Мне нужен только один, не оба.
Учитывая это, я также зависим от типов, предоставляемых компонентами, поэтому я не могу каждый раз загружать от рефлексии и запроса для метода/событий/интерфейсов, которые я хочу использовать. Я видел некоторые упоминания об обработке этого через AppDomain
, но не уверен, как действовать дальше.
Будет ли процесс кодироваться с одной версией компонента, а затем во время выполнения (с использованием AppDomain
) swap в правильной DLL, которую я хочу использовать? Так что я бы справился с этим при запуске?
Ответы
Ответ 1
Если обе сборки совместимы, вы можете определить в файле app.exe.config или web.config, чтобы всегда использовать новую версию, объявив bindingRedirect.
Пример
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v1.0.3705">
<dependentAssembly>
<assemblyIdentity name="Regcode" publicKeyToken="b03f5f7f11d50a3a" culture=""/>
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.0.3300.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
эта запись конфигурации для dotnet 1.0 сообщает загрузчику asembly всегда использовать версию 1.0.3300.0 независимо от того, что скомпилировано в вызывающий exe. То же самое возможно с более новыми версиями dotnet
Ответ 2
Вот пара сообщений отсюда на SO, которые описывают, как загружать несколько версий одной и той же сборки:
В этом сообщении описывается, как ссылаться на две разные версии log4net. См. Комментарий @Joe B. в соответствии с принятым ответом для более подробной информации о том, как он решил свою проблему.
Сторонние библиотеки относятся к различным версиям log4net.dll
Этот ответ относится к этой ссылке:
Использование разных версий одной и той же сборки в одной папке
Внутри этого потока есть предостережение о загрузке разных версий одной и той же сборки в том же контексте и ссылки на эту ссылку в MSDN:
http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions
Вот еще один ответ с предложением AssemblyResolve:
Ссылка на две равные сборки, только открытые ключи отличаются
Ответ 3
Если у вас есть две разные версии одного и того же компонента, это означает, что обе версии могут отличаться не только от реализации, но и от количества операций, которые они выставляют? Если это так, как вы можете переключать версии, если какая-то функциональность есть только в одной из двух версий?
В любом случае, если вы хотите загрузить две версии, вам нужно будет сделать это в двух отдельных доменах приложений, потому что тогда вы можете выгрузить тот, который вам не понадобится впоследствии. Затем вы можете выполнить свою логику в правильном домене приложения, как описано в Как создать домен приложения и запустить в нем мое приложение?.
Ответ 4
Здесь есть запись в блоге с решением здесь, также см. этот поток SO Загрузка различных версий одной и той же сборки