问题
I need to create a small app or script to install a .NET assembly into the GAC. I've read there are a couple ways to do this including:
- using
gacutil.exe
executing the following line of code:
new System.EnterpriseServices.Internal.Publish().GACInstall("Foo.dll");
However, what would happen if I just created the appropriate directories on the machine and copied the assembly into that directory? The structure of the GAC directory is the following: C:\Windows\assembly\GAC_MSIL\Foo\<version#>__<public token>\Foo.dll
Do the above two methods do anything special besides creating the folder structure and placing the assembly into it?
回答1:
I strongly recommend using existing methods (like the ones you mentioned) because they are both supported and maintained by Microsoft and will continue to work with future releases.
A quick look at gacutil.exe
with Process Monitor reveals that there is a little bit more to it than just copying files:
- concurrency concerns (e.g. temporary files, locking
WINDOWS\assembly\GACLock.dat
, etc.) - notifications (e.g.
HKLM\SOFTWARE\Microsoft\Fusion\GACChangeNotification\...
) - indexing (e.g.
HKLM\SOFTWARE\Microsoft\Fusion\NativeImagesIndex...
) - validation (e.g. strong name, ...)
The wrapper in System.EnterpriseServices
is very similar to this old blog post and should work just fine.
回答2:
We recently had to do this for 10s of servers in an enterprise environment. We used Wix to build a very simple MSI (seriously - 5 minutes work) and published to all server (and dev boxes) through Group Policy.
来源:https://stackoverflow.com/questions/1460793/methods-to-programmatically-install-a-net-assembly-into-the-gac