Проблема с работой сборки политики.NET Publisher

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

Я создал ClassLibrary1.dll с простым методом, в версии 1.0.0.0. Я создал WindowsFormsApplication1, который вызывает этот метод, также в версии 1.0.0.0. Я создал соответствующие проекты установки для каждого решения и установил MSI. Пока все хорошо.

Затем я увеличил все номера версий ClassLibrary1 до 1.0.1.0. Я создал файл конфигурации для перенаправления на новую версию:

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

    <dependentAssembly>
        <assemblyIdentity name="ClassLibrary1" publicKeyToken="99e3abf647b4f724" culture="neutral" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="1.0.1.0"/>
      </dependentAssembly>

      </assemblyBinding>
  </runtime>
</configuration>

Я использовал это для создания политики издателя policy.1.0.ClassLibrary1.dll с помощью этой команды:

al /embed:ClassLibrary1.dll.config /out:Policy.1.0.ClassLibrary1.dll /keyfile:TestKey.snk /platform:anycpu /v:1.0.1.0

Я вставил это в GAC, как с помощью программы установки, так и вручную после установки DLL программой установки. Оба способа имеют одинаковый результат: gacutil /l policy.1.0.ClassLibrary1 возвращает один экземпляр политики в GAC, но при запуске программы не удается использовать новую версию.

C:\Program Files (x86)\Liberty Testing\ClassLibrary1>gacutil /l Policy.1.0.ClassLibrary1
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.0
Copyright (c) Microsoft Corporation.  All rights reserved.

The Global Assembly Cache contains the following assemblies:
  Policy.1.0.ClassLibrary1, Version=1.0.1.0, Culture=neutral, PublicKeyToken=99e3abf647b4f724, processorArchitecture=MSIL

Number of items = 1

Однако я хотел бы отметить, что поиск в C:\Windows\Assembly вручную не показывает, что сборка политики существует где-либо в этом поддереве. Я удалил все библиотеки и переустановил только новую версию, и теперь программа вылетает вместо использования новой библиотеки DLL. Вывод fuslogvw выглядит следующим образом:

*** Assembly Binder Log Entry  (6/26/2017 @ 2:31:59 PM) ***

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscorwks.dll
Running under executable  C:\Program Files (x86)\Liberty Testing\Test Form\WindowsFormsApplication1.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = DOMAIN\user
LOG: DisplayName = ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=99e3abf647b4f724
 (Fully-specified)
LOG: Appbase = file:///C:/Program Files (x86)/Liberty Testing/Test Form/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = NULL
Calling assembly : WindowsFormsApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v2.0.50727\config\machine.config.
LOG: Post-policy reference: ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=99e3abf647b4f724
LOG: The same bind was seen before, and was failed with hr = 0x80070002.
ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).

Похоже, что он вообще не смотрит на политику издателя. Мы потратили дни, пытаясь понять, что мы делаем неправильно. У кого-нибудь еще есть идеи?

1 ответ

Оказывается, проблема была в том, что мы запускали команду al.exe, когда рабочий каталог находился на подключенном диске.

У нас есть папки проекта Visual Studio на общем сетевом ресурсе, и мы настроили командную строку Visual Studio для использования pushd для автоматического сопоставления диска. В течение всего процесса не было ошибок, но конфигурация политики не была установлена ​​из-за диска карты.

Мы скопировали одну из папок локально и прошли через процесс с положительными результатами.

Поскольку мы не хотим, чтобы папки проекта были локальными, мы решили проблему, вместо этого используя powershell, который изначально поддерживает пути UNC в качестве рабочих каталогов, и все работает.

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

Создание сборки политики издателя для пользовательских библиотек

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