Способы программной установки сборки .NET в GAC

Мне нужно создать небольшое приложение или script, чтобы установить сборку .NET в GAC. Я читал, что есть несколько способов сделать это, включая:

  • с помощью gacutil.exe
  • выполняется следующая строка кода:

    new System.EnterpriseServices.Internal.Publish().GACInstall("Foo.dll");

Однако, что произойдет, если я просто создам соответствующие каталоги на машине и скопирую сборку в этот каталог? Структура каталога GAC следующая: C:\Windows\assembly\GAC_MSIL\Foo\<version#>__<public token>\Foo.dll

Сделайте ли эти два метода что-то особенное помимо создания структуры папок и размещения сборки в нем?

Ответ 1

Я настоятельно рекомендую использовать существующие методы (например, те, о которых вы упомянули), потому что они поддерживаются и поддерживаются Microsoft и будут продолжать работать с будущими версиями.

Быстрый просмотр gacutil.exe с Process Monitor показывает, что это немного больше, чем просто копирование файлов:

  • concurrency относится (например, временные файлы, блокировка WINDOWS\assembly\GACLock.dat и т.д.).
  • уведомления (например, HKLM\SOFTWARE\Microsoft\Fusion\GACChangeNotification\...)
  • индексирование (например, HKLM\SOFTWARE\Microsoft\Fusion\NativeImagesIndex...)
  • проверка (например, сильное имя,...)

Обертка в System.EnterpriseServices очень похожа на это старое сообщение в блоге и должно работать нормально.

Ответ 2

Мы недавно сделали это для 10-ти серверов в корпоративной среде. Мы использовали Wix для создания очень простой MSI (серьезно - 5 минут) и опубликовали все серверные (и dev-боксы) с помощью групповой политики.