Як витягти збірку з GAC?


134

Я маю справу, з яким я маю справу, який встановлює збірки прямо в GAC (наприклад, десь глибоко в% windows% / Assembly).

Як виконати фактичну збірку (DLL) з GAC у звичайну файлову систему?

Дякую.

Відповіді:


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 для Explorer, яке надає чіткий вигляд папці GAC. Якщо зареєструвати цей файл, вилучите переглядач кеш-складання, і папка GAC буде видно як будь-яка звичайна папка в Провіднику.
  2. Відкрийте "% windir% \ Assembly \ GAC_MSIL".

  3. Перейдіть до папки DLL вглиб, щоб знайти свою DLL.

  4. Скопіюйте DLL кудись на жорсткий диск і відправте його звідти у своєму проекті

  5. Запустіть "regsvr32% windir% \ Microsoft.NET \ Framework \ <. Каталог версій NET> \ shfusion.dll", щоб заново зареєструвати файл shfusion.dll та відновити початковий вигляд окремого вигляду GAC.


81
Це працює, але трохи складніше. Якщо ви не боїтеся командного рядка, ви можете просто ввести потрібний каталог і скопіювати DLL таким чином.
Cheeso

3
Просто встановіть TotalCommander, увімкніть опцію для перегляду всіх прихованих файлів, і ви можете захопити кожну бажану збірку
Патрік Петерс

4
@Andrew, схоже 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

Короткий зміст із статті:

  • Налаштування мережевого диска (Провідник -> Інструменти)
    • Мапа до \ ім'я сервера \ папка ( \\YourServer\C$\Windows\Assembly)
  • Не потрібно ділитися, якщо ви адміністратор
  • Перейдіть на привід і витягніть збірку

84

Відкрийте командний рядок та введіть:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Це повинно дати скидання всього ГАК

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


10
Відповідь Діпака була чіткішою та використав xcopy з відповідними прапорами.
катбайт

Я би оцінив цю відповідь №1, оскільки знадобилося 5 секунд, щоб отримати все, після того, як потрапляв на питання покрокового підходу.
FBryant87

24

Так.

Додати ключ реєстру DisableCacheViewer

Створіть новий ключ dword під HKLM \ Software \ Microsoft \ Fusion \ з ім'ям DisableCacheViewer і встановіть значення [DWORD] у 1.

Поверніться до Провідника Windows до папки збірки, і це буде звичайний вигляд файлової системи.


2
Відповідь занижена. Дякую!
xr280xr

1
Це справжнє рішення. Легко скасувати, і командний рядок не потрібен.
користувач2920518

16

Я думаю, що найпростіше це зробити через командний рядок, як згадує Давид. Єдина хитрість полягає в тому, що .dll не просто знаходиться на C: \ Windows \ Assembly. Ви повинні перейти до C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY]. Потім ви можете зробити копію, використовуючи:

скопіюйте [ASSEMBLY_NAME] .dll c: \ (або будь-яке місце, де ви хочете)

Сподіваюся, що це допомагає.


13

Простий спосіб, який я знайшов - це відкрити командний рядок і переглядати папку, яку ви згадуєте, доки не знайдете потрібну DLL - ви можете користуватися командою копіювання, щоб вийти з неї. Провідник Windows має "корисний" спеціальний вигляд цієї папки.


Я знайшов цікаве питання сьогодні вранці. Я оновлював DLL в GAC і використовував метод cmd line, щоб зробити резервну копію. Коли я намагався завантажити новий DLL (той самий номер версії), я отримав помилку, яка пішла лише після закриття вікна cmd. Мені потрібні кілька хвилин проклинання, щоб дізнатися, що пішло не так!
NeilD

11

Відкрийте RUN, а потім введіть %windir%\assembly\GAC_MSIL, це відкриє ваші клітини у вікні папок, ви зможете перейти до папки з назвою 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. Корисне резюме наведених методик.


3

Замість цього скористайтесь браузерним файлом "Total Commander".

  1. Увімкніть налаштування "показати приховані / системні файли" в Total Commander
  2. Перейдіть до "c: \ windows \ Assembly"
  3. копія

3

Подумайте, я придумав спосіб заглянути всередині GAC, не змінюючи реєстр, не використовуючи командний рядок, powerhell або будь-які інші програми:

Створіть новий ярлик (куди завгодно). Потім змініть ярлик, щоб мета була такою:

%windir%\assembly\GAC_MSIL\System

Якщо відкрити цей ярлик, ви перейдете до папки System всередині GAC (який повинен мати кожен) і має чудовий побічний ефект, що дозволяє перейти у вищий каталог, а потім переглядати будь-яку іншу папку, яку ви хочете (і побачити файли dll тощо)

Я перевірив це на Windows 7 та Windows Server 2012.

Примітка. Вона не дозволить вам використовувати цю ціль під час створення ярлика, але дозволить вам її редагувати.

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


2

просто перейдіть до C: \ Windows знайдіть папку [збирання] правою кнопкою миші та виберіть "Додати в архів"

трохи почекайте

vola, у вас є архівний файл, що містить усі збірки у вашому GAC


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 з пошуку «Вікно запуску». Я вибрав Див. Більше результатів. Той, хто в GAC, повернувся у вікні пошуку. Я правою кнопкою миші натиснув на нього і сказав, що відкрити розташування файлу Він відкрився в звичайному Windows Explorer. Я скопіював файл. Я закрив вікно. Зроблено.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.