Ответ на вопрос
Глобальный кэш сборок
Глобальный кэш сборок (англ. 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 2 Global Assembly Cache Tool (Gacutil.exe) (англ.). Microsoft Docs. Microsoft Corporation. Дата обращения: 28 июня 2024. Архивировано 17 июля 2013 года.
- ↑ Assembly Cache Viewer (Shfusion.dll) (англ.). Microsoft Docs. Microsoft Corporation. Дата обращения: 28 июня 2024. Архивировано 30 июля 2013 года.
- ↑ How to: View the Contents of the Global Assembly Cache (англ.). Microsoft Docs. Microsoft Corporation. Дата обращения: 28 июня 2024. Архивировано 19 июля 2013 года.
- ↑ Mueller, John Ten Managed Application Pitfalls that Kill Version Compatibility (англ.). devsource.com. devsource.com (11 февраля 2005). Дата обращения: 28 июня 2024. Архивировано 21 января 2013 года.
Литература
- .NET Framework Developer's Guide (англ.). Microsoft Docs. Microsoft Corporation. Дата обращения: 28 июня 2024. Архивировано 6 октября 2008 года.
- Global Assembly Cache Tool (gacutil.exe) (англ.). Microsoft Docs. Microsoft Corporation. Дата обращения: 28 июня 2024. Архивировано 15 октября 2008 года.
- Demystifying the .NET Global Assembly Cache (англ.). CodeProject. CodeProject. Дата обращения: 28 июня 2024. Архивировано 22 сентября 2017 года.