安装到GAC的DLL的(物理)(已安装)路径

时间:2008-12-18 11:18:32

标签: c# dll file gac

如何获取(可能)在GAC中注册的DLL的(物理)安装路径?此DLL是一个控件,可以托管在.Net应用程序以外的东西中(包括除VS之外的IDE ...)。

当我使用System.Reflection.Assembly.GetExecutingAssembly()。Location时,它给出了winnt \ system32中GAC文件夹的路径 - 或者在VS中的设计模式中给出了VS IDE的路径。

我需要获取实际安装物理dll的路径 - 或VS的bin / debug或(release)文件夹。

原因是我需要在此文件夹中找到一个XML文件,其配置设置在设计模式和运行时都使用。

或者如何最好地处理这种情况?我目前在设计模式中使用了一个可疑的网络位置...(不要认为ApplicationData文件夹会削减它(但是因为通过ClickOnce ans安装的.Net版本可以使用Clickonce数据)文件夹))

4 个答案:

答案 0 :(得分:22)

如果某些内容被放入GAC,它实际上会被复制到%WINDIR%\ assembly下的某个位置,例如

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

我认为当您在GAC中安装有问题的程序集的位置时,您会看到类似的内容。这实际上是正确的。 (在.NET 1.1中,当您查看GAC程序集的属性时,列出了“代码库”,但这只是为了向您显示运行gacutil时原始文件所在的位置 - 它实际上并未指示要加载的内容。你可以阅读more about that here

长话短说,你可能无法做你想做的事。您可能希望将行为切换为相对于主应用程序程序集(Assembly.GetExecutingAssembly())或将文件置于一些众所周知的内容中,而不是查看正在加载的某个程序集(Assembly.GetEntryAssembly())。位置,可能基于设置的环境变量。

答案 1 :(得分:3)

您是否可以选择将资源嵌入此DLL?这样,DLL在磁盘上的位置并不重要,因为XML文件将遵循它。然后你可以这样做:

Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProject.MyXmlFile.xml");
XmlDocument d = new XmlDocument();
using (StreamReader r = new StreamReader(s))
{
    d.LoadXml(r.ReadToEnd());
}

答案 2 :(得分:3)

将程序集复制到全局程序集缓存后,我认为没有任何元数据可以追溯源程序集的位置。

您希望通过在GAC中部署来实现什么目标?如果它只是为了解决CLR的目的,那么有另一种方法可以解决你的问题。

不要gac安装dll,而是在注册表中添加以下密钥(在尝试解析程序集时,CLR会查找此注册表位置)

32 bit OS : HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\foo

64 bit OS : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\foo

对于foo密钥(使用您喜欢的名称而不是foo),您将看到密钥名称“Default”。双击它并将值设置为程序集所在的位置。 (绝对路径是首选)

现在,从Visual Studio,您的客户端应该能够在“添加引用”对话框中查看您的程序集并可以使用它。

现在解决你的实际问题,

Assembly.GetExecutingAssembly()将返回insatlled dll所在位置的路径。从那里找到XML文件。 :)

注意:在注册表项中,4.0.30319是应用程序所针对的.NET Framework的版本。使用您的应用程序所针对的任何版本。

答案 3 :(得分:2)

如果您要查找在文件系统中保存GACed DLL的物理位置,请尝试以下操作: 开始 - >运行 - &以及c:\ Windows \组件\ GAC 如果在那里找不到与DLL相关的文件夹,可以在Windows资源管理器中执行“Up”文件夹,将c:\ windows \ assembly中的所有内容显示为文件夹结构。然后,您可以在GAC_MSIL或其他任何文件夹下查找您的DLL ....

干杯, 斯