提问人:Kevin 提问时间:10/19/2011 最后编辑:CommunityKevin 更新时间:6/19/2015 访问量:5289
引用全局程序集缓存
Referencing the Global Assembly Cache
问:
我有一个项目需要使用 NHibernate 与我的 Oracle 数据库进行通信。
我工作场所的许多项目都使用 NHibernate,因此 NHibernate 程序集被放置在全局程序集缓存中,这是一个我不完全理解的工具。根据我的研究,我收集了以下内容:
- 全局程序集缓存是许多项目引用的 dll 的中央存储库。这避免了 DLL Hell 的问题 - 当发布 dll 的新版本时,您在缓存中更新它一次,并且引用它的所有 .NET 项目现在都将使用新版本。
- 不能在程序集缓存中添加对程序集的引用。“已在 GAC 中注册的程序集将不会出现在 [添加引用] 列表中”。但是,您可以通过破坏注册表来强制显示它们。
- 您可以轻松地在程序集缓存中添加对程序集的引用。“只需使用〖添加引用〗窗口即可添加对已安装在 GAC 中的程序集的引用”。(我倾向于不相信这一点,因为我在“添加引用”窗口中看不到任何 GAC 程序集)。
- 我工作场所的几个项目确实引用了 GAC 中的许多程序集。这些程序集从未出现在“添加引用”菜单中,因此我知道我的前辈没有使用注册表管理技术。然而,它们显然源自 GAC - 它们的文件路径是 C:\Windows\assembly 的子目录。
第二点显然与其他三点相矛盾,但如果它只是假的,我在引用库时不会有任何问题。它肯定反映了现实,因为我的 GAC 程序集在“添加引用”窗口中无处可寻。
我想知道两件事:
- 开发人员何时会想要使用 GAC?一个有什么好处 没有注册表诡计就无法引用的库?
- 我的前任采取了哪些步骤来引用 GAC,不接触注册局?
答:
在项目中添加 GAC 引用的“蛮力”方法是直接编辑项目文件。卸载项目并在与项目中其他引用相同的元素下添加一个,例如:Reference
ItemGroup
<Reference Include="System.Management.Automation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
您需要注意,“添加引用”对话框的“.NET”选项卡中程序集的设计时位置与 GAC 中这些程序集引用的运行时分辨率之间存在差异。通过 .NET 选项卡添加引用和文件浏览选项卡的区别在于,在前一种情况下,引用未标记为“复制本地”,因此在运行时将从 GAC 中查找。Microsoft 通常会将要从 GAC 引用的程序集的副本放在 %programfiles%\Reference Assemblies 目录下的文件夹中,但这些程序集仅在设计时使用。
1 ....在缓存中更新它一次,引用它的所有 .NET 项目现在都将使用新版本。
不完全是。您可以控制应用是使用新版本还是旧版本。有趣的是,两者可以同时在 GAC 中。
- 我的前任在不接触注册局的情况下采取了哪些步骤来引用 GAC 中的库?
只需 a) 注册它和 b) 添加引用,浏览到原始 dll 位置。c) 验证新引用是否具有 CopyLocal=false 和 StrongName=trueGacUtil /i
引用它的所有 .NET 项目现在都将使用新版本。
不,这就是所谓的DLL地狱。应用程序引用程序集的特定版本。您可以更新 DLL 并更新使用它的应用程序。并且不会破坏也使用该 DLL 但未重新编译的旧应用程序。您可以使用 GAC 执行此操作,因为它可以存储 DLL 的多个版本。或者,您可以通过将 DLL 与应用程序的 EXE 保存在同一个目录中来轻松执行此操作。
GAC 中的程序集不会显示在“添加引用”对话框中。必然如此,您不知道您的用户在她的 GAC 中存储了什么。请改用开发计算机上的“浏览”选项卡,以确保使用特定版本的 DLL。
GAC 对于需要分发安全更新的公司非常重要。像Microsoft一样。它确保没有未修补的 DLL 副本漂浮在周围。对于解决 COM 的 DLL Hell 问题的 [ComVisible] 程序集也很重要。仅此而已。
评论
这似乎是我的前任在 GAC 中添加对程序集的引用的方式:
- 打开一个已包含对 GAC 中程序集的引用的项目。
- 选择引用并打开“属性”窗格。
- 复制引用的完整路径。
- 在目标项目中,选择“添加引用”,然后选择“浏览”选项卡。
- 将完整路径粘贴到“文件名”文本框中,然后选择“确定”。
但是,看看其他答案,我怀疑这是一个好主意。碰巧的是,开发、测试和生产环境的 GAC 都是相同的。如果未同步 GAC,则引用可能无法保持有效。
可能现在回答为时已晚,但我找到了一种非常简单的方法来做到这一点(无需黑客攻击)。
- 将您的 dll 放入 GAC 中
- GoTo 项目 --> 属性
- 单击“引用路径”,设置 GAC 的路径
- 和构建
希望对您有所帮助
评论