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

如何获取(可能)在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.GetEntryAssembly() )或将文件放入一些众所周知的内容,而不是查看正在加载的某个程序集( Assembly.GetEntryAssembly() )位置,可能基于设置的环境变量。

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

您在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的版本。 使用应用程序所针对的任何版本。

您是否可以选择将资源嵌入此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()); } 

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

干杯,斯里兰卡