.NET中的GAC是什么?


187

只是为外行寻找GAC的简短概述,而不是链接。

Answers:


177

是的,因此基本上,这是一种使DLL可以全局访问而又不必担心冲突的方法。没有更多的DLL地狱。每种体系结构和版本都有自己的生存空间。

它还可以通过自己的方式在资源管理器中进行浏览,因此,如果您转到

C:\ Windows \ assembly

在Windows资源管理器中,它列出了所有DLL。

但是,如果启动了cmd,就可以看到它的真正结构:

C:\ Users \ tritter> cd C:\ Windows \ assembly

C:\ Windows \ assembly> dir

 C:\ Windows \ assembly目录

2009年7月20日02:18 <DIR> GAC
2009/06/17下午04:22 <DIR> GAC_32
2009/06/17下午04:22 <DIR> GAC_64
2009/06/17下午04:22 <DIR> GAC_MSIL
 ...剪...
               0个文件0个字节
               9个Dir 90,538,311,680字节免费

C:\ Windows \ assembly> cd GAC_64

C:\ Windows \ assembly \ GAC_64> dir

 C:\ Windows \ assembly \ GAC_64的目录

2009年6月17日下午4:22 <DIR>。
2009/06/17下午04:22 <DIR> ..
2008年1月19日09:54 <DIR> blbproxy
 ...剪...
2008年1月19日09:54 <DIR> srmlib
2008年1月19日06:11 <DIR> System.Data
2008年1月19日06:11 <DIR> System.Data.OracleClient
 ...剪...
               0个文件0个字节
              34个Dir 90,538,311,680字节免费

C:\ Windows \ assembly \ GAC_64> cd System.Data

C:\ Windows \ assembly \ GAC_64 \ System.Data> dir
 C:\ Windows \ assembly \ GAC_64 \ System.Data的目录

2008年1月19日上午6:11 <DIR>。
2008年1月19日06:11 <DIR> ..
2009年4月11日下午12:20 <DIR> 2.0.0.0__b77a5c561934e089
               0个文件0个字节
               3个目录90,538,311,680字节免费

C:\ Windows \ assembly \ GAC_64 \ System.Data> cd 2.0.0.0__b77a5c561934e089

C:\ Windows \ assembly \ GAC_64 \ System.Data \ 2.0.0.0__b77a5c561934e089> dir

 C:\ Windows \ assembly \ GAC_64 \ System.Data \ 2.0.0.0__b77a5c561934e089的目录

2009年4月11日下午12:20 <DIR>。
2009/04/11 12:20 <DIR> ..
2009年4月11日12:12 PM 3,008,512 System.Data.dll
               1个文件3,008,512字节
               2 Dir 90,538,311,680字节免费

C:\ Windows \ assembly \ GAC_64 \ System.Data \ 2.0.0.0__b77a5c561934e089>

在这里您可以看到System.Data的版本2.0.0.0__b77a5c561934e089。

DLL由5个部分标识:

  1. 名称
  2. 建筑
  3. 文化
  4. 公钥

尽管前3个通常是大型的。


12
您会得到+1,因为这是在避免“ dll地狱”的同时拥有全局引用.dll的新方法。(如果您深入了解dll到底是什么,以及GAC如何解决这个问题,那将是一个更好的答案……您已经掌握了它的基本概况...但是我只是收紧一下。目录结构插入,并添加一些dll的标识和唯一方式)并不是说听起来太消极...我确实给了+1!
Beska

只是不提供链接:]。有关您的答案的问题,“ 3。体系结构”是否由“ GAC_64”目录名称指定?在这种情况下,文化是否为空白-在“ __”下划线之间的值?
Danny Bullis 2013年

2
GAC仅适用于.NET应用程序吗?
扎克·史密斯

93

GAC =全局程序集缓存

让我们分解一下:

  • 全局-适用于整个机器
  • 程序集-.NET所谓的代码库(DLL)
  • 缓存-用于快速/通用访问的存储内容的地方

因此,GAC必须是存储代码库的地方,以便计算机上运行的所有应用程序都可以访问它们。


64

全局程序集缓存

安装了公共语言运行库的每台计算机都有一个机器范围的代码缓存,称为全局程序集缓存。全局程序集缓存存储专门指定要由计算机上的多个应用程序共享的程序集。

仅在需要时,才应通过将程序集安装到全局程序集缓存中来共享程序集。作为一般准则,除非明确需要共享程序集,否则将程序集依赖项设为私有,并在应用程序目录中找到程序集。另外,没有必要将程序集安装到全局程序集缓存中,以使它们可用于COM互操作或非托管代码。

MSDN包含的内容可能会让您感到惊讶……您通常可以像阅读文章一样阅读它。顶部最直接,最重要的部分是更复杂的细节。它肯定比我能解释的更好。

请注意,Visual Studio在“ 引用”窗口的.NET选项卡中的GAC中显示所有DLL 。(在解决方案资源管理器中右键单击一个项目,然后选择“添加引用”。)这应该为您提供一个更切实的想法。


他说没有联系,想用自己的话解释。
2009年

在他帖子的原始版本中(我相信他很快就对其进行了编辑),未指定!
Noldorin

15
而且,MSDN的用语总是会变得更好,更准确。:)
Noldorin


12

全局程序集缓存(GAC)是Windows目录中的一个文件夹,用于存储.NET程序集,这些程序专门指定供系统上执行的所有应用程序共享。通过在全局程序集缓存(GAC)中注册程序集,可以在计算机上的多个应用程序之间共享程序集。GAC是整个计算机范围内由.NET Framework维护的程序集的本地缓存。


11

首先,Exe Application从当前目录引用到子目录。然后,系统目录。VS6.0系统目录为..windows / system32。.NET系统目录类似于下面的GAC路径。

  1. GAC路径

    1)C:\ Windows \ Assembly(适用于.NET 2.0〜3.5)

    2)C:\ Windows \ Microsoft.NET \ assembly(对于.NET 4.0)

  2. 如何将程序集安装到GAC中(以管理员身份)

    1)拖放

    2)将GacUtil.exe与Visual Studio命令提示符一起使用

     gacutil -i [Path][Assembly Name].dll
    • 注意:要将程序集安装到GAC中,必须对程序集进行强命名。否则,您将收到如下错误:无法将程序集添加到缓存中:尝试安装没有强名称的程序集。
  3. 如何从GAC卸载程序集(以管理员身份)

     gacutil -u [Assembly Name], Version=1.0.0.0, PublickeyToken=7896a3567gh
    • 注意:.dll没有扩展名。版本和PublickeyToken可以省略,并在GAC程序集中检查。

5

就像COM注册表正确处理了物理文件及其接口和位置信息一样。在COM中,文件无处不在,具有集中的元数据。GAC集中了爆炸。


5

GAC(全局程序集缓存)是所有共享的.NET程序集所在的位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.