[英]Path of DLL installed to the 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数据)文件夹))
如果某些内容被放入GAC,它实际上会被复制到%WINDIR%\\ assembly下的一个位置,就像
C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll
我假设当你在GAC中安装有问题的程序集的位置时,你会看到类似的东西。 这实际上是正确的。 (在.NET 1.1中,当您查看GAC程序集的属性时,列出了“代码库”,但这只是为了向您显示运行gacutil时原始文件所在的位置 - 它实际上并未指示要加载的内容。你可以在这里阅读更多相关信息 。
长话短说,你可能无法做你想做的事。 而不是寻找就该真实加载某些组件( Assembly.GetExecutingAssembly()
您可能需要切换的行为看起来相对于主应用程序组件( Assembly.GetEntryAssembly()
或将文件放在一些知名位置,可能基于设置的环境变量。
您是否可以选择将资源嵌入此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());
}
将程序集复制到全局程序集缓存后,我认为没有任何元数据可以追溯源程序集的位置。
您在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的版本。 使用您的应用程序所针对的任何版本
如果您正在寻找在文件系统中保存GACed DLL的物理位置,请尝试:start - > run - > c:\\ windows \\ assembly \\ gac如果在那里找不到与DLL相关的文件夹,您可以在Windows资源管理器中执行“Up”文件夹,将c:\\ windows \\ assembly中的所有内容显示为文件夹结构。 然后,您可以在GAC_MSIL或其他任何文件夹下查找您的DLL ....
干杯,斯里兰卡
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.