Перетащите DLL в GAC («сборка») в Windows Server 2008. Net 4.0 - PullRequest
30 голосов
/ 17 октября 2011

Я пытаюсь развернуть некоторый код на клиентском компьютере, где я не хочу устанавливать инструменты MS Windows SDK.Это означает, что у вас нет доступа к gacutil.Я также не создал установщик для моего кода.Кажется, что это могут быть только два варианта в .net 4.0.

В прошлом я просто шел, чтобы запустить, запустить, набрать "сборка", и перетащить мою библиотеку.

Это уже невозможно?Когда я пытаюсь сделать это, я не получаю сообщение об ошибке, но DLL не появляется в папке "Assembly".Когда я использую gacutil на своем компьютере разработчика, он работает правильно, но DLL все равно не появляется.

Ответы [ 7 ]

53 голосов
/ 17 октября 2011

В .net 4.0 Microsoft удалила возможность добавлять библиотеки DLL в сборку простым перетаскиванием.

Вместо этого вам нужно использовать gacutil.exe или создать установщик, чтобы сделать это.Microsoft фактически не рекомендует использовать gacutil, но я все равно пошел по этому пути.

Чтобы использовать gacutil на компьютере разработчика, перейдите по адресу:
Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010)

Затем используйте эти команды для удаленияи переустановить соответственно.Примечание. Я НЕ включил .dll в команду удаления.
gacutil /u myDLL<br> gacutil /i "C:\Program Files\Custom\myDLL.dll"

Чтобы использовать Gacutil на компьютере, не предназначенном для разработки, вам нужно будет скопировать исполняемый файл и файл конфигурации с вашего компьютера разработчика напроизводство машины.Похоже, есть несколько разных версий Gacutil.Тот, который работал для меня, я нашел здесь:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe.config

Скопируйте файлы сюда или в соответствующую папку .net;
C:\Windows\Microsoft.NET\Framework\v4.0.30319

Затем используйте эти команды для удаления и переустановки соответственно
"C:\Users\BHJeremy\Desktop\Installing to the Gac in .net 4.0\gacutil.exe" /u "myDLL"

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\gacutil.exe" /i "C:\Program Files\Custom\myDLL.dll"

21 голосов
/ 27 декабря 2012

В случае необходимости я скопировал gacutil.exe, gacutil.exe.config и ТАКЖЕ gacutlrc.dll (из каталога 1033)

4 голосов
/ 09 апреля 2014

Утилита gacutil недоступна на клиентских компьютерах, и лицензия Window SDK запрещает распространять ее среди ваших клиентов. Когда ваш клиент не может, не будет (и не должен) загружать 300 МБ Windows SDK как часть процесса установки вашего приложения.

Существует официально поддерживаемый API, который вы (или ваш установщик) можете использовать для регистрации сборки в глобальном кэше сборок. Технология Microsoft Windows Installer знает, как назвать этот API для вас. Вам необходимо проконсультироваться с утилитой установки MSI (например, WiX, InnoSetup), чтобы узнать собственный синтаксис, указывающий, что вы хотите зарегистрировать сборку в глобальном кэше сборок.

Но MSI и gacutil ничего особенного не делают. Они просто вызывают тот же API, который вы можете назвать сами. Документацию о том, как зарегистрировать сборку с помощью кода, см .:

KB317540: DOC: API-интерфейсы глобального кэша сборок (GAC) не описаны в документации по SDK.

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 не выполняет проверку существования непрозрачных ссылок, когда вы удаляете это.

3 голосов
/ 02 ноября 2012

, если у вас установлен необходимый .net фреймворк.Ex;.Net 4.0 или .Net 3.5, тогда вы можете просто скопировать Gacutil.exe с любого аппарата и на новый аппарат.

1) Откройте CMD в качестве администратора на новом сервере.
2) Перейдите в папку, в которую вы скопировали Gacutil.exe.Например, - C: \ program files. (В моем случае).
3) Введите ниже в командной строке cmd и установите.

C: \ Program Files \ gacutil.exe / I dllname

2 голосов
/ 10 апреля 2014

Другими альтернативами установщику и gacutil являются инструменты GUI, такие как Gac Manager или GACAdmin .Или, если вам нравится PowerShell, вы можете использовать PowerShell GAC , автором которого я являюсь.

1 голос
/ 13 октября 2015

Имейте в виду, что Fusion API неуправляем. Текущий справочник для него здесь: Руководство по разработке> Справка по неуправляемому API> Fusion

Однако есть управляемый метод для добавления сборки в GAC: System.EnterpriseServices.Internal.Publish.GacInstall И, если вам нужно зарегистрировать какие-либо типы: System.EnterpriseServices.Internal.Publish.RegisterAssembly

Ссылка на класс публикации находится здесь: Библиотека классов .NET Framework> Пространства имен System.EnterpriseServices> System.EnterpriseServices.Internal

Однако эти методы были разработаны для установки компонентов, которые требуются приложению веб-службы, например ASP.NET или WCF. В результате они не регистрируют сборки в Fusion; таким образом, они могут быть удалены другими приложениями или с помощью gacutil, и ваша сборка перестанет работать. Итак, если вы используете их вне веб-сервера, где администратор управляет GAC, обязательно добавьте ссылку на ваше приложение в ПРОГРАММНОМ ОБЕСПЕЧЕНИИ \ Wow6432Node \ Microsoft \ Fusion \ References (для 64-разрядных ОС) или ПРОГРАММНОМ ОБЕСПЕЧЕНИИ \ Microsoft \ Fusion \ References (для 32-разрядных ОС), чтобы никто не мог удалить ваши сборки поддержки, если они не удаляют ваше приложение.

0 голосов
/ 16 июля 2014

Вы также можете просто скопировать файл в GAC, используя командную строку.Я использую следующий пакетный скрипт для копирования DLL и перезапуска IIS.

copy /b/v/y "PathToAssembly\MyAssembly.dll" "C:\Windows\assembly\" 
iisreset /noforce
pause

Сохраняет необходимость использования или установки gacutil

...