Проблема загрузки сборки бок о бок

У меня есть простое приложение, которое загружает две сборки во время выполнения из 2 подпапок через этот фрагмент кода:

Assembly.Load("A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Assembly.Load("B, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

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

TheApp.exe -> A.dll -> C.dll (version 2.0.0.0)
           -> B.dll -> C.dll (version 1.0.0.0)

Обратите внимание, что C.dll подписано, поэтому обе версии должны загружаться бок о бок.

Чтобы приложение загружало сборки из нужных мест, я добавил следующее в файл конфигурации приложения:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="B;A" />
    </assemblyBinding>
  </runtime>
</configuration>

Проблема в том, что приложение при запуске вылетает с сообщением ниже:

=== Pre-bind state information ===
LOG: User = ...
LOG: DisplayName = C, Version=2.0.0.0, Culture=neutral, PublicKeyToken=93a02044a09d059a
 (Fully-specified)
LOG: Appbase = file:///D:/Temp/TheApp/bin/Debug/Test/
LOG: Initial PrivatePath = NULL
Calling assembly : A, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: D:\Temp\TheApp\bin\Debug\Test\TheApp.exe.Config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: C, Version=2.0.0.0, Culture=neutral, PublicKeyToken=93a02044a09d059a
LOG: Attempting download of new URL file:///D:/Temp/TheApp/bin/Debug/Test/C.DLL.
LOG: Attempting download of new URL file:///D:/Temp/TheApp/bin/Debug/Test/C/C.DLL.
LOG: Attempting download of new URL file:///D:/Temp/TheApp/bin/Debug/Test/B/C.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

ВОПРОС . Почему среда выполнения смотрит только на папку «B»? Почему он не продолжает искать нужную версию общей сборки в папке A?

EDIT1 : я добавил тег <codeBase>, как указано ниже, я знаю, что в моей конфигурации есть следующее файл:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <probing privatePath="B;A" />
    </assemblyBinding>
    <dependentAssembly>
       <assemblyIdentity name="C" publicKeyToken="93a02044a09d059a" /> 
       <codeBase version="1.0.0.0" href="B/C.dll"/>
       <codeBase version="2.0.0.0" href="A/C.dll"/>
    </dependentAssembly>
  </runtime>
</configuration>

Тем не менее, проблема сохраняется!

7 голосов | спросил GETah 19 FebruaryEurope/MoscowbTue, 19 Feb 2013 12:16:42 +0400000000pmTue, 19 Feb 2013 12:16:42 +040013 2013, 12:16:42

1 ответ


0

См. примечание на этой MSDN-странице, посвященной проверке, которая напрямую касается Ваша проблема:

  

Если у вас есть несколько версий сборки в каталоге, и вы хотите сослаться на определенную версию этой сборки, вы должны использовать <codeBase>

Среда выполнения ищет версию 2.0.0.0, но находит версию 1.0.0.0 и перестает искать.

Окончательное решение - изменить файл конфигурации следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <probing privatePath="B;A" />
     <dependentAssembly>
       <assemblyIdentity name="C" publicKeyToken="93a02044a09d059a" /> 
       <codeBase version="1.0.0.0" href="B/C.dll"/>
       <codeBase version="2.0.0.0" href="A/C.dll"/>
     </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
ответил Mike Zboray 19 FebruaryEurope/MoscowbTue, 19 Feb 2013 12:30:01 +0400000000pmTue, 19 Feb 2013 12:30:01 +040013 2013, 12:30:01

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132