Перетащите DLL в GAC ("сборка") в Windows Server 2008 .NET 4.0

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

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

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

7 ответов

Решение

В.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
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.exeC:\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"

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

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

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

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

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

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

Имейте в виду, что 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-битных ОС), чтобы никто не мог удалить ваши сборки поддержки, если они не удаляют ваше приложение.

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

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

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

Другие вопросы по тегам