Jak wyodrębnić zestaw z GAC?

134

Jest pakiet, z którym mam do czynienia, który instaluje zestawy bezpośrednio do GAC (np. Gdzieś głęboko w% windows% / assembly).

Jak egzorcyzmować rzeczywisty zestaw (bibliotekę DLL) z GAC do normalnego systemu plików?

Dzięki.

AngryHacker
źródło

Odpowiedzi:

150

Skorzystałem z porady z tego artykułu, aby uzyskać zestaw z GAC.

Pobierz DLL z GAC

Biblioteki DLL raz wdrożone w GAC (zwykle zlokalizowane w c: \ windows \ assembly) nie mogą być przeglądane ani używane jako normalne pliki DLL. Nie można się do nich odwoływać bezpośrednio z projektu VS. Deweloperzy zwykle przechowują kopię oryginalnego pliku DLL i odwołują się do niej w projekcie w czasie programowania (projektowania), który wykorzystuje zestaw z GAC w czasie wykonywania projektu.

Podczas wykonywania (w czasie wykonywania), jeśli okaże się, że zestaw jest podpisany i wdrożony w GAC, środowisko CLR automatycznie pobiera zestaw z GAC zamiast z biblioteki DLL, do której odwołuje się podczas projektowania w VS. W przypadku, gdy programista usunął oryginalną bibliotekę DLL lub z jakiegoś powodu jej nie ma, istnieje sposób na pobranie pliku DLL z GAC. Wykonaj następujące kroki, aby skopiować bibliotekę DLL z GAC

  1. Uruchom regsvr32 / u C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ shfusion.dll

    • shfusion.dll jest rozszerzeniem DLL eksploratora, który nadaje folderowi GAC inny wygląd. Wyrejestrowanie tego pliku spowoduje usunięcie przeglądarki pamięci podręcznej zestawu, a folder GAC będzie wtedy widoczny jako każdy normalny folder w eksploratorze.
  2. Otwórz „% windir% \ assembly \ GAC_MSIL”.

  3. Przejdź do folderu DLL w głąb, aby znaleźć bibliotekę DLL.

  4. Skopiuj bibliotekę DLL gdzieś na dysku twardym i skieruj ją stamtąd w swoim projekcie

  5. Uruchom „regsvr32% windir% \ Microsoft.NET \ Framework \ <katalog wersji .NET> \ shfusion.dll”, aby ponownie zarejestrować plik shfusion.dll i przywrócić oryginalny, odrębny widok GAC.

Andrew Hare
źródło
81
To działa, ale jest trochę skomplikowane. Jeśli nie boisz się wiersza poleceń, możesz po prostu cd do odpowiedniego katalogu i skopiować w ten sposób bibliotekę DLL.
Cheeso
3
Po prostu zainstaluj TotalCommander, włącz opcję wyświetlania wszystkich ukrytych plików i możesz pobrać każdy zestaw, który chcesz
Patrick Peters
4
@Andrew, wygląda na to, że shfusion.dllnie obsługuje DllInstall()punktu wejścia wywoływanego przez regsvr32po przekazaniu /iopcji. Pominięcie tej opcji umożliwia pomyślną ponowną rejestrację komponentu.
Frédéric Hamidi
9
Możesz pominąć kroki 1 i 2 i przejść bezpośrednio do% windir% \ assembly \ GAC_MSIL i przeglądać stamtąd.
Christian Fredh
5
@ChristianFredh Uwaga: dla mnie można to zrobić tylko bezpośrednio z okna dialogowego Uruchom.
xr280xr
84

Otwórz wiersz polecenia i wpisz:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

To powinno dać zrzut całego GAC

Cieszyć się!

Deepak
źródło
10
Odpowiedź firmy Deepak była wyraźniejsza i użyto xcopy z odpowiednimi flagami.
katbyte
Oceniłbym tę odpowiedź jako nr 1, ponieważ uzyskanie wszystkiego zajęło 5 sekund, po trafieniu do problemów z podejściami krok po kroku.
FBryant87
24

Tak.

Dodaj klucz rejestru DisableCacheViewer

Utwórz nowy klucz dword w HKLM \ Software \ Microsoft \ Fusion \ o nazwie DisableCacheViewer i ustaw jego wartość [DWORD] na 1.

Wróć do Eksploratora Windows do folderu zespołu i będzie to normalny widok systemu plików.

mccrager
źródło
2
Niedoceniana odpowiedź. Dzięki!
xr280xr
1
To jest prawdziwe rozwiązanie. Łatwe do cofnięcia i bez wiersza poleceń.
user2920518
16

