Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

В .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.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"

Ответ 2

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

Ответ 3

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

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

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

KB317540: DOC: API-интерфейсы глобального сборщика (GAC) не документированы в документации по разработке программного обеспечения .NET Framework (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);

Дополнительная документация перед удалением статьи KB:

Поля структуры определяются следующим образом:

  • cbSize - размер структуры в байтах.
  • dwFlags - зарезервировано, должно быть нулевым.
  • guidScheme - объект, который добавляет ссылку.
  • szIdentifier - уникальная строка, которая идентифицирует приложение, которое установило сборку.
  • szNonCannonicalData​​strong > - строка, которая понятна только сущности, которая добавляет ссылку. GAC сохраняет только эту строку.

Возможные значения для поля guidScheme могут быть следующими:

FUSION_REFCOUNT_MSI_GUID. На сборку ссылается приложение, которое было установлено с помощью Установщика Windows. В поле szIdentifier установлено значение MSI, а для параметра szNonCannonicalData​​strong > установлен установщик Windows. Эта схема должна использоваться только установщиком Windows. FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID. На сборку ссылается приложение, которое отображается в Установка и удаление программ. Поле szIdentifier - это токен, который используется для регистрации приложения с помощью Установка и удаление программ. FUSION_REFCOUNT_FILEPATH_GUID. На сборку ссылается приложение, которое представлено файлом в файловой системе. Поле szIdentifier - это путь к этому файлу.     FUSION_REFCOUNT_OPAQUE_STRING_GUID - на сборку ссылается приложение, которое представлено только непрозрачной строкой. SzIdentifier - это непрозрачная строка. GAC не выполняет проверку существования непрозрачных ссылок при удалении этого.

Ответ 4

если у вас есть необходимая инфраструктура .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

Ответ 5

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

Ответ 6

Имейте в виду, что API Fusion неуправляем. Текущая ссылка для него находится здесь: Руководство по разработке > Справочник по неуправляемому 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, тогда обязательно добавьте ссылку на свое приложение в SOFTWARE\Wow6432Node\Microsoft\Fusion\References (для 64-разрядной ОС) или SOFTWARE\Microsoft\Fusion\References (для 32-разрядной ОС), чтобы никто не смог удалить ваши сборки поддержки, если они не удалили ваше приложение.

Ответ 7

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

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

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