Wie extrahiere ich eine Baugruppe aus dem GAC?

134

Es gibt ein Paket, mit dem ich mich befassen muss, das Assemblys direkt im GAC installiert (z. B. irgendwo tief in% windows% / Assembly).

Wie kann ich die eigentliche Assembly (die DLL) aus dem GAC in das normale Dateisystem austreiben?

Vielen Dank.

AngryHacker
quelle

Antworten:

150

Ich habe den Rat aus diesem Artikel verwendet , um eine Baugruppe vom GAC zu erhalten.

Holen Sie sich DLL aus dem GAC

DLLs, die einmal in GAC bereitgestellt wurden (normalerweise unter c: \ windows \ Assembly), können nicht als normale DLL-Datei angezeigt oder verwendet werden. Sie können nicht direkt aus dem VS-Projekt referenziert werden. Entwickler behalten normalerweise eine Kopie der ursprünglichen DLL-Datei und verweisen im Projekt zur Entwicklungszeit (Entwurfszeit) darauf, wobei die Assembly von GAC zur Laufzeit des Projekts verwendet wird.

Wenn während der Ausführung (Laufzeit) festgestellt wird, dass die Assembly in GAC signiert und bereitgestellt ist, übernimmt die CLR die Assembly automatisch aus dem GAC anstelle der DLL, auf die während der Entwurfszeit in VS verwiesen wird. Falls der Entwickler die ursprüngliche DLL gelöscht hat oder sie aus irgendeinem Grund nicht hat, gibt es eine Möglichkeit, die DLL-Datei von GAC abzurufen. Führen Sie die folgenden Schritte aus, um die DLL aus dem GAC zu kopieren

  1. Führen Sie regsvr32 / u C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ shfusion.dll aus

    • shfusion.dll ist eine Explorer-Erweiterungs-DLL, die dem GAC-Ordner ein eindeutiges Aussehen verleiht. Wenn Sie die Registrierung dieser Datei aufheben, wird der Assembly-Cache-Viewer entfernt und der GAC-Ordner wird als normaler Ordner im Explorer angezeigt.
  2. Öffnen Sie "% windir% \ Assembly \ GAC_MSIL".

  3. Navigieren Sie zu Ihrem DLL-Ordner in der Tiefe, um Ihre DLL zu finden.

  4. Kopieren Sie die DLL irgendwo auf Ihre Festplatte und verweisen Sie von dort in Ihr Projekt

  5. Führen Sie "regsvr32% windir% \ Microsoft.NET \ Framework \ <. NET-Versionsverzeichnis> \ shfusion.dll" aus, um die Datei shfusion.dll erneut zu registrieren und die ursprüngliche eindeutige Ansicht des GAC wiederherzustellen.

Andrew Hare
quelle
81
Das funktioniert aber ist etwas kompliziert. Wenn Sie keine Angst vor der Eingabeaufforderung haben, können Sie einfach in das erforderliche Verzeichnis cd und die DLL auf diese Weise kopieren.
Cheeso
3
Installieren Sie einfach TotalCommander, aktivieren Sie die Option, um alle versteckten Dateien anzuzeigen, und Sie können jede gewünschte Assembly abrufen
Patrick Peters
4
@ Andrew, es sieht so aus, als würde shfusion.dllder DllInstall()Einstiegspunkt, der regsvr32beim Übergeben der /iOption aufgerufen wird, nicht unterstützt . Wenn Sie diese Option weglassen, können Sie die Komponente erfolgreich neu registrieren.
Frédéric Hamidi
9
Sie können Schritt 1 und 2 überspringen und direkt zu% windir% \ Assembly \ GAC_MSIL gehen und von dort aus navigieren.
Christian Fredh
5
@ChristianFredh Nur ein Hinweis: Für mich ist dies nur direkt über den Dialog Ausführen möglich.
xr280xr
108

Die hier beschriebene Methode ist sehr einfach:

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

Zusammenfassung aus Artikel:

  • Ordnen Sie ein Netzwerklaufwerk zu (Explorer -> Extras)
    • Zuordnen zu \ Servername \ Ordner ( \\YourServer\C$\Windows\Assembly)
  • Sie müssen nicht freigeben, wenn Sie der Administrator sind
  • Navigieren Sie zum Laufwerk und extrahieren Sie Ihre Baugruppe
Sadjad
quelle
84

Öffnen Sie die Eingabeaufforderung und geben Sie Folgendes ein:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Dies sollte den Dump des gesamten GAC ergeben

Genießen!

Deepak
quelle
10
Deepaks Antwort war klarer und verwendete xcopy mit den entsprechenden Flags.
Katbyte
Ich würde diese Antwort als Nummer 1 bewerten, da es 5 Sekunden dauerte, bis alles fertig war, nachdem ich Probleme mit den schrittweisen Ansätzen hatte.
FBryant87
24

Ja.

Fügen Sie den DisableCacheViewer-Registrierungsschlüssel hinzu

Erstellen Sie unter HKLM \ Software \ Microsoft \ Fusion \ einen neuen Dword-Schlüssel mit dem Namen DisableCacheViewer und setzen Sie den Wert [DWORD] auf 1.

Kehren Sie zum Windows-Explorer zum Assembly-Ordner zurück. Dies ist die normale Dateisystemansicht.

mccrager
quelle
2
Unterbewertete Antwort. Vielen Dank!
xr280xr
1
Dies ist die wirkliche Lösung. Einfach rückgängig zu machen und keine Kommandozeile erforderlich.
user2920518
16

Ich denke, der einfachste Weg ist es, es über die Kommandozeile zu tun, wie David es erwähnt. Der einzige Trick ist, dass sich die DLL nicht einfach unter C: \ Windows \ Assembly befindet. Sie müssen zu C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY] navigieren. Sie können dann eine Kopie erstellen mit:

Kopieren Sie [ASSEMBLY_NAME] .dll c: \ (oder einen beliebigen Speicherort)

Hoffentlich hilft das.

AdamB
quelle
13

Ich habe festgestellt, dass es einfach ist, die Eingabeaufforderung zu öffnen und den von Ihnen genannten Ordner zu durchsuchen, bis Sie die gewünschte DLL gefunden haben. Anschließend können Sie den Befehl copy verwenden, um sie herauszuholen. Windows Explorer bietet eine "hilfreiche" Sonderansicht dieses Ordners.

David M.
quelle
Ich habe heute Morgen ein interessantes Problem gefunden. Ich habe eine DLL im GAC aktualisiert und die cmd-Zeilenmethode verwendet, um ein Backup zu erstellen. Beim Versuch, die neue DLL (gleiche Versionsnummer) hochzuladen, wurde eine Fehlermeldung angezeigt, die erst beim Herunterfahren des Cmd-Fensters behoben wurde. Ich brauchte ein paar Minuten, um herauszufinden, was falsch lief!
NeilD
11

Öffnen Sie RUN und geben %windir%\assembly\GAC_MSILSie Folgendes ein. Dadurch werden Ihre DLLs in der Ordneransicht geöffnet. Sie können dann zu Ihrem Ordner mit dem Namen DLL navigieren und ihn öffnen. Sie finden Ihre DLL-Datei und können sie einfach kopieren

Hazem Abdelwahab
quelle
Sehr einfache Lösung. Danke dir.
Dblock247
4

Ich bin der Autor von PowerShell GAC . Mit PowerShell GAC können Sie Assemblys aus dem GAC extrahieren, ohne von GAC-Interna abhängig zu sein, z. B. das Ändern von Ordnerstrukturen.

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany
Lars Truijens
quelle
3

Dieser MSDN-Blogbeitrag beschreibt drei verschiedene Möglichkeiten zum Extrahieren einer DLL aus dem GAC. Eine nützliche Zusammenfassung der bisher gegebenen Methoden.

MagicAndi
quelle
3

Verwenden Sie stattdessen den Dateibrowser "Total Commander".

  1. Aktivieren Sie die Einstellung "Versteckte / Systemdateien anzeigen" in Total Commander
  2. Navigieren Sie zu "c: \ windows \ Assembly".
  3. Kopieren
Max
quelle
3

Ich glaube, ich habe einen Weg gefunden, um in das GAC zu schauen, ohne die Registrierung zu ändern oder die Befehlszeile, Powershell oder andere Programme zu verwenden:

Erstellen Sie eine neue Verknüpfung (zu einer beliebigen Stelle). Ändern Sie dann die Verknüpfung so, dass das Ziel wie folgt lautet:

%windir%\assembly\GAC_MSIL\System

Das Öffnen dieser Verknüpfung führt Sie zum Systemordner im GAC (den jeder haben sollte) und hat den wunderbaren Nebeneffekt, dass Sie in ein höheres Verzeichnis wechseln und dann in einen anderen gewünschten Ordner navigieren können (und die DLL-Dateien usw. anzeigen können).

Ich habe dies unter Windows 7 und Windows Server 2012 getestet.

Hinweis: Sie können dieses Ziel beim Erstellen der Verknüpfung nicht verwenden, aber Sie können es bearbeiten.

Genießen!

Bolo
quelle
2

Navigieren Sie einfach zu C: \ Windows. Suchen Sie den Ordner [Assembly] mit der rechten Maustaste und wählen Sie Zum Archiv hinzufügen

warte ein bisschen

vola Sie haben eine Archivdatei, die alle Assemblys in Ihrem GAC enthält

Tsadigov
quelle
2

In einem Powershell-Skript können Sie dies versuchen. Ich hatte nur eine einzige Version der Baugruppe im GAC, daher funktionierte dies einwandfrei.

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

Dabei kann der Assemblypfad Platzhalter verwenden.

Phil Kermeen
quelle
0

Eine andere Richtung - entpacken Sie einfach die MSI-Datei und holen Sie sich die Goodies auf diese Weise. Spart Ihnen die eventuelle Deinstallation. . .

Wyatt Barnett
quelle
0

Das Kopieren von einer Befehlszeile ist nicht erforderlich. Ich habe den Namen der DLL aus der Startfenstersuche eingegeben. Ich habe See More Results gewählt. Der im GAC wurde im Suchfenster zurückgegeben. Ich habe mit der rechten Maustaste darauf geklickt und den Speicherort der geöffneten Datei angegeben. Es wurde im normalen Windows Explorer geöffnet. Ich habe die Datei kopiert. Ich schloss das Fenster. Getan.

Scott Shaw-Smith
quelle