Работа со сборками и глобальным кэшем сборок
Если необходимо обеспечить возможность совместного использования сборки в нескольких приложениях, то ее можно поместить в глобальный кэш сборок. Этот кэш кода уровня компьютера присутствует на любом компьютере, где установлена среда CLR. В глобальном кэше сборок сохраняются сборки, специально предназначенные для совместного использования на компьютере несколькими приложениями. Для установки в глобальном кэше сборка должна иметь строгое имя.
Имя сборки, установленной в глобальном кэше сборок, должно совпадать с именем файла (без учета расширения имени файла). К примеру, файл сборки с именем myAssembly должен иметь имя myAssembly.exe или myAssembly.dll.
Прибегать к совместному использованию сборок путем их установки в глобальном кэше сборок следует только при необходимости. Как правило, зависимости между сборками следует сохранять закрытыми, а сами сборки нужно размещать в папке приложения, если они не предназначены для совместного использования. Кроме того, установка сборок в глобальном кэше сборок для обеспечения доступа к ним с помощью COM-взаимодействия или из неуправляемого кода не является обязательной.
Существует несколько причин для установки сборки в глобальном кэше сборок.
Используемые несколькими приложениями сборки можно располагать в глобальном кэше сборок. Например, если все приложения используют сборку, расположенную в глобальном кэше сборок, то в файл Machine.config можно добавить оператор политики выбора версий, который перенаправляет ссылки на эту сборку.
Администраторы часто защищают папку systemroot с помощью списка управления доступом, определяющего права на запись и выполнение. Так как глобальный кэш сборок размещается в корневом каталоге системы, он наследует список управления доступом этого каталога. Рекомендуется разрешать удаление файлов из глобального кэша сборок только пользователям, имеющим права доступа администратора.
Управление параллельными версиями.
В глобальном кэше сборок может храниться несколько сборок, имеющих одинаковые имена, но различные сведения о версии.
Дополнительное место для поиска.
Перед проверкой или использованием сведений о базе кода в файле конфигурации среда CLR ищет в глобальном кэше сборки, соответствующие запросу.
Обратите внимание, что существуют сценарии, в которых установка сборки в глобальный кэш сборок явно не требуется. Если одна из составляющих приложение сборок помещается в глобальный кэш сборок, то после этого нельзя будет скопировать или установить приложение с помощью команды XCOPY путем копирования каталога приложения. В этом случае также требуется переместить сборку в глобальный кэш сборок.
В этом разделе
Использование обслуживаемых компонентов с глобальным кэшем сборок
Содержит сведения о том, почему обслуживаемые компоненты (управляемые компоненты COM+) следует помещать в глобальный кэш сборок.
Связанные разделы
Создание сборок
Содержит общие сведения о создании сборок.
Глобальный кэш сборок
Содержит общие сведения о глобальном кэше сборок.
Обнаружение сборок в среде выполнения
Описание того, как среда CLR находит и загружает сборки, составляющие приложение.
Программирование с использованием сборок
Описывает сборки, «кирпичики», с помощью которых создаются управляемые приложения.
Создание пакетов установки
Глобальный кэш сборок GAC (Global Assembly Cache). Утилита gacutil.exe
Все сборки, находящиеся в GAC, подписаны строгим именем — при установке сборки среда Common Language Runtime проверяет сборку на уникальность и сравнивает ее с другими, уже имеющимися сборками.
При этом появляется описание команд утилиты (рис. 9.16), среди которых нас интересуют всего три:
Управление сборками при помощи утилиты gacutil.exe — не самый удобный способ. Более широкие возможности управления сборками предоставляет консоль MMC (Microsoft Management Console), для запуска которой в окне Выполнить (Run) набираем mmc (рис. 9.17).
В появившемся окне выбираем в меню «Консоль\Добавить или удалить оснастку …» (рис. 9.18).
В открывшемся окне можно управлять сборками — добавлять их или удалять (рис. 9.20).
Не удаляйте сборки, которые вам неизвестны, — вы можете нарушить работоспособность некоторых программ!
Вопросы и ответы
При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка:
Необработанное исключение типа «System.InvalidOperationException» в System.Windows.Forms.dll
Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления «lblResult» не из того потока, в котором он был создан.
Затем:
Необработанное исключение типа «System.InvalidOperationException» в mscorlib.dll
Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.
Gacutil.exe (программа глобального кэша сборок)
С помощью программы глобального кэша сборок можно просматривать содержимое глобального кэша сборок и кэша загрузки, а также управлять им.
Эта программа автоматически устанавливается вместе с Visual Studio. Для запуска этого средства используйте Командную строку разработчика или PowerShell для разработчиков в Visual Studio.
В командной строке введите следующее.
Синтаксис
Параметры
Этот параметр аналогичен одновременному указанию параметров /i и /f.
description
Этот параметр аналогичен одновременному указанию параметров /i и /r.
description
Чтобы установить сборку, укажите параметры assemblyPath, scheme, id и description с этим параметром. Чтобы удалить сборку, укажите параметры assemblyName, scheme, id и description.
Чтобы удалить ссылку на сборку, необходимо задать те же параметры scheme, id и description с параметрами /i и /r (или /ir), которые были указаны при установке сборки. При удалении сборки она также удаляется из глобального кэша сборок, если она является последней удаляемой ссылкой и на нее не ссылаются другие ссылки в установщике Windows.
Параметр scheme задает тип схемы установки. Можно указать одно из следующих значений.
— UNINSTALL_KEY: задайте это значение, если приложение добавляется в компонент «Установка и удаление программ» операционной системы Microsoft Windows. Добавление приложений в компонент «Установка и удаление программ» осуществляется путем добавления раздела реестра в HKLM\Software\Microsoft\Windows\CurrentVersion.
— FILEPATH: задайте это значение, если приложение не добавляется в компонент «Установка и удаление программ».
— OPAQUE: задайте это значение, если раздел реестра или путь к файлу не используется для этого сценария установки. Это значение позволяет задать пользовательские сведения для параметра id.
Значение параметра id зависит от значения параметра scheme:
— Если значение параметра scheme равно UNINSTALL_KEY, укажите имя приложения, задаваемое в разделе реестра HKLM\Software\Microsoft\Windows\CurrentVersion. Например, если раздел реестра называется HKLM\Software\Microsoft\Windows\CurrentVersion\MyApp, параметр id должен иметь значение «MyApp».
— Если значение параметра scheme равно FILEPATH, параметр id должен содержать полный путь к исполняемому файлу приложения, которое устанавливает сборку.
— Если значение параметра scheme равно OPAQUE, параметр id может принимать любое значение. Значение параметра должно быть заключено в двойные кавычки («»).
В параметре description можно указать описание приложения, которое будет установлено. Эти сведения отображаются при перечислении ссылок.
description
Этот параметр аналогичен одновременному указанию параметров /u и /r.
Примечания
Чтобы использовать программу Gacutil.exe, необходимы права администратора.
С помощью программы Gacutil.exe можно устанавливать и удалять сборки из кэша и отображать содержимое кэша.
Программа Gacutil.exe включает в себя параметры, с помощью которых осуществляется подсчет ссылок, аналогичный схеме подсчета, поддерживаемой установщиком Windows. Программа Gacutil.exe позволяет устанавливать два приложения, которые, в свою очередь, устанавливают одну и ту же сборку. Программа отслеживает число ссылок на сборку. В результате сборка будет оставаться на компьютере до тех пор, пока оба приложения не будут удалены. При использовании программы Gacutil.exe для установки программных продуктов задавайте параметры, поддерживающие подсчет ссылок. Чтобы установить сборку и добавить ссылку для подсчета, укажите параметры /i и /r. Чтобы удалить подсчет ссылок для сборки, укажите параметры /u и /r. Помните, что при указании только одного параметра /i или /u подсчет ссылок осуществляться не будет. Эти параметры можно использовать во время разработки программного продукта, но не при установке готового программного обеспечения.
Для установки или удаления списка сборок, хранящегося в текстовом файле ANSI, укажите параметры /il или /ul. Содержимое текстового файла должно иметь правильный формат. Чтобы использовать текстовый файл для установки сборок, укажите путь к каждой сборке в отдельной строке файла. Ниже приведен пример содержимого файла со списком устанавливаемых сборок.
Чтобы использовать текстовый файл для удаления сборок, укажите в нем полное имя каждой сборки в отдельной строке. Ниже приведен пример содержимого файла со списком удаляемых сборок.
Попытка установить сборку с именем, количество символов в котором превышает 79 и 91 символ (включая расширение файла), может привести к следующей ошибке:
Это вызвано тем, что Gacutil.exe конструирует путь длиной до числа символов, определяемого значением MAX_PATH. Этот путь состоит из следующих элементов:
Примеры
Следующая команда устанавливает сборку mydll.dll в глобальный кэш сборок.
Следующая команда удаляет сборку hello из глобального кэша сборок, если для нее не существует подсчет ссылок.
Обратите внимание, что предыдущая команда может удалить несколько сборок из глобального кэша сборок, так как имя сборки задано не полностью. Если в кэше установлены сборки hello версий 1.0.0.0 и 3.2.2.1, команда gacutil /u hello удалит обе сборки.
Следующая команда выводит содержимое глобального кэша сборок.
Аннотация
Глобальный кэш сборок
Установка сборки в глобальном кэше сборки только при необходимости совместной сборки. Если для общего доступа к сборке явно не требуется, рекомендуется сохранять закрытые зависимости от сборки и находить сборку в каталоге приложений. Кроме того, вам не нужно устанавливать сборку в глобальном кэше сборки, чтобы сделать сборку доступной для microsoft Component Object Model (COM) или для неуправимого кода.
Сборка
Сборка содержит один или несколько компонентов кода, выполняемые общим языковым временем выполнения. Все типы и все ресурсы в одной сборке образуют индивидуальную версию устройства. Манифест сборки описывает зависимости версий, которые указаны для любых зависимых сборок. С помощью сборки можно указать правила версии между различными компонентами программного обеспечения, и эти правила можно применять во время запуска. Сборка поддерживает одностороннее выполнение. WHich позволяет одновременно запускать несколько версий.
Подписание с сильным именем
Сборка должна иметь сильное имя, которое должно быть установлено в глобальном кэше сборки. Сильное имя — это уникальный идентификатор глобального масштаба, который не может быть подменен кем-то другим. Используя сильное имя, вы не позволяете компонентам с одинаковым именем конфликтовть друг с другом или неправильно использовать их в вызываемом приложении. Подписание сборки связывает крепкое имя вместе со сборкой. Подписание сборки также называется подписью с сильным именем. Сильное имя состоит из следующих сведений:
Эти сведения хранятся в файле ключей. Ключевой файл — это файл Exchange (.pfx) или сертификат из магазина сертификатов Microsoft Windows текущего пользователя.
Вы можете подписать сборку, используя параметры на вкладке Подписание Project конструктора в Visual Studio. В Visual Studio файл ключа должен храниться в папке проекта на локальном компьютере. Visual Studio поддерживает только следующие форматы файлов:
Требования
Перед установкой сборки в кэше глобальной сборки можно выполнить следующие требования:
В этой статье предполагается, что вы знакомы со следующими разделами:
Установка сборки в глобальном кэше сборки
Этот метод основан на создании сборки с помощью Visual Studio. Чтобы создать сборку, которую можно совместно использовать несколькими приложениями, общая сборка должна иметь сильное имя. Кроме того, общая сборка должна быть развернута в глобальном кэше сборки.
Создайте новый проект библиотеки C# класса с именем GACDemo. Для этого выполните следующие действия:
Создание сильного имени и связывание файла ключа с сильным именем вместе со сборкой. Для этого выполните следующие действия:
В меню Project выберите свойства GACDemo.
На вкладке Подписи установите флажок Подписать сборку.
В диалоговом окне Create Strong Name Key выберите файл Protect my key с помощью контрольного окна пароля.
В поле имя файла Key введите GACDemo.
В поле Ввод пароля введите пароль, который необходимо использовать.
В поле Подтверждение пароля введите один и тот же пароль, а затем выберите ОК.
Чтобы составить проект, нажмите кнопку CTRL+SHIFT+B.
Проверка установки сборки в глобальном кэше сборки
Чтобы убедиться, что сборка установлена в кэше глобальной сборки, можно использовать средство Кэш глобальной сборки. Для этого выполните следующие действия:
Выберите Начните, выберите Выполнить, введите cmd, а затем выберите ОК.
Отображается информация об установке сборки GACDemo.
Working with Assemblies and the Global Assembly Cache
If you intend to share an assembly among several applications, you can install it into the global assembly cache. Each computer where the common language runtime is installed has this machine-wide code cache. The global assembly cache stores assemblies specifically designated to be shared by several applications on the computer. An assembly must have a strong name to be installed in the global assembly cache.
Assemblies placed in the global assembly cache must have the same assembly name and file name (not including the file name extension). For example, an assembly with the assembly name of myAssembly must have a file name of either myAssembly.exe or myAssembly.dll.
You should share assemblies by installing them into the global assembly cache only when necessary. As a general guideline, keep assembly dependencies private and locate assemblies in the application directory unless sharing an assembly is explicitly required. In addition, you do not have to install assemblies into the global assembly cache to make them accessible to COM interop or unmanaged code.
There are several reasons why you might want to install an assembly into the global assembly cache:
Assemblies that should be used by applications can be put in the global assembly cache. For example, if all applications should use an assembly located in the global assembly cache, a version policy statement can be added to the Machine.config file that redirects references to the assembly.
Administrators often protect the systemroot directory using an Access Control List (ACL) to control write and execute access. Because the global assembly cache is installed in the systemroot directory, it inherits that directory’s ACL. It is recommended that only users with Administrator privileges be allowed to delete files from the global assembly cache.
Multiple copies of assemblies with the same name but different version information can be maintained in the global assembly cache.
Additional search location.
The common language runtime checks the global assembly cache for an assembly that matches the assembly request before probing or using the codebase information in a configuration file.
Note that there are scenarios where you explicitly do not want to install an assembly into the global assembly cache. If you place one of the assemblies that make up an application into the global assembly cache, you can no longer replicate or install the application by using XCOPY to copy the application directory. In this case, you must also move the assembly into the global assembly cache.
In This Section
How to: Install an Assembly into the Global Assembly Cache
Describes the ways to install an assembly into the global assembly cache.
Using Serviced Components with the Global Assembly Cache
Explains why serviced components (managed COM+ components) should be placed in the global assembly cache.
Related Sections
Creating Assemblies
Provides an overview of creating assemblies.
Global Assembly Cache
Describes the global assembly cache.
How to: View Assembly Contents
Explains how to use the Ildasm.exe (IL Disassembler) to view Microsoft intermediate language (MSIL) information in an assembly.
How the Runtime Locates Assemblies
Describes how the common language runtime locates and loads the assemblies that make up your application.
Programming with Assemblies
Describes assemblies, the building blocks of managed applications.









