Как работать с несколькими версиями сборки в личных папках с помощью config?

У меня есть сценарий, где у меня есть несколько версий одной и той же сборки, которые мне нужно хранить в личных папках приложения, в такой структуре:

.\My.dll          // latest version, say 1.1.3.0
.\v1.1.1\My.dll   // version 1.1.1.0
.\v1.1.2\My.dll   // version 1.1.2.0

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

Сборки со строгим именем, и я использую эту конфигурацию в моем app.config:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="My" 
                publicKeyToken="xxxxxxxx" culture="netural" />

                <bindingRedirect oldVersion="1.0.0.0-1.1.1.0" 
                    newVersion="1.1.1.0" />
                <bindingRedirect oldVersion="1.1.3.0-1.1.65535.65535" 
                    newVersion="1.1.3.0" />

                <codeBase version="1.1.1.0" href="v1.1.1\My.dll" />
                <codeBase version="1.1.2.0" href="v1.1.2\My.dll" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

Надеюсь, я кое-что здесь упустил. Я знаю, что это можно решить с помощью кода, прослушивая событие AppDomain.AssemblyResolve, но мне бы очень хотелось увидеть чисто конфигурационное решение.

Обновление: Итак, я нашел ошибку, которая, как предположил Кент, опечатка. culture="netural" должно быть culture="neutral", Тем не менее, без опечатки, разрешение прекрасно работает при использовании codeBase элементы, которые указывают на каждую версию. Элемент зондирования, кажется, не работает в этом сценарии.

2 ответа

Решение

Не видя полного решения, я могу только предположить, что у вас есть где-то опечатка. Я просто попробовал это для себя и - с помощью fuslogvw я смог заставить его работать.

У меня есть три версии сборки, и приложение-потребитель ссылается на более старую версию, чем в своем выходном каталоге. CLR находит редиректы и запись в codeBase и загружает правильную (более старую) версию.

Я могу отправить вам свое решение по электронной почте, если вы предоставите адрес электронной почты.

Кент

Вы можете использовать пробепат? мы используем это, чтобы заставить неконтролируемых (например, сторонних распознавателей - таких как MSTest) искать сборки там, где они нам нужны.

<?xml version ="1.0"?>
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <probing privatePath="v1.1.1;v1.1.2;"/>
        </assemblyBinding>
    </runtime>
</configuration>

Смотрите здесь для получения дополнительной информации

Другие вопросы по тегам