2010-12-15 2 views
13

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

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

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

ответ

0

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

В любом случае, если вы хотите загрузить две версии, вам нужно будет сделать это в двух отдельных доменах приложений, потому что тогда вы можете выгрузить тот, который вам не нужен. Затем вы можете выполнить свою логику в правильном домене приложения, как описано в How do I create an application domain and run my application in it?.

4

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

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

3rd party libraries refer to different versions of log4net.dll

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

Using different versions of the same assembly in the same folder

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

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

Вот еще с ответом, который предлагает использовать AssemblyResolve: Reference two equal assemblies, only public keys differ

7

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

Смежные вопросы