Использование недокументированных API-интерфейсов машинного кода для установки элементов в GAC

Я работаю над проектом, для установки которого используются API, описанные в статье KB317540 базы знаний Майкрософт. устанавливать и удалять сборки в GAC. В статье KB говорится:

РЕЗЮМЕ
Программные интерфейсы приложений (API) с машинным кодом, которые позволяют взаимодействовать с Global Assembly Cache (GAC), не описаны в документации .NET Framework Software Development Kit (SDK).

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
ПРЕДУПРЕЖДЕНИЕ. Не используйте эти API-интерфейсы в своем приложении для выполнения привязок сборок или для проверки наличия сборок или других операций времени выполнения, разработки или времени разработки. Только административные инструменты и программы установки должны использовать эти API. Если вы используете GAC, это напрямую подвергает ваше приложение уязвимости привязки сборки или может привести к неправильной работе вашего приложения в будущих версиях .NET Framework.

GAC хранит сборки, которые используются всеми приложениями на компьютере. Фактическое место хранения и структура GAC не задокументированы и могут быть изменены в будущих версиях .NET Framework и операционной системы Microsoft Windows.

Единственный поддерживаемый метод доступа к сборкам в GAC - это API-интерфейсы, описанные в этой статье.

Большинству приложений не обязательно использовать эти API, поскольку привязка сборки выполняется автоматически общеязыковой средой выполнения. Только пользовательские программы установки или инструменты управления должны использовать эти API. Установщик Microsoft Windows имеет встроенную поддержку для установки сборок в GAC.

Дополнительные сведения о сборках и GAC см. В пакете SDK .NET Framework.

Используйте GAC API в следующих сценариях: Когда вы устанавливаете сборку в GAC. Когда вы удаляете сборку из GAC. Когда вы экспортируете сборку из GAC. Когда вы перечисляете сборки, доступные в GAC. ПРИМЕЧАНИЕ. CoInitialize (Ex) необходимо вызвать перед использованием каких-либо функций и интерфейсов, описанных в этой спецификации.

Какие плюсы и минусы этой техники? Безопасны ли эти API в использовании? Кто-нибудь там их использует? Если да, то почему?


person Tim Long    schedule 16.09.2009    source источник


Ответы (2)


Почему бы просто не создать пакет установщика Windows? См. Раздел Демистификация глобального кэша сборок .NET. Цитата:

Разработчики пакетов установщика Windows могут устанавливать сборки в GAC с помощью установщика Microsoft Windows 2.0. Это предпочтительный способ установки таких общих сборок, и он должен быть единственным способом установки общих сборок на машинах, не предназначенных для разработки.

person TrueWill    schedule 16.09.2009
comment
Если бы это было на мое усмотрение, это именно то, что я сделал бы, но другие в моей команде, похоже, думают, что установщик Windows слишком сложен, и они хотят использовать Inno Setup. Мне это действительно плохо пахнет, но сейчас я в меньшинстве :( - person Tim Long; 16.09.2009
comment
@Tim: я нашел ссылку, которая может помочь: msmvps.com/blogs/carlosq/archive/2009/06/09/ - person TrueWill; 16.09.2009

В нем говорится: «Только административные инструменты и программы установки должны использовать эти API».

Существуют инструменты (например, инструменты командной строки) для работы с GAC. Почему бы не вызвать эти исполняемые файлы вместо прямого использования этих API?

person ChrisW    schedule 16.09.2009
comment
Да, да, я знаю, что там написано - проблема в том, что члены моей команды думают, что они создают программу установки. Я думаю, они неверно истолковали заявление. Для меня это означает, что имя вашего процесса должно быть MSIExec, если вы хотите использовать эти API. Однако Inno Setup (используемый инструмент) выдает файл setup.exe, который устанавливает продукт - это программа установки. Я уверен, что вы видите здесь двусмысленность. - person Tim Long; 16.09.2009
comment
Я думаю, что было бы намного проще (например, 1 строка кода) вызвать инструмент командной строки вместо использования API, подобного этому. - person ChrisW; 16.09.2009