136 votes

Comment extraire un assemblage du GAC ?

Je dois m'occuper d'un paquet qui installe des assemblages directement dans le GAC (par exemple, quelque part au fond de %Windows%/assembly).

Comment puis-je exorciser l'assemblage réel (la DLL) du GAC vers le système de fichiers normal ?

Merci.

150voto

Andrew Hare Points 159332

J'ai utilisé les conseils de cet article pour obtenir un assemblage du GAC.

Sortir la DLL du GAC

DLLs une fois déployées dans le GAC (normalement situé à c : \windows\assembly ) ne peuvent pas être visualisés ou utilisé comme un fichier DLL normal. Ils ne peuvent pas être référencés directement à partir de VS . Les développeurs conservent généralement une copie du fichier DLL original et et s'y réfèrent dans le projet au moment projet au moment du développement (conception), qui utilise l'assemblage du GAC pendant l'exécution du projet.

Pendant l'exécution (run-time), si le assembly s'avère être signé et déployé dans le GAC, le CLR récupère automatiquement récupère automatiquement l'assembly dans le GAC au lieu de la DLL référencée pendant conception dans VS. Dans le cas où le développeur a supprimé la DLL originale ou ne l'a pas pour une raison quelconque, il existe un moyen de récupérer le fichier DLL du GAC. Suivez les étapes suivantes pour copier la DLL du GAC

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

    • shfusion.dll est une DLL d'extension de l'explorateur qui donne une distinct au dossier GAC. Le désenregistrement de ce fichier supprimera l'assemblage cache viewer et le dossier GAC sera sera alors visible comme n'importe quel dossier normal dans l'explorateur.
  2. Ouvrez "%windir%". \assembly\GAC_MSIL ".

  3. Naviguez jusqu'à votre dossier DLL dans la profondeur pour trouver votre DLL.

  4. Copiez la DLL quelque part sur votre disque dur et référez-la à partir de là dans votre projet

  5. Exécutez "regsvr32 %windir%". \Microsoft.NET\Framework\ <.NET répertoire de la version> \shfusion.dll " pour réenregistrer le fichier shfusion.dll et retrouver la vue originale distincte du le GAC.

82 votes

Cela fonctionne mais est un peu compliqué. Si vous n'avez pas peur de l'invite de commande, vous pouvez simplement vous rendre dans le répertoire nécessaire et copier la DLL de cette façon.

3 votes

Installez TotalCommander, activez l'option permettant de voir tous les fichiers cachés et vous pourrez récupérer tous les assemblages que vous voulez.

4 votes

@Andrew, il semble que shfusion.dll ne prend pas en charge le DllInstall() point d'entrée invoqué par regsvr32 lorsqu'on lui transmet le /i option. L'omission de cette option permet de réenregistrer le composant avec succès.

108voto

Sadjad Points 923

La méthode décrite ici est très simple :

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

Résumé de l'article :

  • Mapper un lecteur réseau (Explorer -> Outils)
    • Carte vers \servername\folder ( \\YourServer\C$\Windows\Assembly )
  • Pas besoin de partager si vous êtes l'administrateur
  • Naviguez jusqu'au disque et extrayez votre assemblage

90voto

Deepak Points 241

Ouvrez l'invite de commande et tapez :

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Cela devrait donner la décharge de l'ensemble du GAC.

Profitez-en !

10 votes

La réponse de Deepak était plus claire et utilisait xcopy avec les drapeaux appropriés.

0 votes

Je donnerais la note 1 à cette réponse car il m'a fallu 5 secondes pour tout obtenir, après avoir rencontré des problèmes dans les approches pas à pas.

24voto

mccrager Points 832

Oui.

Ajouter la clé de registre DisableCacheViewer

Créez une nouvelle clé dword sous HKLM \Software\Microsoft\Fusion\ avec le nom DisableCacheViewer et définissez sa valeur [DWORD] à 1.

Retournez dans l'Explorateur Windows vers le dossier d'assemblage et vous verrez le système de fichiers normal.

2 votes

Réponse sous-estimée. Merci !

1 votes

C'est la vraie solution. Facile à défaire, et aucune ligne de commande n'est nécessaire.

16voto

AdamB Points 1290

Je pense que le plus simple est de le faire par la ligne de commande comme le mentionne David. Le seul problème est que le fichier .dll n'est pas simplement situé à l'adresse C:\Windows\Assembly. Vous devez naviguer vers C:\Windows\Assembly\GAC\ [NOM_DE_L'ASSEMBLAGE]\[NUMÉRO_DE_VERSION]_[CLÉ_PUBLIQUE]. Vous pouvez ensuite faire une copie en utilisant :

copier [NOM_ASSEMBLAGE].dll c:\ (ou l'emplacement de votre choix)

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X