Глобальный кэш сборок

Pause

Глобальный кэш сборок (англ. Global Assembly Cache, GAC) — это машино-зависимый кэш сборок CLI для общей языковой инфраструктуры в .NET Framework корпорации Microsoft. Механизм централизованного хранилища сборок предназначен для устранения недостатков концепции общих библиотек и помогает избежать различных проблем, характерных для других подходов, таких как DLL hell[1].

Требования

Сборки, размещаемые в Глобальном кэше сборок (GAC), должны соответствовать определённой схеме версионирования, позволяющей выполнять различные версии одного кода параллельно. В частности, такие сборки должны иметь строгое имя.

Использование

Существует два основных способа взаимодействия с Глобальным кэшем сборок: инструмент Global Assembly Cache Tool и Assembly Cache Viewer.

Инструмент Global Assembly Cache Tool

gacutil.exe — это устаревшая утилита командной строки, поставлявшаяся с .NET 1.1 и до сих пор входящая в состав .NET SDK[1].

Проверить наличие сборки в GAC можно командой:

gacutil.exe /l <имя_сборки>

Зарегистрировать сборку в GAC можно командой:

gacutil.exe /i <имя_сборки>

Также это возможно путём копирования файла сборки в каталог:

%windir%\assembly\

Учтите, что для .NET 4.0 путь к GAC следующий:

%windir%\Microsoft.NET\assembly\

Другие параметры утилиты можно узнать с помощью ключа /?:

gacutil.exe /?

Просмотрщик Assembly Cache Viewer

Assembly Cache Viewer (англ. shfusion.dll) представляет собой более современный интерфейс, интегрированный в Проводник Windows[2]. Просмотр содержимого %windir%\assembly\ (например, C:\WINDOWS\assembly) или %WINDIR%\Microsoft.NET\assembly показывает все сборки, хранимые в кэше, а также их версии, культуру, токен открытого ключа и архитектуру процессора. Сборки могут быть установлены методом перетаскивания, а удалены — посредством клавиши Delete или через контекстное меню.

С выходом .NET Framework 4 оболочка Assembly Cache Viewer считается устаревшей[3].

Пример использования

На компьютере могут быть установлены две сборки CLI с одинаковым именем, например, AssemblyA, но с разными версиями: 1.0 и 2.0. Поскольку обе компилируются в файл с именем AssemblyA, совместное хранение их в одном каталоге файловой системы FAT32 невозможно. Вместо этого, их можно размещать в виртуальной файловой системе Глобального кэша сборок (GAC), что позволяет программам использовать требуемую версию сборки.

Реализация

Глобальный кэш сборок реализован и управляется средой CLI, а не самой операционной системой Windows. Каталоги внутри %systemroot%, такие как assembly и Microsoft.NET\assembly (для .NET 4.0), содержат все глобально доступные сборки с их управляемыми именами, что позволяет указывать номер версии и токен открытого ключа. В результате, в одном хранилище могут находиться разные версии одной сборки и использоваться независимо, без необходимости изменять точки входа для новых версий. Установка сборок посредством перетаскивания в Проводнике Windows возможна только для тех сборок, которые разрешено устанавливать через командную строку.

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

Проблемы и ограничения

Механизм Глобального кэша сборок помогает избегать классических проблем DLL hell, но при этом обладает некоторыми недостатками:[4]

  • По умолчанию приложения запускаются только с той версией .NET Framework, на которой они были скомпилированы, что может привести к невозможности запуска программы на машинах с более новым .NET Framework, даже если технически приложение совместимо.
  • Иногда требуется использовать условная компиляция, если ключевые вызовы .NET поддерживаются только в отдельных версиях платформы.
  • Приложения .NET, зависящие от нативного кода, могут сталкиваться с проблемами совместимости, несмотря на наличие GAC.
  • Все сборки для добавления в GAC должны иметь строгое имя. Процесс придания сборке «строгого имени» может быть затруднён — например, если сборка зависит от сторонней, не имеющей строгого имени, регистрация становится невозможной. В случаях, когда исходный код сторонней сборки недоступен, сделать её строгоименованной невозможно.
  • Стандартные API Windows для открытия файлов не позволяют выбирать DLL внутри папки «assembly», если Проводник отображает GAC в удобочитаемом режиме.

Примечания

  1. ↑ 1 2 Global Assembly Cache Tool (Gacutil.exe) (англ.). Microsoft Docs. Microsoft Corporation. Дата обращения: 28 июня 2024. Архивировано 17 июля 2013 года.
  2. ↑ Assembly Cache Viewer (Shfusion.dll) (англ.). Microsoft Docs. Microsoft Corporation. Дата обращения: 28 июня 2024. Архивировано 30 июля 2013 года.
  3. ↑ How to: View the Contents of the Global Assembly Cache (англ.). Microsoft Docs. Microsoft Corporation. Дата обращения: 28 июня 2024. Архивировано 19 июля 2013 года.
  4. ↑ Mueller, John Ten Managed Application Pitfalls that Kill Version Compatibility (англ.). devsource.com. devsource.com (11 февраля 2005). Дата обращения: 28 июня 2024. Архивировано 21 января 2013 года.

Литература

Категории

Pause