6

我有一个项目需要使用 NHibernate 与我的 Oracle 数据库进行通信。

我工作场所的许多项目都使用 NHibernate,因此 NHibernate 程序集被放置在 Global Assembly Cache 中,这是一个我不完全了解的工具。根据我的研究,我收集了以下信息:

  1. 全局程序集缓存是许多项目引用的 dll 的中央存储库。这避免了 DLL Hell 的问题 - 当您的 dll 的新版本发布时,您在缓存中更新它一次,所有引用它的 .NET 项目现在都将使用新版本。
  2. 您不能在程序集缓存中添加对程序集的引用。“已在 GAC 中注册的程序集不会出现在 [添加引用] 列表中”。但是,您可以通过破坏注册表来强制使它们出现。
  3. 您可以轻松地在程序集缓存中添加对程序集的引用。“只需使用添加引用窗口添加对您在 GAC 中安装的程序集的引用”。(我倾向于不相信这一点,因为我在“添加引用”窗口中没有看到任何 GAC 程序集)。
  4. 我工作场所的几个项目确实引用了 GAC 中的许多程序集。这些程序集从未出现在“添加引用”菜单中,所以我知道我的前辈没有使用注册表修改技术。然而,它们显然源自 GAC——它们的文件路径是 C:\Windows\assembly 的子目录。

第二点显然与其他三点相矛盾,但如果它只是错误的,我在引用库时不会有任何问题。它肯定反映了现实,因为在“添加引用”窗口中找不到我的 GAC 程序集。

我想知道两件事:

  • 开发人员何时会想要使用 GAC?没有注册表技巧就无法引用的库有什么用?
  • 我的前辈在不触及注册表的情况下,采取了哪些步骤来引用 GAC 中的库?
4

5 回答 5

5

所有引用它的 .NET 项目现在都将使用新版本。

不,这就是所谓的 DLL 地狱。应用程序引用程序集的特定版本。您可以更新 DLL 并更新使用它的应用程序。并且不要破坏也使用该 DLL 但未重新编译的旧应用程序。您可以使用 GAC 做到这一点,因为它可以存储 DLL 的多个版本。或者,您可以通过将 DLL 与应用程序的 EXE 保存在同一目录中来轻松完成此操作。

GAC 中的程序集不会出现在“添加引用”对话框中。必然如此,您不知道您的用户在她的 GAC 中存储了什么。您可以使用开发机器上的“浏览”选项卡来确保您使用的是特定版本的 DLL。

GAC 对于需要分发安全更新的公司很重要。像微软一样。它确保没有 DLL 的未打补丁的副本四处飘荡。对于 [ComVisible] 程序集解决 COM 的 DLL Hell 问题也很重要。就是这样。

于 2011-10-19T13:47:50.313 回答
3

在项目中添加 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 目录下的文件夹中,但这些仅在设计时使用。

于 2011-10-19T13:44:02.593 回答
1

1 ....您在缓存中更新它一次,所有引用它的 .NET 项目现在都将使用新版本。

不完全是。您可以控制应用使用新版本还是旧版本。有趣的是两者都可以同时在 GAC 中。

  • 我的前辈在不触及注册表的情况下,采取了哪些步骤来引用 GAC 中的库?

只需 a) 注册GacUtil /i并 b) 添加引用,浏览到原始 dll 位置。c) 验证新的 ref 有 CopyLocal=false 和 StrongName=true

于 2011-10-19T13:45:30.240 回答
1

这似乎是我的前辈在 GAC 中添加对程序集的引用的方式:

  1. 打开已包含对 GAC 中的程序集的引用的项目。
  2. 选择引用并打开“属性”窗格。
  3. 复制参考的完整路径。
  4. 在目标项目中,选择“添加引用”并选择“浏览”选项卡。
  5. 将完整路径粘贴到“文件名”文本框中,然后选择“确定”。

但是,看看其他答案,我怀疑这是一个好主意。碰巧的是,用于开发、测试和生产环境的 GAC 都是相同的。如果 GAC 未同步,则引用可能不会保持有效。

于 2011-10-20T16:04:26.127 回答
0

回答可能为时已晚,但我找到了一种非常简单的方法(无需破解)。

  1. 将您的 dll 放入 GAC
  2. 转到项目-->属性
  3. 点击Reference Path,设置GAC的路径
  4. 并建立

希望能帮助到你

于 2015-06-19T15:02:44.147 回答