11.9 研究GAC的内部结构
到现在为止,一切都还不错。下面让我们研究GAC本身的内部结构。使用Windows资源管理器查看GAC,每一个图标表示共享程序集的每一个版本。这些图形化界面(shell)由名为shfusion.dll的COM组件实现。可以想到,每一个图标其实都是一个拥有详细内容的目录结构。
为了更好地理解GAC究竟是什么,打开一个命令行窗口,转到Assembly目录下:
cd c:\windows\assembly
然后输入dir命令,会看到一个名为GAC_MSIL的文件夹(如图11-26所示)。

图11-26 隐藏的GAC_MSIL子目录
进入GAC_MSIL目录,输入dir命令。会看到一个子目录列表。其中子目录的名称与shfusion.dll显示的图标名是完全一一对应的。进入CarLibrary子目录,再次输入dir命令(如图11-27所示)。

图11-27 隐藏的CarLibrary子目录的内部
可见,GAC为共享程序集的每一个版本都维护一个子目录。子目录以这样的方式命名:<versionofAssembly>_PublicKeyToken的值。进入当前目录的CarLibrary的1.0.0.0版本的目录,会看到对应的代码库副本(如图11-28所示)。

图11-28 看,CarLibrary.dll在GAC中的副本
当把一个强名称程序集安装到GAC后,操作系统会在Assembly子目录下创建对应的目录的结构。这样CLR就可以轻松管理某一程序集的多个版本,避免了文件名称冲突的问题(程序集的不同版本拥有完全一样的文件名*.dll)。






