Утилита gacutil
недоступна на клиентских компьютерах, и лицензия Window SDK запрещает распространять ее среди ваших клиентов. Когда ваш клиент не может, не будет (и не должен) загружать 300 МБ Windows SDK как часть процесса установки вашего приложения.
Существует официально поддерживаемый API, который вы (или ваш установщик) можете использовать для регистрации сборки в глобальном кэше сборок. Технология Microsoft Windows Installer знает, как назвать этот API для вас. Вам необходимо проконсультироваться с утилитой установки MSI (например, WiX, InnoSetup), чтобы узнать собственный синтаксис, указывающий, что вы хотите зарегистрировать сборку в глобальном кэше сборок.
Но MSI и gacutil ничего особенного не делают. Они просто вызывают тот же API, который вы можете назвать сами. Документацию о том, как зарегистрировать сборку с помощью кода, см .:
var IAssemblyCache assemblyCache;
CreateAssemblyCache(ref assemblyCache, 0);
String manifestPath = "D:\Program Files\Contoso\Frobber\Grob.dll";
FUSION_INSTALL_REFERENCE refData;
refData.cbSize = SizeOf(refData); //The size of the structure in bytes
refData.dwFlags = 0; //Reserved, must be zero
refData.guidScheme = FUSION_REFCOUNT_FILEPATH_GUID; //The assembly is referenced by an application that is represented by a file in the file system. The szIdentifier field is the path to this file.
refData.szIdentifier = "D:\Program Files\Contoso\Frobber\SuperGrob.exe"; //A unique string that identifies the application that installed the assembly
refData.szNonCannonicalData = "Super cool grobber 9000"; //A string that is only understood by the entity that adds the reference. The GAC only stores this string
//Add a new assembly to the GAC.
//The assembly must be persisted in the file system and is copied to the GAC.
assemblyCache.InstallAssembly(
IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH, //The files of an existing assembly are overwritten regardless of their version number
manifestPath, //A string pointing to the dynamic-linked library (DLL) that contains the assembly manifest. Other assembly files must reside in the same directory as the DLL that contains the assembly manifest.
refData);
Дополнительная документация до удаления статьи базы знаний:
Поля структуры определены следующим образом:
- cbSize - Размер структуры в байтах.
- dwFlags - Зарезервировано, должно быть ноль.
- guidScheme - Объект, который добавляет ссылку.
- szIdentifier - уникальная строка, идентифицирующая приложение, которое установило сборку.
- szNonCannonicalData - Строка, которая понимается только сущностью, которая добавляет ссылку. GAC хранит только эту строку.
Возможные значения для поля guidScheme могут быть следующими:
FUSION_REFCOUNT_MSI_GUID
- На сборку ссылается приложение, установленное с помощью Установщик Windows . Поле szIdentifier установлено на MSI , а szNonCannonicalData установлено на установщик Windows. Эта схема должна использоваться только самим установщиком Windows.
FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID
- На сборку ссылается приложение, которое отображается в Установка и удаление программ . Поле szIdentifier - это токен, который используется для регистрации приложения в Установка и удаление программ .
FUSION_REFCOUNT_FILEPATH_GUID
- На сборку ссылается приложение, представленное файлом в файловой системе. Поле szIdentifier является путем к этому файлу.
FUSION_REFCOUNT_OPAQUE_STRING_GUID - На сборку ссылается приложение, которое представлено только непрозрачной строкой. SzIdentifier - это непрозрачная строка. GAC не выполняет проверку существования непрозрачных ссылок, когда вы удаляете это.