引用全局程序集缓存

时间:2011-10-19 13:27:44

标签: .net visual-studio-2008 global-assembly-cache

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

我工作场所的许多项目都使用NHibernate,因此NHibernate程序集被放置在全局程序集缓存中,这是一个我不太了解的工具。根据我的研究,我收集了以下内容:

  1. Global Assembly Cache是dll的中央存储库,由许多项目引用。这避免了DLL Hell的问题 - 当你的dll的新版本发布时,你在缓存中一次更新它,所有引用它的.NET项目现在将使用新版本。
  2. 您无法在程序集缓存中添加对程序集的引用。 “Assemblies that have been registered in the GAC will not appear in [the Add Reference] list”。但是,您可以通过破坏注册表来强制使它们出现。
  3. 您可以轻松地在程序集缓存中添加对程序集的引用。 “simply use the Add Reference window to add a reference to an assembly you've installed in the GAC”。 (我倾向于不相信这一点,因为我在“添加引用”窗口中没有看到任何GAC程序集。)
  4. 我工作场所的几个项目确实引用了GAC中的许多程序集。这些程序集永远不会出现在“添加引用”菜单中,所以我知道我的前辈们没有使用注册表修改技术。但它们显然源自GAC - 它们的文件路径是C:\ Windows \ assembly的子目录。
  5. 第二点显然与其他三个相矛盾,但如果它只是假,我就不会有任何引用库的问题。它肯定反映了现实,因为我的GAC程序集无法在“添加引用”窗口中找到。

    我想知道两件事:

    • 开发人员何时想要使用GAC?有什么好处的 没有注册表欺骗就无法引用的库?
    • 我的前任采取了哪些步骤来引用图书馆 GAC,没有触及注册表?

5 个答案:

答案 0 :(得分:5)

  

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

不,那叫做DLL地狱。应用程序引用程序集的特定版本。您可以更新DLL并更新使用它的应用程序。并且不会破坏使用该DLL的旧应用程序,但不会重新编译。您可以使用GAC执行此操作,因为它可以存储DLL的多个版本。或者,您可以通过将DLL保存在与应用程序的EXE相同的目录中来轻松完成此操作。

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

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

答案 1 :(得分: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通常会在%programfiles%\ Reference Assemblies目录下的文件夹中放置要从GAC引用的程序集的副本,但这些只在设计时使用。

答案 2 :(得分:1)

  

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

不完全是。您可以控制应用程序是使用新版本还是旧版本。漂亮的东西都可以同时出现在GAC中。

  
      
  • 我的前任采取了哪些步骤来引用GAC中的库,而不涉及注册表?
  •   

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

答案 3 :(得分:1)

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

  1. 打开一个已在GAC中包含对程序集的引用的项目。
  2. 选择参考并打开“属性”窗格。
  3. 复制参考的完整路径。
  4. 在目标项目中,选择“添加参考”并选择“浏览”选项卡。
  5. 将完整路径粘贴到“文件名”文本框中,然后选择确定。
  6. 但是,看看其他答案,我怀疑这是个好主意。恰好,开发,测试和生产环境的GAC都是相同的。如果GAC未同步,则引用可能不会保持有效。

答案 4 :(得分:0)

回答可能为时已晚,但我找到了一种非常简单的方法(没有黑客攻击)。

  1. 将您的dll放入GAC
  2. 转到项目 - &gt;的属性
  3. 点击参考路径并设置GAC的路径
  4. 和Build
  5. 希望有所帮助