Как сделать так, чтобы файл политики Publisher перенаправлял запрос на сборку - PullRequest
2 голосов
/ 09 октября 2008

Я создал общую библиотеку на работе, и она установлена ​​в GAC на нашем тестовом сервере. Я недавно обновил его и хочу, чтобы все наши приложения использовали это обновление. Я создал сборку политики издателя и установил ее в GAC вместе с обновлением, но когда веб-приложение загружает Leggett.Common, 1.0.0.0, оно не перенаправляется на Leggett.Common, 1.1.0.0.

У меня есть общая сборка (на самом деле их пять, но давайте будем проще) на сетевом диске, рядом с ним я создал xml-файл политики издателя, а затем использовал al.exe для создания сборки политики издателя в та же папка. После этого я помещаю обновленную сборку в GAC, а затем помещаю сборку политики издателя в GAC.

Общая сборка - Leggett.Common.dll, файл политики издателя - 1.1.Leggett.Common.policy, сборка политики издателя - policy.1.1.Leggett.Common.dll.

XML для файла политики издателя выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Leggett.Common"
                                  publicKeyToken="32cd8f1a53a4c744"
                                  culture="neutral" />
                <bindingRedirect oldVersion="1.0.0.0"
                                 newVersion="1.1.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

Что я делаю не так?

Разъяснение
Я тестирую это на своем локальном компьютере разработчика, поскольку разработчики не имеют доступа к тестовому серверу.

Ответы [ 2 ]

2 голосов
/ 21 ноября 2008

Вы правильно идентифицируете сборку, но для всех, кто читает, укажите сборку по корню в элементе assemblyIdentity без расширения файла (например, "Fubar", а не "Fubar.dll" «).

Документация Microsoft не упоминает, что ... # $% #! (! @!

2 голосов
/ 09 октября 2008

Хорошо ... на коне ...

1 - пытались ли вы использовать Просмотр журнала привязки сборки (Fuslogvw.exe) , чтобы узнать, какая привязка сборки выполняется?

Вы можете найти его в:

C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ Bin \ FUSLOGVW.exe (с установленным VS2008).

2 - «У меня есть общая сборка (на самом деле их пять, но давайте будем проще) на сетевом диске» - обе сборки находятся на сетевом диске?

Обновление: Хорошо ... если новая сборка находится на сетевом диске, вероятно, существуют проблемы с доверием . Можете ли вы развернуть новые сборки на локальном диске на сервере, а затем переустановить в GAC?

Update2: Я знаю ... глупые вещи .... у вас определенно правильный publicKeyToken и номер версии? т. е. ваш атрибут AssemblyVersion для новой сборки определенно является 1.1.0.0, а маркер открытого ключа идентичен (в GAC)?

Вы пытались удалить атрибут культуры?

Обновление3: Привет Макс .... Можете ли вы вставить тот файл политики издателя, который вы использовали? Также ... помните, что если вы перенаправляете с версии 1.0 на сборку с более высокой версией, имя политики издателя должно называться с использованием версии major.minor сборки, с которой вы перенаправляете. Таким образом, в вашем случае политика издателя должна называться policy.1.0.Leggett.Common.dll. Я заметил, что вы назвали его «policy.1.1.Leggett.Common.dll», что может быть причиной его неработоспособности.

И, наконец, вы должны убедиться, что вы подписываете политику издателя тем же ключом, который используется сборками 1.0 и 1.1.

Я собрал пару библиотек DLL и уронил их в GAC, затем использовал консольное приложение в VS для тестирования, и он работает:)

Update4: Привет, Макс, то, о чем я никогда не думал. Когда вы создали файл политики издателя, вы указали платформу? Попробуйте построить его с помощью:

al /link:1.1.Leggett.Common.policy /out:policy.1.0.Leggett.Common.dll / keyfile: /version:1.0.0.0

Не указывайте ключ / platform и явно укажите номер версии.

Приветствия
Кев

...