27

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

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

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

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

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

4

4 回答 4

24

如果将某些内容放入 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(),或者将文件放在某个众所周知的位置,可能基于获取的环境变量放。

于 2008-12-19T21:53:01.857 回答
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());
}
于 2008-12-18T12:45:38.190 回答
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),您将看到键名称“默认”。双击它并将值设置为您的程序集所在的位置。(首选绝对路径)

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

现在来到你的实际问题,

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

注意:在注册表项中,4.0.30319 是您的应用程序目标的 .NET Framework 版本。改用您的应用程序目标的任何版本。

于 2011-12-06T17:46:03.233 回答
2

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

干杯,斯里

于 2009-08-06T18:44:15.233 回答