Сборки publisher policy

70

Следующим моментом, который мы рассмотрим относительно конфигурирования сборок, является роль так называемых сборок политик издателя (publisher policy assemblies). За счет создания файлов *.config можно заставить исполняющую среду использовать какую-то конкретную версию разделяемой сборки, обходя ту, что упоминается в манифесте клиента. Все это замечательно, но давайте представим, что для выполнения обязанностей администратора требуется переконфигурировать все клиентские приложения на текущей машине так, чтобы в них использовалась сборка fontinfo.dll именно версии 2.0.0.0. Из-за строгих правил по именованию конфигурационных файлов, придется дублировать одно и то же XML-содержимое во множестве мест (при условии, что места, в которых находятся использующие fontinfo исполняемые файлы, действительно известны). Очевидно, что это будет настоящим кошмаром!

Политики издателя позволяют "издателю" конкретной сборки (в роли которого может выступать отдельный программист, подразделение или целая компания) поставлять двоичную версию файла *.config, подлежащую установке в GAC вместе с более новой версией соответствующей сборки. Преимущество такого подхода состоит в том, что при его применении добавлять отдельные файлы *.config в каталоги клиентских приложений не нужно. Вместо этого CLR-среда будет считывать текущий манифест и пытаться найти запрашиваемую версию сборки в GAC. Однако если CLR-среда обнаружит там сборку политик издателя, она прочитает содержащиеся в ней XML-данные и выполнит запрашиваемое перенаправление на уровне GAC.

Создавать сборки политик издателя можно в командной строке с помощью такой поставляемой в .NET утилиты, как al.exe (assembly linker — редактор связей сборки). Эта утилита поддерживает множество опций, но для создания сборки политик издателя ей требуется передать только следующие сведения:

Чтобы создать сборку политик издателя для библиотеки fontinfo.dll, выполните следующую команду (должна вводиться в одной строке):

al /link: fontinfo.xml /out:policy.1.0.fontinfo.dll /keyf:С:\FontInfo\KeyPair.snk /v:1.0.0.0

В команде указано, что необходимое XML-содержимое находится в файле по имени fontinfo.xml. Имя выходного файла (которое должно обязательно соответствовать формату policy. <старший номер>.<младший номер>.<имя конфигурируемой сборки>) задано с помощью флага /out. Кроме того, обратите внимание, что имя файла, в котором содержатся значения открытого и секретного ключей, тоже должны быть указаны с помощью флага /keyf. Помните, что файлы политик издателя являются разделяемыми и потому должны обязательно иметь строгие имена!

В результате выполнения данной команды создается новая сборка, которую далее можно помещать в GAC, принуждая всех клиентов использовать библиотеку fontinfo.dll версии 2.0.0.0, без создания отдельных конфигурационных файлов для каждого клиентского приложения. Благодаря такому подходу, несложно обеспечить перенаправление в масштабах всей машины для всех приложений, использующих конкретную версию (или набор версий) существующей сборки.

Отключение политик издателя

Теперь предположим, что (исполняя обязанности системного администратора) была развернута сборка политик издателя (и новейшая версия соответствующей сборки) в GAC на клиентской машине. При этом, как обычно бывает, девять из десяти задействованных приложений переключились на использование версии 2.0.0.0 безо всяких проблем, а одно (по ряду причин) при получении доступа к fontinfo.dll версии 2.0.0.0 постоянно выдает ошибку (как известно, создание программного обеспечения с полной обратной совместимостью практически невозможно).

В подобных случаях в .NET можно создавать для проблемного клиента конфигурационный файл, указывающий CLR-среде игнорировать наличие любых установленных в GAC файлов политик издателя. Остальные клиентские приложения, способные работать с новейшей версией сборки .NET продолжают перенаправляться должным образом через установленную сборку политик издателя. Чтобы отключить политики издателя на уровне отдельных клиентов, необходимо создать файл *.config (с соответствующим именем), добавить в него элемент <publisherPolicy> и установить в нем атрибут apply в no. После этого CLR-среда начинает снова загружать ту версию сборки, которая была изначально указана в манифесте клиента:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.vl">
      <publisherPolicy apply="no" />
    </assemblyBinding>
  </runtime>
</configuration>
Пройди тесты
Лучший чат для C# программистов