.net - 引用全局程序集缓存

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

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

我的工作场所很多项目都使用NHibernate,所以NHibernate的程序集被放在了Global Assembly Cache中,这个工具我不是很了解。根据我的研究,我收集了以下内容:

  • Global Assembly Cache是许多项目引用的 dll 的中央存储库。这避免了 DLL Hell 的问题——当你的 dll 的新版本发布时,你在缓存中更新它一次,所有引用它的 .NET 项目现在都将使用新版本。
  • 您不能在程序集缓存中添加对程序集的引用。 “Assemblies that have been registered in the GAC will not appear in [the Add Reference] list ”。但是,您可以通过破坏注册表来强行显示它们。
  • 您可以轻松地在程序集缓存中添加对程序集的引用。 “simply use the Add Reference window to add a reference to an assembly you've installed in the GAC ”。 (我倾向于不相信这一点,因为我在“添加引用”窗口中没有看到任何 GAC 程序集)。
  • 我工作场所的几个项目确实引用了 GAC 中的许多程序集。这些程序集从未出现在“添加引用”菜单中,所以我知道我的前辈没有使用注册表修改技术。然而,它们显然源自 GAC——它们的文件路径是 C:\Windows\assembly 的子目录。

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

    我想知道两件事:
  • 开发人员什么时候想要使用 GAC?有什么好处
    没有注册表技巧就无法引用的库?
  • 我的前辈在引用库中采取了哪些步骤?
    GAC,不涉及注册表?
  • 最佳答案

    and all .NET projects that reference it will now use the new version.



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

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

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

    关于.net - 引用全局程序集缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822026/

    相关文章:

    .net - 系统在哪里存储图标位置?

    .net - Windows 窗体应用程序的现代 UI 应用程序设计

    c++ - 为什么 'unspecified_bool' 对于对其包装类型具有内部转换的类失败?

    winforms - 自定义选项卡控件未显示在 Visual Studio 窗体设计 View 中

    .net:如何调试 XmlSerializer.Deserialize 错误?

    c# - 为什么返回集合接口(interface)而不是具体类型?

    c++ - 如何使用visual studio在c中捕获全屏

    assemblies - 关于广汽集团的困惑

    gac - 如何判断哪些应用程序在 GAC 中注册了给定的程序集?