如何获取(可能)在 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 安装的,并且可以使用单击一次数据文件夹))
如果将某些内容放入 GAC 中,它实际上会被复制到 %WINDIR% ssembly 下的某个位置,例如
C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll
我假设您在检查相关程序集安装在 GAC 中的位置时会看到类似的内容。这实际上是正确的。 (在 .NET 1.1 中,当您查看 GAC 程序集的属性时,会列出一个“代码库”,但这只是为了向您显示运行 gacutil 时原始文件所在的位置 - 它实际上并不指示将加载什么内容。 )您可以在这里阅读更多相关信息。
长话短说,你可能无法做你想做的事。您可能希望将行为切换为相对于主应用程序程序集 (
Assembly.GetExecutingAssembly()
) 进行查找,或者将文件放在某个众所周知的位置(可能基于在设置的环境变量上。您想通过在 GAC 中部署来实现什么目标?如果只是为了 CLR 来解决问题,那么还有另一种方法可以解决您的问题。
不要 gac 安装 dll,而是在注册表中添加以下键(在尝试解析程序集时,CLR 会查找此注册表位置)
Assembly.GetEntryAssembly()
对于 foo 键(使用您最喜欢的名称而不是 foo),您将看到键名称“默认”。双击它并将值设置为程序集所在的位置。 (最好使用绝对路径)
现在,在 Visual Studio 中,您的客户端应该能够在“添加引用”对话框中看到您的程序集并可以使用它。
现在来谈谈你的实际问题,
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
将返回已安装 dll 所在位置的路径。从那里找到 XML 文件。 :)
注意:在注册表项中,4.0.30319 是您的应用程序所针对的 .NET Framework 的版本。请使用您的应用程序的目标版本。
Assembly.GetExecutingAssembly()
干杯, 斯里