Как извлечь сборку из GAC?

134

Есть пакет, с которым мне приходится иметь дело, который устанавливает сборки прямо в GAC (например, где-то глубоко в% windows% / assembly).

Как изгнать фактическую сборку (DLL) из GAC в обычную файловую систему?

Спасибо.

AngryHacker
источник

Ответы:

150

Я использовал совет из этой статьи, чтобы получить сборку от GAC.

Получить DLL из GAC

Библиотеки DLL, однажды развернутые в GAC (обычно расположенные в каталоге c: \ windows \ assembly), нельзя просмотреть или использовать как обычный файл DLL. На них нельзя напрямую ссылаться из проекта VS. Разработчики обычно сохраняют копию исходного файла DLL и ссылаются на нее в проекте во время разработки (проектирования), который использует сборку из GAC во время выполнения проекта.

Во время выполнения (во время выполнения), если сборка будет подписана и развернута в GAC, CLR автоматически забирает сборку из GAC, а не из библиотеки DLL, на которую ссылаются во время разработки в VS. В случае, если разработчик удалил оригинальную DLL или по какой-то причине ее не было, есть способ получить файл DLL из GAC. Выполните следующие шаги, чтобы скопировать DLL из GAC

  1. Запустите regsvr32 / u C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ shfusion.dll

    • shfusion.dll - это DLL расширения проводника, которая придает отчетливый вид папке GAC. Отмена регистрации этого файла приведет к удалению средства просмотра кэша сборок, и папка GAC будет видна как любая обычная папка в проводнике.
  2. Откройте «% windir% \ assembly \ GAC_MSIL».

  3. Перейдите в свою папку DLL вглубь, чтобы найти свою DLL.

  4. Скопируйте DLL куда-нибудь на жесткий диск и отошлите ее оттуда в свой проект.

  5. Запустите "regsvr32% windir% \ Microsoft.NET \ Framework \ <.NET version version> \ shfusion.dll", чтобы заново зарегистрировать файл shfusion.dll и восстановить исходное отдельное представление GAC.

Эндрю Хэйр
источник
81
Это работает, но немного сложно. Если вы не боитесь командной строки, вы можете просто перейти в нужный каталог и скопировать DLL таким образом.
Cheeso
3
Просто установите TotalCommander, включите опцию, чтобы увидеть все скрытые файлы, и вы можете получить любую сборку, которую хотите
Патрик Питерс
4
@ Андрей, похоже shfusion.dll, не поддерживает DllInstall()точку входа, вызываемую regsvr32при передаче /iопции. Отказ от этой опции позволяет успешно перерегистрировать компонент.
Фредерик Хамиди
9
Вы можете пропустить шаги 1 и 2, перейти непосредственно к% windir% \ assembly \ GAC_MSIL и просмотреть его оттуда.
Кристиан Фред
5
@ChristianFredh Просто примечание: для меня это может быть сделано только непосредственно из диалога Run.
xr280xr
108

Метод, описанный здесь, очень прост:

http://andreasglaser.net/post/2008/08/05/Extract-assembly-from-Global-Assembly-Cache-(GAC)-with-network-drive-mapping.aspx

Резюме из статьи:

  • Подключить сетевой диск (Проводник -> Инструменты)
    • Сопоставить с \ servername \ folder ( \\YourServer\C$\Windows\Assembly)
  • Нет необходимости делиться, если вы являетесь администратором
  • Перейдите к диску и распакуйте вашу сборку
Sadjad
источник
84

Откройте командную строку и введите:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Это должно дать дамп всего GAC

Наслаждайтесь!

Дипак
источник
10
Ответ Дипака был яснее и использовал xcopy с соответствующими флагами.
katbyte
Я бы оценил этот ответ № 1, так как потребовалось 5 секунд, чтобы получить все, после решения проблем на пошаговых подходах.
FBryant87
24

Да.

Добавить ключ реестра DisableCacheViewer

Создайте новый ключ dword в HKLM \ Software \ Microsoft \ Fusion \ с именем DisableCacheViewer и установите его значение [DWORD] в 1.

Вернитесь в Проводник Windows в папку сборки, и это будет обычное представление файловой системы.

