Comment extraire un assemblage du GAC?

134

Il y a un paquet avec lequel je dois traiter qui installe les assemblys directement dans le GAC (par exemple quelque part au fond de% windows% / assembly).

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

Merci.

AngryHacker
la source

Réponses:

150

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

Sortez la DLL du GAC

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

Lors de l'exécution (au moment de l'exécution), si l'assembly est signé et déployé dans GAC, le CLR récupère automatiquement l'assembly du GAC au lieu de la DLL référencée au moment de la conception dans VS. Si le développeur a supprimé la DLL d'origine ou ne l'a pas pour une raison quelconque, il existe un moyen d'obtenir le fichier DLL à partir de GAC. Suivez les étapes suivantes pour copier la DLL à partir du GAC

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

    • shfusion.dll est une DLL d'extension d'explorateur qui donne un aspect distinct au dossier GAC. La désinscription de ce fichier supprimera la visionneuse du cache d'assemblage et le dossier GAC sera alors visible comme n'importe quel dossier normal dans l'explorateur.
  2. Ouvrez «% windir% \ assembly \ GAC_MSIL».

  3. Accédez à votre dossier DLL dans les profondeurs 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 version directory> \ shfusion.dll" pour réenregistrer le fichier shfusion.dll et retrouver la vue distincte d'origine du GAC.

Andrew Hare
la source
81
Cela fonctionne mais est un peu compliqué. Si vous n'avez pas peur de l'invite de commande, vous pouvez simplement cd dans le répertoire nécessaire et copier la DLL de cette façon.
Cheeso
3
Installez simplement TotalCommander, activez l'option pour voir tous les fichiers cachés et vous pouvez récupérer tous les assemblages que vous voulez
Patrick Peters
4
@Andrew, il semble shfusion.dllne pas prendre en charge le DllInstall()point d'entrée invoqué par regsvr32l' /ioption. Omettre cette option permet de réenregistrer le composant avec succès.
Frédéric Hamidi
9
Vous pouvez ignorer les étapes 1 et 2, aller directement à% windir% \ assembly \ GAC_MSIL et parcourir à partir de là.
Christian Fredh
5
@ChristianFredh Juste une note: pour moi, cela ne peut être fait que directement à partir de la boîte de dialogue Exécuter.
xr280xr
84

Ouvrez l'invite de commande et tapez:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Cela devrait donner le vidage de l'ensemble du GAC

Prendre plaisir!

Deepak
la source
10
La réponse de Deepak était plus claire et utilisait xcopy avec les drapeaux appropriés.
katbyte
J'évaluerais cette réponse n ° 1 car il a fallu 5 secondes pour tout obtenir, après avoir rencontré des problèmes sur les approches étape par étape.
FBryant87
24

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] sur 1.

Revenez à l'Explorateur Windows dans le dossier de l'assemblage et ce sera la vue normale du système de fichiers.

mccrager
la source
2
Réponse sous-évaluée. Merci!
xr280xr
1
C'est la vraie solution. Facile à annuler et aucune ligne de commande n'est nécessaire.
user2920518
16

Je pense que le moyen le plus simple est de le faire via la ligne de commande comme le mentionne David. Le seul truc est que le .dll n'est pas simplement situé dans C: \ Windows \ Assembly. Vous devez accéder à C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY]. Vous pouvez ensuite faire une copie en utilisant:

copiez [ASSEMBLY_NAME] .dll c: \ (ou à l'emplacement de votre choix)

J'espère que cela pourra aider.

AdamB
la source
13

Un moyen facile que j'ai trouvé est d'ouvrir l'invite de commande et de parcourir le dossier que vous mentionnez jusqu'à ce que vous trouviez la DLL que vous voulez - vous pouvez ensuite utiliser la commande de copie pour la sortir. L'Explorateur Windows a une vue spéciale «utile» de ce dossier.

David M
la source
J'ai trouvé un problème intéressant ce matin. J'étais en train de mettre à jour une DLL dans le GAC et j'ai utilisé la méthode de la ligne cmd pour effectuer une sauvegarde. Lorsque j'ai essayé de télécharger la nouvelle DLL (même numéro de version), j'ai reçu une erreur qui n'a disparu que lorsque j'ai fermé la fenêtre cmd. Il m'a fallu quelques minutes de jurons pour savoir ce qui n'allait pas!
NeilD
11

Ouvrez RUN puis tapez %windir%\assembly\GAC_MSIL, cela ouvrira vos dll dans la vue des dossiers, vous pouvez ensuite naviguer vers votre dossier nommé dll et l'ouvrir, vous trouverez votre fichier dll et le copiez facilement

Hazem Abdelwahab
la source
Solution très simple. Je vous remercie.
Dblock247
4

Je suis l'auteur de PowerShell GAC . Avec PowerShell GAC, vous pouvez extraire des assemblys du GAC sans dépendre des éléments internes du GAC, comme la modification des structures de dossiers.

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

Ce billet de blog MSDN décrit trois méthodes distinctes pour extraire une DLL du GAC. Un résumé utile des méthodes données jusqu'ici.

MagicAndi
la source
3

Utilisez plutôt le navigateur de fichiers "Total Commander".

  1. Activez le paramètre "Afficher les fichiers cachés / système" dans Total Commander
  2. Accédez à "c: \ windows \ assembly"
  3. copie
Max
la source
3

Je pense avoir trouvé un moyen de regarder à l'intérieur du GAC sans modifier le registre ni utiliser la ligne de commande, PowerShell ou tout autre programme:

Créez un nouveau raccourci (vers n'importe où). Modifiez ensuite le raccourci pour que la cible soit:

%windir%\assembly\GAC_MSIL\System

L'ouverture de ce raccourci vous amène au dossier Système à l'intérieur du GAC (que tout le monde devrait avoir) et a le merveilleux effet secondaire de vous permettre de basculer vers un répertoire supérieur, puis de naviguer dans n'importe quel autre dossier de votre choix (et de voir les fichiers dll, etc.)

J'ai testé cela sur Windows 7 et Windows Server 2012.

Remarque: il ne vous permettra pas d'utiliser cette cible lors de la création du raccourci, mais vous permettra de le modifier.

Prendre plaisir!

Bolo
la source
2

accédez simplement à C: \ Windows, recherchez le dossier [assembly], cliquez avec le bouton droit de la souris et sélectionnez Ajouter à l'archive

attendre un peu

vola vous avez un fichier archive contenant tous les assemblys de votre GAC

Tsadigov
la source
2

À partir d'un script Powershell, vous pouvez essayer ceci. Je n'avais qu'une seule version de l'assemblage dans le GAC, donc cela fonctionnait très bien.

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

où le chemin de l'assembly peut utiliser des caractères génériques.

Phil Kermeen
la source
0

Une autre direction - décompressez simplement le fichier MSI et obtenez les bonus de cette façon. Vous sauve de la désinstallation éventuelle. . .

Wyatt Barnett
la source
0

La copie à partir d'une ligne de commande n'est pas nécessaire. J'ai tapé le nom de la DLL à partir de la recherche de la fenêtre de démarrage. J'ai choisi Voir plus de résultats. Celui du GAC a été renvoyé dans la fenêtre de recherche. J'ai fait un clic droit dessus et j'ai indiqué l'emplacement du fichier ouvert. Il s'est ouvert dans l'Explorateur Windows normal. J'ai copié le fichier. J'ai fermé la fenêtre. Terminé.

Scott Shaw-Smith
la source