142

There is a package I have to deal with which installs assemblies straight into the GAC (e.g. somewhere deep in %windows%/assembly).

How do I exorcise the actual assembly (the DLL) from the GAC into the normal file system?

Thanks.

starblue's user avatar
starblue
57.1k14 gold badges101 silver badges153 bronze badges
askedApr 3, 2009 at 17:32
AngryHacker's user avatar

15 Answers15

152

I used the advice fromthis article to get an assembly from the GAC.

Get DLL Out of The GAC

DLLs once deployed in GAC (normally located at c:\windows\assembly) can’t be viewed or used as a normal DLL file. They can’t be directly referenced from VS project. Developers usually keep a copy of the original DLL file and refer to it in the project at development (design) time, which uses the assembly from GAC during run-time of the project.

During execution (run-time) if the assembly is found to be signed and deployed in GAC the CLR automatically picks up the assembly from the GAC instead of the DLL referenced during design time in VS. In case the developer has deleted the original DLL or don't have it for some reason, there is a way to get the DLL file from GAC. Follow the following steps to copy DLL from GAC

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

    • shfusion.dll is an explorer extension DLL that gives a distinct look to the GAC folder. Unregistering this file will remove the assembly cache viewer and the GAC folder will be then visible as any normal folder in explorer.
  2. Open “%windir%\assembly\GAC_MSIL”.

  3. Browse to your DLL folder into the deep to find your DLL.

  4. Copy the DLL somewhere on your hard disk and refer it from there in your project

  5. Run "regsvr32 %windir%\Microsoft.NET\Framework\<.NET version directory> \shfusion.dll" to re-register the shfusion.dll file and regain the original distinct view of the GAC.

cjones26's user avatar
cjones26
3,9241 gold badge38 silver badges57 bronze badges
answeredApr 3, 2009 at 17:36
Andrew Hare's user avatar
Sign up to request clarification or add additional context in comments.

11 Comments

This works but is a little complicated. If you are not afraid of the command prompt, you can just cd into the necessary directory and copy the DLL that way.
Just install TotalCommander, enable the option to see all hidden files and you can grab every assembly you want
@Andrew, it looks likeshfusion.dll does not support theDllInstall() entry point invoked byregsvr32 when passed the/i option. Omitting that option allows to re-register the component successfully.
You can skip step 1 and 2, and go directly to %windir%\assembly\GAC_MSIL and browse from there.
@ChristianFredh Just a note: for me, this can only be done directly from the Run dialog.
|
110

The method described here is very easy:

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

Summary from Article:

  • Map a Network Drive (Explorer -> Tools)
    • Map to \servername\folder (\\YourServer\C$\Windows\Assembly)
  • No need for sharing if you are the Administrator
  • Browse to the drive and extract your assembly
theChrisKent's user avatar
theChrisKent
15.1k3 gold badges64 silver badges62 bronze badges
answeredApr 3, 2009 at 17:38
Sadjad's user avatar

Comments

100

Open the Command Prompt and Type :

cd  c:\windows\assembly\GAC_MSIL xcopy . C:\GacDump /s /y

This should give the dump of the entire GAC

Enjoy!

mornaner's user avatar
mornaner
2,4242 gold badges28 silver badges39 bronze badges
answeredJun 9, 2010 at 20:42
Deepak's user avatar

2 Comments

Deepak's answer was clearer & used xcopy with the appropriate flags.
I'd rate this answer #1 as it took 5 seconds to get everything, after hitting issues on the step-by-step approaches.
27

Yes.

Add DisableCacheViewer Registry Key

Create a new dword key under HKLM\Software\Microsoft\Fusion\ with the name DisableCacheViewer and set it’s [DWORD] value to 1.

Go back to Windows Explorer to the assembly folder and it will be the normal file system view.

answeredApr 3, 2009 at 17:37
mccrager's user avatar

1 Comment

This is the real solution. Easy to undo, and no command line necessary.
16

I think the easiest way is to do it through the command line like David mentions. The only trick is that the .dll isn't simply located at C:\Windows\Assembly. You have to navigate to C:\Windows\Assembly\GAC\[ASSEMBLY_NAME]\[VERSION_NUMBER]_[PUBLIC KEY]. You can then do a copy using:

copy [ASSEMBLY_NAME].dll c:\ (or whatever location you want)

Hope that helps.

answeredApr 3, 2009 at 17:47
AdamB's user avatar

Comments

14

OpenRUN then type%windir%\assembly\GAC_MSIL, this will open your dlls in folders' view you can then navigate to your dll named folder and open it, you will find your dll file and copy it easily

answeredJul 8, 2017 at 13:21
Hazem Abdelwahab's user avatar

Comments

13

Easy way I have found is to open the command prompt and browse through the folder you mention until you find the DLL you want - you can then user the copy command to get it out. Windows Explorer has a "helpful" special view of this folder.

answeredApr 3, 2009 at 17:34
David M's user avatar

1 Comment

I found an interesting issue this morning. I was updating a DLL in the GAC, and used the cmd line method to take a backup. When I tried to upload the new DLL (same version number), I received an error which only went away when I shut down the cmd window. Took me a few minutes of cursing to find out what was going wrong!
5

I am the author ofPowerShell GAC. With PowerShell GAC you can extract assemblies from the GAC without depending on GAC internals like changing folder structures.

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany
answeredApr 21, 2013 at 20:09
Lars Truijens's user avatar

Comments

3

ThisMSDN blog post describes three separate ways of extracting a DLL from the GAC. A useful summary of the methods so far given.

answeredJan 28, 2010 at 14:36
Tangiest's user avatar

Comments

3

Use the file browser "Total Commander" instead.

  1. Enable the "show hidden/system files" setting in Total Commander
  2. Browse to "c:\windows\assembly"
  3. copy
answeredAug 27, 2012 at 12:33
Max's user avatar

Comments

3

Think I figured out a way to look inside the GAC without modifying the registry or using the command line, powershell, or any other programs:

Create a new shortcut (to anywhere). Then modify the shortcut to have the target be:

%windir%\assembly\GAC_MSIL\System

Opening this shortcut takes you to the System folder inside the GAC (which everyone should have) and has the wonderful side effect of letting you switch to a higher directory and then browsing into any other folder you want (and see the dll files, etc)

I tested this on windows 7 and windows server 2012.

Note: It will not let you use that target when creating the shortcut but it will let you edit it.

Enjoy!

answeredNov 11, 2015 at 19:26
Bolo's user avatar

Comments

2

just navigate to C:\Windowsfind the [assembly] folderright click and select add to archive

wait a little

vola you have an archive file containing all the assemblies in your GAC

answeredApr 20, 2010 at 8:52
tsadigov's user avatar

Comments

2

From a Powershell script, you can try this. I only had a single version of the assembly in the GAC so this worked just fine.

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

where the assembly path can use wildcards.

answeredJan 25, 2013 at 9:51
Phil Kermeen's user avatar

Comments

0

One other direction--just unpack the MSI file and get the goodies that way. Saves you from the eventual uninstall . . .

answeredJul 13, 2010 at 19:44
Wyatt Barnett's user avatar

Comments

0

Copying from a command line is unnecessary. I typed in the name of the DLL from the Start Window search. I chose See More Results. The one in the GAC was returned in the search window. I right clicked on it and said open file location. It opened in normal Windows Explorer. I copied the file. I closed the window. Done.

answeredOct 9, 2015 at 22:37
Scott Shaw-Smith's user avatar

Comments

Protected question. To answer this question, you need to have at least 10 reputation on this site (not counting theassociation bonus). The reputation requirement helps protect this question from spam and non-answer activity.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.