Вопрос по assemblies, appdomain, multiple-versions, c# – Загрузка разных версий одной и той же сборки

16

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

Имея это в виду, я также зависим от типов, предоставляемых компонентами, поэтому я не могу загружать из отражения и каждый раз запрашивать метод / события / интерфейсы, которые я хочу использовать. Я видел упоминание о том, как справиться с этимAppDomainно я не уверен, как поступить.

Будет ли процесс кодировать против одной версии компонента, а затем во время выполнения (используяAppDomain) поменять в правильной DLL я хочу потребляться? Так я бы только справился с этим при запуске?

Ваш Ответ

4   ответа
0

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

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

12

Если обе сборки совместимы, вы можете определить в файле 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

5

которые описывают, как загрузить несколько версий одной и той же сборки:

Этот пост описывает, как ссылаться на две разные версии log4net. См. Комментарий @Joe B. под принятым ответом для более подробной информации о том, как именно он решил свою проблему.

Сторонние библиотеки ссылаются на разные версии log4net.dll

Этот ответ относится к этой ссылке:

Использование разных версий одной и той же сборки в одной папке

В этом потоке есть предостережение по поводу загрузки разных версий одной и той же сборки в одном и том же контексте и ссылка на эту ссылку в MSDN:

http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions

Вот еще один ответ, который предлагает использовать AssemblyResolve:Ссылка на две равные сборки, отличаются только открытые ключи

0

Похожие вопросы