Загрузка нескольких версий одной и той же сборки - PullRequest
17 голосов
/ 15 декабря 2010

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

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

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

Ответы [ 4 ]

12 голосов
/ 15 декабря 2010

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

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

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

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

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

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

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

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

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

0 голосов
/ 15 декабря 2010

Есть запись в блоге с решением здесь , также обратитесь к этой теме SO Загрузка различных версий одной и той же сборки

0 голосов
/ 15 декабря 2010

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

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

...