如何获取(可能)在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数据)文件夹))
答案 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 ....
干杯, 斯