安装到 GAC 的 DLL 路径

问题描述 投票:0回答:4

如何获取(可能)在 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 安装的,并且可以使用单击一次数据文件夹))

c# dll file gac
4个回答
25
投票

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


4
投票

您想通过在 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 的版本。请使用您的应用程序的目标版本。


3
投票

Assembly.GetExecutingAssembly()



2
投票

干杯, 斯里

© www.soinside.com 2019 - 2024. All rights reserved.