mccrager
источник
2
Недооцененный ответ. Спасибо!
xr280xr
1
Это реальное решение. Легко отменить, и нет необходимости в командной строке.
user2920518
16

Я думаю, что самый простой способ - сделать это через командную строку, как упоминает Дэвид. Единственная хитрость в том, что .dll не просто находится в C: \ Windows \ Assembly. Вы должны перейти к C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY]. Затем вы можете сделать копию, используя:

скопируйте [ASSEMBLY_NAME] .dll c: \ (или в любое другое место)

Надеюсь, это поможет.

AdamB
источник
13

Простой способ, который я нашел, - это открыть командную строку и просмотреть папку, о которой вы упомянули, пока не найдете нужную библиотеку DLL. Затем вы можете воспользоваться командой copy, чтобы получить ее. Проводник Windows имеет «полезный» специальный вид этой папки.

Дэвид М
источник
Я нашел интересную проблему этим утром. Я обновлял DLL в GAC и использовал метод строки cmd для создания резервной копии. Когда я попытался загрузить новую DLL (с ​​тем же номером версии), я получил ошибку, которая исчезла, только когда я закрыл окно cmd. Мне понадобилось несколько минут ругательства, чтобы выяснить, что происходит не так!
NeilD
11

Откройте RUN, затем напечатайте %windir%\assembly\GAC_MSIL, это откроет ваши dll в представлении папок, затем вы сможете перейти к вашей dll-папке и открыть ее, вы найдете свой dll-файл и легко скопируете его

Хазем Абдельвахаб
источник
Очень простое решение. Спасибо.
Dblock247
4

Я являюсь автором PowerShell GAC . С PowerShell GAC вы можете извлекать сборки из GAC, не завися от внутренних компонентов GAC, таких как изменение структуры папок.

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany
Ларс Труйенс
источник
3

Этот пост в блоге MSDN описывает три отдельных способа извлечения DLL из GAC. Полезное краткое изложение методов, приведенных до сих пор.

MagicAndi
источник
3

Вместо этого используйте браузер файлов "Total Commander".

  1. Включите параметр «показывать скрытые / системные файлы» в Total Commander
  2. Перейдите к «c: \ windows \ assembly»
  3. копия
Максимум
источник
3

Думаю, я нашел способ заглянуть внутрь GAC, не изменяя реестр и не используя командную строку, powershell или любые другие программы:

Создайте новый ярлык (в любом месте). Затем измените ярлык, чтобы цель была:

%windir%\assembly\GAC_MSIL\System

Открытие этого ярлыка приводит вас к системной папке внутри GAC (что должно быть у каждого) и имеет замечательный побочный эффект: вы можете переключиться на более высокий каталог, а затем перейти в любую другую папку, которую вы хотите (и увидеть файлы dll и т. Д.)

Я проверил это на Windows 7 и Windows Server 2012.

Примечание. Это не позволит вам использовать эту цель при создании ярлыка, но позволит вам ее редактировать.

Наслаждайтесь!

Боло
источник
2

просто перейдите в C: \ Windows, найдите папку [Assembly], щелкните правой кнопкой мыши и выберите Добавить в архив.

подождите немного

vola у вас есть архивный файл, содержащий все сборки в вашем GAC

tsadigov
источник
2

Из скрипта Powershell вы можете попробовать это. У меня была только одна версия сборки в GAC, так что это работало просто отлично.

cd "c:\Windows\Microsoft.NET\assembly\GAC_MSIL\"
Get-ChildItem assemblypath -Recurse -Include *.dll |  Copy-Item -Destination "c:\folder to copy to"

где путь сборки может использовать подстановочные знаки.

Фил Кермин
источник
0

Еще одно направление - просто распакуйте файл MSI и получите вкусности таким образом. Спасает вас от возможного удаления. , ,

Уайетт Барнетт
источник
0

Копирование из командной строки не требуется. Я набрал имя DLL из поиска в окне «Пуск». Я выбрал See More Results. Один в GAC был возвращен в окне поиска. Я щелкнул правой кнопкой мыши по нему и сказал, что открыть файл. Открывался в обычном проводнике Windows. Я скопировал файл. Я закрыл окно. Готово.

Скотт Шоу-Смит
источник