Загрузка нескольких версий одной и той же сборки

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

Учитывая это, я также зависим от типов, предоставляемых компонентами, поэтому я не могу каждый раз загружать от рефлексии и запроса для метода/событий/интерфейсов, которые я хочу использовать. Я видел некоторые упоминания об обработке этого через 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

Если у вас есть две разные версии одного и того же компонента, это означает, что обе версии могут отличаться не только от реализации, но и от количества операций, которые они выставляют? Если это так, как вы можете переключать версии, если какая-то функциональность есть только в одной из двух версий?

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