Глобальный кэш сборок
Глобальный кэш сборок ( GAC ) — это общемашинный сборок CLI кэш для Common Language Infrastructure (CLI) в Microsoft .NET Framework. Подход, заключающийся в наличии специально контролируемого центрального хранилища, устраняет недостатки [ нужна ссылка ] в концепции разделяемой библиотеки и помогает избежать ловушек других решений, которые привели к таким недостаткам, как DLL hell .
Требования
[ редактировать ]Сборки, находящиеся в GAC, должны соответствовать определенной схеме управления версиями, которая позволяет параллельно выполнять разные версии кода. В частности, такие сборки должны иметь строгие имена .
Использование
[ редактировать ]Существует два способа взаимодействия с GAC: инструмент глобального кэша сборок (gacutil.exe) и средство просмотра кэша сборок (shfusion.dll).
Инструмент глобального кэша сборок
[ редактировать ]gacutil.exe — это старая утилита командной строки, поставляемая с .NET 1.1 и по-прежнему доступная в составе .NET SDK. [1]
Проверить доступность общей сборки в GAC можно с помощью команды:
gacutil.exe /l <assemblyName>
Зарегистрировать общую сборку в GAC можно с помощью команды:
gacutil.exe /i <assemblyName>
Или скопировав файл сборки в следующую папку:
%windir%\assembly\
Обратите внимание, что для .NET 4.0 расположение GAC теперь следующее:
%windir%\Microsoft.NET\assembly\
Другие возможности этой утилиты будут кратко описаны, если вы используете /? флаг, то есть:
gacutil.exe /?
Средство просмотра кэша сборок
[ редактировать ]Новый интерфейс — средство просмотра кэша сборок — интегрирован в проводник Windows . [2] Просмотр %windir%\assembly\
(например, C:\WINDOWS\assembly
) или %WINDIR%\Microsoft.NET\assembly
, отображает сборки, содержащиеся в кэше, вместе с их версиями, региональными параметрами, токеном открытого ключа и архитектурой процессора. Сборки устанавливаются путем перетаскивания, а удаляются путем выбора и нажатия клавиши удаления или с помощью контекстного меню .
С выпуском .NET Framework 4 расширение оболочки средства просмотра кэша сборок устарело. [3]
Пример использования
[ редактировать ]На компьютере есть две сборки CLI , обе с именем AssemblyA , но одна имеет версию 1.0, а другая — версии 2.0. Поскольку требуется, чтобы оба были скомпилированы в файл с именем AssemblyA, они не могут существовать в одном каталоге в FAT32 файловой системе . Вместо этого виртуальную файловую систему GAC могут использовать программы, которым необходимо использовать каждую версию сборки конкретно.
Выполнение
[ редактировать ]GAC как конструкция фактически не существует в ОС Windows. Он реализуется и управляется через CLI. Папки в %systemroot% с именем сборки и Microsoft.NET\assembly (для .NET 4.0) содержат все глобально доступные сборки с управляемыми именами файлов, поэтому можно включить токены версии и открытого ключа. Таким образом, каждая версия может существовать в одном и том же месте и вызываться без необходимости, чтобы последующие версии сохраняли расположение точек входа кода, как обычно. Проводник Windows позволяет устанавливать сборки в эту папку методом перетаскивания, только если в противном случае их можно было бы установить из командной строки.
Вызывающее приложение может указать версию сборки при обращении к ней, поэтому среда выполнения может просто обратиться к имени файла и использовать правильное.
Подводные камни
[ редактировать ]Механизм Global Assembly Cache помогает избежать ада старых DLL , но у него все еще есть некоторые недостатки, такие как: [4]
- По умолчанию приложения будут работать только с той версией .NET Framework , которая использовалась для их компиляции, что может привести к сбою приложения на компьютерах с установленными более новыми версиями .NET Framework — даже если приложение обычно работает правильно с более новой версией. версия.
- Иногда необходимо использовать условную компиляцию , если некоторые основные вызовы .NET (используемые в приложении) поддерживаются только некоторыми версиями платформы.
- Приложения .NET, использующие собственный код, рискуют оказаться несовместимыми даже с механизмом GAC.
- Каждая сборка, добавляемая в GAC, должна иметь строгое имя . Процесс создания сборки со «строгим именем» в некоторых ситуациях может оказаться весьма болезненным. Например, если сборка зависит от другой сборки, не имеющей строгого имени, ее нельзя зарегистрировать в GAC. В тех случаях, когда код сторонней сборки не находится в распоряжении программиста, преобразование сборки в строгое имя фактически может оказаться невозможным.
- Просмотр файлов с помощью стандартных API-интерфейсов Windows не позволяет выбирать библиотеки DLL, расположенные в папке «сборка», когда в проводнике отображается удобный для пользователя вид GAC.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Инструмент глобального кэша сборок (Gacutil.exe)» . Редмонд, Вашингтон : Корпорация Microsoft . Архивировано из оригинала 17 июля 2013 г. Проверено 27 мая 2010 г.
- ^ «Просмотр кэша сборок (Shfusion.dll)» . Редмонд, Вашингтон : Корпорация Microsoft . Архивировано из оригинала 30 июля 2013 г. Проверено 27 мая 2010 г.
- ^ «Как просмотреть содержимое глобального кэша сборок» . Редмонд, Вашингтон : Корпорация Microsoft . Архивировано из оригинала 19 июля 2013 г. Проверено 22 июля 2010 г.
- ^ Джон, Мюллер (11 февраля 2005 г.). «Десять ошибок управляемых приложений, которые нарушают совместимость версий» . devsource.com. Архивировано из оригинала 21 января 2013 г. Проверено 26 января 2008 г.
Внешние ссылки
[ редактировать ]- Руководство разработчика .NET Framework. Архивировано 6 октября 2008 г. на Wayback Machine.
- Инструмент глобального кэширования сборок (gacutil.exe). Архивировано 15 октября 2008 г. на Wayback Machine.
- Демистификация глобального кэша сборок .NET. Архивировано 22 сентября 2017 г. на Wayback Machine.