How To Copy DLL From Global Assembly Cache
How To Copy DLL From Global Assembly Cache
Introduction
The idea behind writing this article is to share solution to one problem that I faced
recently for one my project. The problem was how we can copy an assembly (.DLL)
file from Global Assembly Cache (GAC). Well, if it simply copy and paste then I am
wasting my and your valuable time over here. There is no point have an article such
as this. When you read the article heading, it looks pretty simple but it is not. Let’s
first start with the basics.
The Basics
Assembly: According to MSDN “Assemblies are the building blocks of .NET Framework applications;
they form the fundamental unit of deployment, version control, reuse, activation scoping, and security
permissions. An assembly is a collection of types and resources that are built to work together and form
a logical unit of functionality. An assembly provides the common language runtime with the information
it needs to be aware of type implementations. “
Private: The assembly which is used only by a single application is called as private assembly.It does not
require strong name and versioning.
Shared: Assembly which can be used across multiple applications is called shared assembly.
GAC (Global assembly cache): GAC is a place where .NET assemblies are stored, specifically used to
be shared by multiple applications on that computer.
GACUtil is a command line tool which allows you to place, to remove assembly from GAC.
To install an assembly called VirendraAssembly in the GAC, you can use the command
gacutil /i VirendraAssembly.dll
To uninstall an assembly called VirendraAssembly in the GAC, you can use the command
gacutil /u VirendraAssebmly.dll
I will not go into the details of gacutil you can find from this link.
But have you ever tried to copy DLL from GAC (Global assembly cache)? Well, first time when someone
asked me, I said go to GAC (c:\Windows\Assembly) folder, Select the assembly you want to copy, then right
click on it and select copy option and paste it at your desired location. Well, I tried the same way but
unfortunately there is no option available to copy when you make a right click on any assembly. Only
available options are uninstall and properties option.
See the below screen shot.
One more thing that is noticeable is, go to DOS prompt and fire DIR command to see the listing of C:\Windows\Assembly folder
and you will be surprised to see the listing. See below screen shot.
There are 4 ways to show the same structure for GAC in windows as we will in DOS.
attrib desktop.ini -h -r -s
You can also see the particular folder content. Select GAC and you will see something like this.
If you want to see both the view together run this series of commands on DOS Prompt.
cd Windows\Assembly
attrib -r -h -s desktop.ini
mkdir OriginalView
move desktop.ini OriginalView
attrib +s OriginalView
attrib +r +h +s OriginalView/desktop.ini
Now, go to assembly folder. You will internal structure of GAC and plus one more folder named
OriginalView. When you go in this folder, you will see original view of GAC.
The following steps will modify the registry. If you make any incorrect entry in registry, that can cause
some serious problems. Sometimes you may need to install operating system again. Use registry editor
at your own risk. I prefer, before you follow these steps, take a backup of registry.
We need to add a key in registry that will disable the abstract view of the GAC.
To open registry editor, Go to Run and type regedit. Locate following registry, in the registry editor.
HKEY_Local_Machine\Software\Microsoft\Fusion\
By Uninstalling SHFusion.dll
Go to Visual Studio Command Prompt and fire this command to uninstall the SHFusion.dll
regsvr32 -u C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\shfusion.dll
Now go to Assembly folder again and it will show the abstract view of GAC.
Using SUBST Command
Go to Windows DOS Prompt and type following command and press enter.
SUBST L: “C:\Windows\Assembly”
This command will create a virtual drive “L” and this drive will have the internal
view of GAC, where C:\Windows\Assembly will have the abstract view of
GAC. Kindly ensure that the drive name that you type in SUBST command, it must
not exist in your system. Go to My Computer and you will see the Drive named “L:”.
SUBST L: /D
This will delete the L: drive.
By all above these four techniques, you can see the internal structure of GAC. Via
Internal structure you can copy the DLL and paste it at desired location.
Now, let’s see what every folder contains in GAC. Mainly there are 5 Folders.
GAC : This folder contains non-native images of DLL used in .NET Framework 1.x.
GAC_32 : A 32-bit system will only have the GAC_32 directory. A 64-bit system will have both
the directory GAC_32 and GAC_64. These directories contain assemblies that are
specific to 32-64 bit mode.
GAC_MSIL: The GAC_MSIL cache contains assemblies that can be run in either 32-bit or 64-bit
mode. They don’t have any dependency.
NativeImage Framework Version : Native image generated for Framework version. If you
have .NET Framework 1.0 and 2.0 both, then there will be two directories.
Temporary and Tmp : Temporary Directories.
The folder GAC, GAC_32, GAC_64 and GAC_MSIL contains non-native images of the DLLs. They all
contain the MSIL that will be complied into native images and placed in NativeImage_Framework Version
folder.
Reference
http://www.codeproject.com/KB/dotnet/demystifygac.aspx
http://blogs.msdn.com/junfeng/archive/2004/09/12/228635.aspx