tags:

views:

7166

answers:

3

How can I get the (physical) installed path of a DLL that is (may be) registered in GAC? This DLL is a control that may be hosted in things other than a .Net app (including IDEs other than VS...).

When I use System.Reflection.Assembly.GetExecutingAssembly().Location, it gives path of GAC folder in winnt\system32 - or in Design mode in VS gives the path to the VS IDE.

I need to get the path where physical dll is actually installed - or the bin/debug or (release) folder for VS.

Reason is that there is an XML file I need to get at in this folder, with config setting that are used both in design mode and at runtime.

Or how is it best to handle this scenario? I have a dubious network location I am using for design mode at the moment... (Don't think that ApplicationData folder is going to cut it (but have the .Net version soved as that's installed via ClickOnce ans can use the Clickonce Data folder) )

+1  A: 

Do you have the option of embedding a resource to this DLL? That way, it doesn't really matter where the DLL is located on disk, because the XML file will follow it. You can then do something like this:

 Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProject.MyXmlFile.xml");
                XmlDocument xdoc = new XmlDocument();
                StreamReader reader = new StreamReader(s);
                xdoc.LoadXml(reader.ReadToEnd());
                reader.Close();
BFree
That's what we were doing, but the file is a configuration settings file and that meant we had to do multiple builds targeting different environments. The idea is to do one build and have the config file control the environment-dependent settings.
kpollock
+3  A: 

If something gets put in the GAC, it actually gets copied into a spot under %WINDIR%\assembly, like

C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll

I assume you're seeing something like that when you check the Location of the assembly in question when it's installed in the GAC. That's actually correct. (In .NET 1.1 there was a "Codebase" listed when you looked at a GAC assembly's properties, but that was only to show you where the original file was located when you ran gacutil - it didn't actually indicate what would be loaded.) You can read more about that here.

Long story short, you may not be able to do what you want to do. Instead of looking in relation to some assembly that's being loaded (Assembly.GetExecutingAssembly()), you might want to switch the behavior to look relative to the primary application assembly (Assembly.GetEntryAssembly()) or put the file in some well-known location, possibly based on an environment variable that gets set.

Travis Illig
I have, from the start, wanted to go for a standard ApplicationData folder, as per your 2nd suggestion - but it'll have to be in the next release, too late to do that now. I have got it trying multiple psosible paths for now...
kpollock
+1 that's a great link
Ruben Bartelink
A: 

If you are looking for the physical location where your GACed DLL is saved in the file system, try this: start-->run-->c:\windows\assembly\gac If you don't find your DLL related folder in there, you can do a "Up" folder in windows explorer to display everything in c:\windows\assembly as folder structures. You can then look for your DLL under GAC_MSIL or any other folder out there....

Cheers, Sri

sorry if I was not clear, but I meant in code!This is a very old question and pretty much answered by the ticked answer above.
kpollock