2013-02-19 2 views
7

У меня есть простое приложение, которое загружает два узла во время выполнения от 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"); 

Структура каталога:
enter image description here
Таким образом, ожидаемая нагрузка это делается следующим образом:

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> 

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

+3

Для меня это выглядит, как вы создали тестовый проект, чтобы изолировать проблему. Можете ли вы загрузить его где-нибудь, чтобы другие могли играть с ним? Это, скорее всего, приведет к более быстрому ответу. –

+0

@ DanielHilgarth Действительно, это тестовый код, но я должен сделать много очистки, чтобы удалить проприетарные вещи :( – GETah

ответ

6

Смотрите примечание на this MSDN страницы зондирования, который непосредственно обращается ваш вопрос:

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

Время исполнения ищет версию 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> 
+0

Спасибо за ваш ответ, просто попробовал это. См. Мое редактирование. – GETah

+0

@ GETah Что произойдет, если вы переместите C .dll в папки, которые вообще не будут найдены путем опроса? Что-то вроде 'C \ 1.0 \ C.dll' и' C \ 2.0 \ C.dll'. –

+0

Теперь среда выполнения просматривает обе папки, A и B но не в папки с версией C, проблема сохраняется – GETah

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