Myślę, że najłatwiej jest zrobić to za pomocą wiersza poleceń, o którym wspomina David. Jedyna sztuczka polega na tym, że plik .dll nie znajduje się po prostu w C: \ Windows \ Assembly. Musisz przejść do C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY]. Następnie możesz wykonać kopię za pomocą:

skopiuj [ASSEMBLY_NAME] .dll c: \ (lub dowolną lokalizację)

Mam nadzieję, że to pomoże.

AdamB
źródło
13

Prostym sposobem, jaki znalazłem, jest otwarcie wiersza polecenia i przeglądanie wymienionego folderu, aż znajdziesz żądaną bibliotekę DLL - możesz następnie użyć polecenia kopiowania, aby go usunąć. Eksplorator Windows ma „pomocny” specjalny widok tego folderu.

David M.
źródło
Dziś rano znalazłem interesujący numer. Aktualizowałem bibliotekę DLL w GAC i użyłem metody linii cmd, aby wykonać kopię zapasową. Kiedy próbowałem załadować nową bibliotekę DLL (ten sam numer wersji), otrzymałem błąd, który zniknął dopiero po zamknięciu okna cmd. Zajęło mi kilka minut przeklinania, aby dowiedzieć się, co się dzieje!
NeilD
11

Otwórz RUN, a następnie wpisz %windir%\assembly\GAC_MSIL, spowoduje to otwarcie twoich dll w widoku folderów, możesz następnie przejść do nazwanego folderu dll i otworzyć go, znajdziesz plik dll i łatwo go skopiujesz

Hazem Abdelwahab
źródło
Bardzo proste rozwiązanie. Dziękuję Ci.
Dblock247
4

Jestem autorem PowerShell GAC . Dzięki PowerShell GAC możesz wyodrębniać zestawy z GAC bez polegania na elementach wewnętrznych GAC, takich jak zmiana struktury folderów.

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany
Lars Truijens
źródło
3

W tym poście na blogu MSDN opisano trzy różne sposoby wyodrębniania biblioteki DLL z GAC. Przydatne podsumowanie dotychczas podanych metod.

MagicAndi
źródło
3

Zamiast tego użyj przeglądarki plików „Total Commander”.

  1. Włącz ustawienie „pokaż ukryte / systemowe pliki” w Total Commander
  2. Przejdź do „c: \ windows \ assembly”
  3. Kopiuj
Maks
źródło
3

Myślę, że znalazłem sposób, aby zajrzeć do GAC bez modyfikowania rejestru lub korzystania z wiersza poleceń, PowerShell lub innych programów:

Utwórz nowy skrót (do dowolnego miejsca). Następnie zmodyfikuj skrót, aby cel był:

%windir%\assembly\GAC_MSIL\System

Otwarcie tego skrótu przenosi Cię do folderu System w GAC (który każdy powinien mieć) i ma wspaniały efekt uboczny, umożliwiając przejście do wyższego katalogu, a następnie przeglądanie dowolnego innego folderu, który chcesz (i przeglądanie plików dll itp.)

Przetestowałem to na Windows 7 i Windows Server 2012.

Uwaga: nie pozwoli ci to użyć tego celu podczas tworzenia skrótu, ale pozwoli ci go edytować.

Cieszyć się!

Bolo
źródło
2

po prostu przejdź do C: \ Windows znajdź folder [zespół], kliknij prawym przyciskiem myszy i wybierz dodaj do archiwum

Poczekaj chwilę

vola masz plik archiwum zawierający wszystkie zespoły w twoim GAC

tsadigov
źródło
2

Możesz spróbować tego ze skryptu Powershell. Miałem tylko jedną wersję zespołu w GAC, więc to działało dobrze.

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

gdzie ścieżka zestawu może używać symboli wieloznacznych.

Phil Kermeen
źródło
0

W innym kierunku - po prostu rozpakuj plik MSI i zdobądź w ten sposób gadżety. Oszczędza przed ewentualnym odinstalowaniem. . .

Wyatt Barnett
źródło
0

Kopiowanie z wiersza poleceń nie jest konieczne. Wpisałem nazwę biblioteki DLL z wyszukiwania w oknie Start. Wybrałem opcję Zobacz więcej wyników. Ten z GAC został zwrócony w oknie wyszukiwania. Kliknąłem go prawym przyciskiem myszy i powiedziałem, że otwórz lokalizację pliku. Otworzył się w normalnym Eksploratorze Windows. Skopiowałem plik. Zamknąłem okno. Gotowe.

Scott Shaw-Smith
źródło