Добавить dll в gac
Я использовал эту команду в командной строке Windows Server 2003:
Это говорит, что путь не верен.
Требования
Заключение
Чтобы установить сборку в глобальном кэше сборок, необходимо присвоить сборке строгое имя. Имя является криптографическим хэш-ключом или сигнатурой. Это строгое имя обеспечивает правильное управление версиями компонентов. Это помогает предотвратить конфликт компонентов с одинаковыми именами друг с другом или неправильного использования приложением- потребляющим приложением.
Заключение
Чтобы установить сборку в глобальном кэше сборок, необходимо присвоить сборке строгое имя. Имя является криптографическим хэш-ключом или сигнатурой. Это строгое имя обеспечивает правильное управление версиями компонентов. Это помогает предотвратить конфликт компонентов с одинаковыми именами друг с другом или неправильного использования приложением- потребляющим приложением.
Требования
Строгое имя сборки
Чтобы поместить сборку в GAC (глобальный кэш), эта сборка должна обладать строгим именем. В состав строгого имени входят следующие компоненты:
Имя сборки без расширения
Номер версии. Благодаря разграничению по версии можно использовать разные версии одной и ой же сборки
Необязательное значение для культуры (при локализации сборки)
Цифровая подпись, которая создается с помощью хэш-значения содержимого сборки и значения секретного ключа. Секретный ключ представляет собой файл с расширением *.snk.
Благодаря строгому имени гарантируется уникальность сборки в глобальном кэше.
Чтобы создать строгое имя, можно воспользоваться инструментарием, который имеется в Visual Studio. Допустим, мы создали проект по типу Class Library (Библиотека классов). И теперь мы хотим подписать сборку, которая будет компилироваться, строгим именем. Для этого нажмем в окне Solution Explorer (Обозреватель решений) на имя проекта правой кнопкой мыши и в появившемся меню выберем пункт Properties (Свойства). На вкладке свойств выберем пункт Signing:
Отметим флажок Sign the assembly (Подписать сборку), как показано на рисунке. И чтобы создать новый секретный ключ, выберем в выпадающем списке пункт New . После этого откроется окно настроек секретного ключа:
Дадим новому ключу какое-нибудь имя и нажмем ОК. После этого в структуре проекта можно будет увидеть файл ключа:
Откроем командную строку под администратором. Во-первых, найдем расположение утилиты gacutil.exe на локальной машине. У меня, например, она расположена в каталоге C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools. И вначале перейдем в этот каталог:
Теперь воспользуемся одной из команд данной утилиты. Наиболее используемые команды:
-i имя_сборки - установка сборки в GAC
-l - вывод всего списка сборок в GAC
-u имя_сборки - удаление сборки из GAC
Теперь вводим в командной строке команду на добавление:
Как видно, на рисунке, в моем случае полное имя сборки C:\Users\Eugene\Documents\Visual Studio 2012\Projects\Sharp\PersonLibrary\PersonLibrary\bin\Debug\PersonLibrary.dll. И если добавление прошло успешно, то командная строка отобразит:
Теперь мы можем использовать нашу сборку из GAC. Для этого создадим какой-нибудь проект и в окне Solution Exlplorer (Обозреватель решений) нажмем на узел Referenses (Ссылки). В появившемся меню выберем Add Reference. (Добавить ссылку):
В окне добавления ссылки на сборку нажмем внизу на кнопку Browse (Обзор) и найдем в GAC нашу сборку. После этого она будет добавлена в проект, и мы сможем использовать весь заложенный в ней функционал.
Глобальный кэш сборок
Чтобы создать небольшой проект библиотеки классов с помощью Visual Studio, создать строгое имя и установить .dll файла проекта в GAC, выполните следующие действия.
В Visual Studio можно использовать свойства проекта интегрированной среды разработки для создания пары ключей и подписания сборки. Затем можно пропустить шаг 3 и шаг 4, а также пропустить внесение изменений в код файла AssemblyInfo.cs .
Чтобы использовать свойства проекта интегрированной среды разработки для создания пары ключей и подписания сборки, выполните следующие действия.
В Обозреватель решений щелкните правой кнопкой мыши GACDemo и выберите пункт "Свойства".
Откройте вкладку "Подписывание ", а затем установите флажок "Подписать сборку ".
В списке "Выбор ключа строгого имени" нажмите кнопку .
Введите GACkey.snk в качестве имени файла ключа, снимите флажок "Защитить файл ключа" и нажмите кнопку "ОК ".
Нажмите клавиши CTRL+SHIFT+B, чтобы скомпилировать проект.
После выполнения этих действий необходимо выполнить шаг 5, чтобы установить сборку в глобальном кэше сборок.
Создайте каталог с именем GACKey C:\ , чтобы можно было легко найти ключ и получить доступ к ключу в командной строке.
Введите следующую команду:
Скомпилировать проект, нажав клавиши CTRL+SHIFT+B. Для установки файла .dll в GAC не требуется дополнительный код.
Вы можете установить .dll с помощью инструмента Gacutil или перетащив .dll в соответствующую папку. Если вы используете средство Gacutil, можно использовать команду, которая выглядит следующим образом:
Чтобы перетащить файл, откройте два экземпляра Windows Explorer. В одном экземпляре найдите расположение выходных .dll файла для консольного проекта. В другом экземпляре найдите . c:\\Assembly Затем перетащите файл .dll в папку Assembly.
Глобальный кэш сборок
Чтобы создать небольшой проект библиотеки классов с помощью Visual Studio, создать строгое имя и установить .dll файла проекта в GAC, выполните следующие действия.
В Visual Studio можно использовать свойства проекта интегрированной среды разработки для создания пары ключей и подписания сборки. Затем можно пропустить шаг 3 и шаг 4, а также пропустить внесение изменений в код файла AssemblyInfo.cs .
Чтобы использовать свойства проекта интегрированной среды разработки для создания пары ключей и подписания сборки, выполните следующие действия.
В Обозреватель решений щелкните правой кнопкой мыши GACDemo и выберите пункт "Свойства".
Откройте вкладку "Подписывание ", а затем установите флажок "Подписать сборку ".
В списке "Выбор ключа строгого имени" нажмите кнопку .
Введите GACkey.snk в качестве имени файла ключа, снимите флажок "Защитить файл ключа" и нажмите кнопку "ОК ".
Нажмите клавиши CTRL+SHIFT+B, чтобы скомпилировать проект.
После выполнения этих действий необходимо выполнить шаг 5, чтобы установить сборку в глобальном кэше сборок.
Создайте каталог с именем GACKey C:\ , чтобы можно было легко найти ключ и получить доступ к ключу в командной строке.
Введите следующую команду:
Скомпилировать проект, нажав клавиши CTRL+SHIFT+B. Для установки файла .dll в GAC не требуется дополнительный код.
Вы можете установить .dll с помощью инструмента Gacutil или перетащив .dll в соответствующую папку. Если вы используете средство Gacutil, можно использовать команду, которая выглядит следующим образом:
Чтобы перетащить файл, откройте два экземпляра Windows Explorer. В одном экземпляре найдите расположение выходных .dll файла для консольного проекта. В другом экземпляре найдите . c:\\Assembly Затем перетащите файл .dll в папку Assembly.
Приватные сборки
При подписании библиотеки (назначении строгого имени) открытый ключ записывается в манифест. Таким образом, что бы внести изменения в чужую подписанную библиотеку, нужно просто заменить публичный ключ на свой. Или, еще проще, сделать новую сборку с таким же именем и подписать на своем ключе.
При использовании библиотеки любой публичный ключ будет принят как доверенный.
Проведем следующий эксперимент. Создадим небольшую библиотечку.
Листинг 1. Библиотека signedLib.dll
Подпишем её и добавим к проекту консольного приложения:
Листинг 2. Консольное приложение changeKey.exe
Вывод такой: подменить/изменить приватную сборку со строгим именем очень просто. Другие сборки ссылающиеся на измененную никак на это не реагируют, не смотря на то, что были скомпилированы с оригинальной.
Обращаю внимание что речь идет именно о приватных сборках, со сборками в GAC дело обстоит иначе.
Приватные это те которые не в GAC.
Сборки в GAC
Как мы только что убедились подписанные приватные компоновочные блоки можно легко модифицировать. При этом не обязательно обладать ни исходниками, ни секретным ключом, ни правами администратора.
Вносить изменения в сборки установленные в GAC не многим сложнее.
В случаи с приватными сборками не играет ни какой роли подписаны они или нет. Подпись не проверяется, а «полный идентификатор приватного компоновочного блока состоит из имени компоновочного блока и числового номера его версии» (из книги Э. Троелсена).
Сборки устанавливаемые в GAC должны иметь так называемое строгое имя. Сборка получает строгое имя как только вы её подписываете. Идентификаторы сборок в GAC дополняются параметрами публичного ключа, подписи проверяются.
- незаметно внести изменения не получится — подпись проверку не пройдет
- свой публичный ключ не подсунешь — идентификатор сборки изменится
Но не нужно быть криптографом что бы все же изменить библиотеку в GAC, а нужно обладать правами администратора и знать параметры утилиты sn.exe.
Страдальцы не имеющие студии вручную используют стандартную утилиту sn.exe для подписания компоновочных блоков.
Итак, возьмем проект уже знакомой библиотеки signedLib.dll (см. листинг 1). подпишем её и установим в GAC.
gacutil.exe /i D:\projects\changeKey\signedLib\bin\Release\signedLib.dll
Добавим референс к консольному приложению changeKey.exe (см. листинг 2). Компилируем релиз, убеждаемся что в папке с программой нет файла signedLib.dll (значит сборка будет загружена из GAC). Запускаем changeKey.exe — приложение показывает «1».
С этого момента воображаем себя атакующими — у нас нет исходников, нет секретного ключа. Но нам надо что бы метод GetNumber() возвращал не 1 а 2.
Структуру файлов ниже C:\Windows\assembly проводник windows не показывает. Создадим псевдодиск на который будет проецироваться нужный каталог:
subst b: C:\Windows\assembly
В проводнике появился диск B.
рис. 1. Папки ниже C:\Windows\assembly
рис. 2. Параметры публичного ключа
После правки IL кода и сохранения изменений, программа сообщит о том что цифровая подпись нарушена и предложит варианты дальнейших действий:
Нажимаем «Remove Strong Name» — удалить цифровую подпись. Закрываем сборку.
Теоретически закрывать сборку нет необходимости и нам должен подойти вариант «Register it for verification skipping». Однако у меня эта операция заканчивается ошибкой. К тому же в обучающих целях лучше проделать все операции вручную.
- измененная, не подписанная dll библиотека;
- публичный ключ оригинальной библиотеки.
Осталось установить её в GAC. Для этого воспользуемся механизмом отложенной подписи. Если сборка содержит информацию о публичном ключе, но не имеет цифровой подписи — говорят что она имеет отложенную подпись. Придумал это какой-то извращенный мозг из микрософт «для тестирования».
Мы получили сборку которая называется так же как оригинальная, имеет такую же версию и такой же публичный ключ. Т.е. если, её установить в GAC она получит точно такой же идентификатор как и оригинальная (см. начало начало статьи). Как я писал выше, по умолчанию у сборок в GAC проверяется подпись, однако проверку подписи можно отключить — опять же «для тестирования».
Что бы отключить проверку подписи dll на данном компьютере нужно воспользоваться sn.exe
sn -Vr C:\Users\Alex\Desktop\signedLib.dll
Удаляем оригинальную сборку из GAC:
gacutil /u signedLib,Version=1.0.0.0,Culture=neutral,PublicKeyToken=2b1b71846e76146e
gacutil /i C:\Users\Alex\Desktop\signedLib.dll
Радуемся, глядя на выведенную gacutil.exe надпись:
Assembly successfully added to the cache
Вот мы и добились желаемого — изменили библиотеку установленную в GAC. Что бы еще раз порадоваться (и проверить результат) запускаем наше приложение changeKey.exe, которое в начале статьи выводило 1, теперь он покажет 2.
Подведем итог
Публичный ключ записан в самой сборке (точнее в манифесте);
В случаи с приватными сборками подписи не проверяются.
ОТВЕТЫ
Ответ 1
Вы можете сделать это, используя инструмент gacutil . В простейшей форме:
Вы найдете командную строку Visual Studio в меню "Пуск" в разделе "Программы" → "Visual Studio" → "Инструменты Visual Studio".
Ответ 2
- Сильное имя вашей сборки (Visual Studio, Свойства проекта, вкладка Signing, Подпишите сборку)
- Изменение событий сборки (вкладка "Проекты", вкладка "События", "Командная строка после сборки" ).
Теперь, каждый раз, когда вы создаете свой проект, он будет установлен на GAC.
Ответ 3
Просто перетащите файл DLL в папку C:\Windows\assembly используя проводник Windows.
Ответ 4
Ответ 5
Можно проверить доступность общей сборки в GAC с помощью команды:
Можно зарегистрировать общую сборку в GAC с помощью команды:
Или, отбросив файл сборки в следующем месте с помощью GUI:
Другие варианты этой утилиты будут кратко описаны, если вы используете флаг /? , который:
Ответ 6
Запустить команду командной строки разработчика для V2012 или любой установленной версии в вашей системе
Ответ 7
Попробуйте GACView, если у вас есть страх командных подсказок.
Вы не установили PATH правильно в DOS. Вам нужно указать путь туда, где находится gacutil, чтобы использовать его в DOS.
Ответ 8
Как сказал ando, просто перетащите узел в папку сборки C:\windows \. Он работает.
Ответ 9
В случае, если на окнах 7 gacutil.exe(для сборки сборки в GAC) и sn.exe(для обеспечения уникальности сборки) находится в папке C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\bin
Затем перейдите к пути gacutil, как показано ниже, выполните следующую команду после замены пути вашей сборки
C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\bin > gacutil/i "замените путь вашей сборки, который будет помещен в GAC"
Ответ 10
От вкладки "Опубликовать" перейдите в приложение "Файлы", а затем ненужные файлы делают исключение, чем "ok". Создайте файлы проекта. И выполните проекты.
Ответ 11
Вышеупомянутые решения выглядят изумительно. Однако, чтобы быть простым, все, что вам нужно, я думаю, это ввести имя сборки вместе со своим полным путем, например:
По способу взаимодействия с другими сборками и приложениями сборки можно разделить на две категории: закрытые и разделяемые.
Закрытые сборки это обычные сборки приложения, которые мы создаем в Visual Studio. Например, при создании библиотеки классов dll создается закрытая сборка. Впоследствии эту закрытую сборку мы можем использовать, подключив ее к другому проекту. А чтобы подключить к другому проекту, эту сборку можно просто положить рядом с исполняемым файлом и добавить в проект ссылку на нее через Add Reference. И на одной машине может быть десяток приложений, которые используют разные копии одной и той же сборки.
Если мы захотим удалить приложение, мы можем также удалить и используемую им закрытую сборку, и это не скажется на работе других приложений на локальной машине.
Иначе обстоит дело с разделяемыми сборками. По умолчанию при создании проекта visual Studio уже добавляет в проект ссылки на ряд разделяемых сборок. Открыв узел References (Ссылки). Например, Microsoft.CSharp.dll, System.dll, System.Core.dll - это все разделяемые сборки.
Читайте также: