Come estrarre un assembly dal GAC?


134

C'è un pacchetto che devo affrontare che installa gli assembly direttamente nel GAC (ad es. Da qualche parte in profondità in% windows% / assembly).

Come esorcizzare l'assembly effettivo (la DLL) dal GAC nel normale file system?

Grazie.

Risposte:


150

Ho usato il consiglio di questo articolo per ottenere un assemblaggio dal GAC.

Ottieni DLL da The GAC

Le DLL una volta distribuite in GAC (normalmente situate in c: \ windows \ assembly) non possono essere visualizzate o utilizzate come un normale file DLL. Non possono essere referenziati direttamente dal progetto VS. Gli sviluppatori di solito conservano una copia del file DLL originale e lo fanno riferimento nel progetto in fase di sviluppo (progettazione), che utilizza l'assemblaggio da GAC ​​durante il runtime del progetto.

Durante l'esecuzione (runtime) se si rileva che l'assembly è stato firmato e distribuito in GAC, CLR preleva automaticamente l'assembly dal GAC anziché dalla DLL a cui si fa riferimento durante la fase di progettazione in VS. Nel caso in cui lo sviluppatore abbia eliminato la DLL originale o non ce l'abbia per qualche motivo, c'è un modo per ottenere il file DLL da GAC. Attenersi alla seguente procedura per copiare DLL da GAC

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

    • shfusion.dll è una DLL di estensione explorer che dà un aspetto distinto alla cartella GAC. L'annullamento della registrazione di questo file rimuoverà il visualizzatore della cache dell'assembly e la cartella GAC ​​sarà quindi visibile come qualsiasi normale cartella in Explorer.
  2. Apri "% windir% \ assembly \ GAC_MSIL".

  3. Passare alla cartella DLL nel profondo per trovare la DLL.

  4. Copia la DLL da qualche parte sul tuo disco rigido e fai riferimento da lì nel tuo progetto

  5. Eseguire "regsvr32% windir% \ Microsoft.NET \ Framework \ <. Directory versione NET> \ shfusion.dll" per registrare nuovamente il file shfusion.dll e riconquistare la vista distinta originale del GAC.


81
Funziona ma è un po 'complicato. Se non hai paura del prompt dei comandi, puoi semplicemente eseguire il cd nella directory necessaria e copiare la DLL in questo modo.
Cheeso,

3
Installa TotalCommander, abilita l'opzione per vedere tutti i file nascosti e puoi prendere ogni assembly che desideri
Patrick Peters

4
@Andrew, sembra shfusion.dllche non supporti il DllInstall()punto di ingresso invocato regsvr32quando viene passata l' /iopzione. Se si omette tale opzione, è possibile registrare nuovamente il componente correttamente.
Frédéric Hamidi,

9
Puoi saltare i passaggi 1 e 2 e andare direttamente a% windir% \ assembly \ GAC_MSIL e navigare da lì.
Christian Fredh,

5
@ChristianFredh Solo una nota: per me, questo può essere fatto solo direttamente dalla finestra di dialogo Esegui.
xr280xr,


84

Apri il prompt dei comandi e digita:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Questo dovrebbe dare il dump dell'intero GAC

Godere!


10
La risposta di Deepak è stata più chiara e ha usato xcopy con le bandiere appropriate.
Katbyte,

Valuterei questa risposta n. 1 in quanto ci sono voluti 5 secondi per ottenere tutto, dopo aver colpito i problemi sugli approcci passo-passo.
FBryant87,

24

Sì.

Aggiungi la chiave di registro DisableCacheViewer

Creare una nuova chiave dword in HKLM \ Software \ Microsoft \ Fusion \ con il nome DisableCacheViewer e impostare il valore [DWORD] su 1.

Torna a Esplora risorse nella cartella assembly e sarà la normale vista del file system.


2
Risposta sottovalutata. Grazie!
xr280xr,

1
Questa è la vera soluzione. Facile da annullare e nessuna riga di comando necessaria.
user2920518

16

Penso che il modo più semplice sia farlo attraverso la riga di comando come menziona David. L'unico trucco è che il DLL non si trova semplicemente in C: \ Windows \ Assembly. Devi passare a C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [TASTO PUBBLICO]. Puoi quindi fare una copia usando:

copia [ASSEMBLY_NAME] .dll c: \ (o qualunque posizione desideri)

Spero che aiuti.


13

Il modo più semplice che ho trovato è aprire il prompt dei comandi e sfogliare la cartella menzionata fino a trovare la DLL desiderata, quindi è possibile utilizzare il comando copia per estrarlo. Windows Explorer ha una vista speciale "utile" di questa cartella.


Ho trovato un problema interessante stamattina. Stavo aggiornando una DLL nel GAC e ho usato il metodo della linea cmd per eseguire un backup. Quando ho provato a caricare la nuova DLL (stesso numero di versione), ho ricevuto un errore che è scomparso solo quando ho chiuso la finestra cmd. Mi ci sono voluti alcuni minuti di imprecazioni per scoprire cosa non andava!
NeilD

11

Apri Esegui quindi digita %windir%\assembly\GAC_MSIL, questo aprirà le tue dll nella vista delle cartelle, puoi quindi passare alla cartella con nome DLL e aprirla, troverai il tuo file dll e copiarlo facilmente


Soluzione molto semplice. Grazie.
Dblock247,

4

Sono l'autore di PowerShell GAC . Con PowerShell GAC è possibile estrarre assiemi dal GAC senza dipendere dagli interni di GAC come modificare le strutture delle cartelle.

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany

3

Questo post sul blog MSDN descrive tre modi separati di estrarre una DLL dal GAC. Un utile sommario dei metodi finora forniti.


3

Utilizzare invece il browser di file "Total Commander".

  1. Abilita l'impostazione "mostra file nascosti / di sistema" in Total Commander
  2. Cerca "c: \ windows \ assembly"
  3. copia

3

Penso di aver trovato un modo per guardare all'interno del GAC senza modificare il registro o utilizzare la riga di comando, PowerShell o altri programmi:

Crea un nuovo collegamento (ovunque). Quindi modificare il collegamento in modo che la destinazione sia:

%windir%\assembly\GAC_MSIL\System

L'apertura di questo collegamento porta alla cartella Sistema all'interno del GAC (che tutti dovrebbero avere) e ha il meraviglioso effetto collaterale di farti passare a una directory superiore e quindi navigare in qualsiasi altra cartella desiderata (e vedere i file DLL, ecc.)

Ho provato questo su Windows 7 e Windows Server 2012.

Nota: non ti consentirà di utilizzare quella destinazione durante la creazione del collegamento, ma ti consentirà di modificarlo.

Godere!


2

vai su C: \ Windows trova il tasto destro della cartella [assembly] e seleziona aggiungi all'archivio

aspetta un po

vola hai un file di archivio contenente tutti gli assembly nel tuo GAC


2

Da uno script Powershell, puoi provare questo. Avevo solo una versione dell'assemblaggio nel GAC, quindi ha funzionato bene.

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

dove il percorso dell'assembly può usare caratteri jolly.


0

Un'altra direzione: basta decomprimere il file MSI e ottenere le chicche in quel modo. Ti salva dall'eventuale disinstallazione. . .


0

La copia da una riga di comando non è necessaria. Ho digitato il nome della DLL dalla ricerca di Start Window. Ho scelto Visualizza più risultati. Quello nel GAC è stato restituito nella finestra di ricerca. Ho cliccato con il tasto destro su di esso e ho detto che il file è aperto Si è aperto in Windows Explorer normale. Ho copiato il file. Ho chiuso la finestra. Fatto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.