全局程序集缓存

全局程序集缓存Global Assembly Cache,缩写GAC)是微软.NET框架通用语言架构(CLI)在计算机范围内的一个CLI程序集英语Assembly (CLI)缓存。这是一个有特殊控制的中央存储库,用以解决了共享程序库概念中的缺陷,并有助于避免其他解决方案中的陷阱,例如DLL地獄

需求 编辑

全局程序集英语Assembly (CLI)缓存中驻留的程序集必须遵守特定的版本控制方案,以允许并行执行不同的代码版本。具体来说,程序集必须采用强命名英语Strong name

使用 编辑

与全局程序集缓存交互有两种方式:全局程序集缓存工具(gacutil.exe)和程序集缓存查看器(shfusion.dll)。

使用示例 编辑

假设一台电脑上有两个名为程序集英语Assembly (CLI)AssemblyA,其中一个是1.0版本,另一个是2.0版本。由于编译时需要找到AssemblyA,而两个同名文件不能在FAT32文件系统上存在于同一个目录。而应用此技术,程序可以使用全局程序集缓存的虚拟文件系统,调用所需的特定版本程序集。

实现 编辑

陷阱 编辑

全局程序缓存机制有助于避免以前常见的DLL地狱,但它仍然有一些缺点,如:[1]

  • 默认情况下,应用程序只使用编译它时所使用.NET Framework版本来运行,所以应用程序在安装了较新版本.NET框架的机器上有可能发生故障,即便应用程序能正常在新版中运行。
  • 如果应用程序中使用了某些仅特定版本框架中可用的核心.NET调用,可能必须使用条件编译英语Conditional compilation#Conditional compilation
  • 即便使用此机制,依赖于原生代码的 .NET应用程序可能不兼容。
  • 添加到全局程序集缓存的每个程序集都必须使用Strong key英语强命名。在某些情况下,完成强命名工作可能很麻烦。例如,如果程序集依赖于另一个非强命名的程序集,则无法在全局程序集缓存中注册。如果第三方程序集的代码不在程序员可修改的范畴,则将程序集转换为强命名是不可能完成的工作。
  • 使用标准Windows API浏览文件时,不能选择“assembly”文件夹中的DLL文件,文件资源管理器将显示全局程序集缓存的用户友好视图。

参见 编辑

参考资料 编辑

  1. ^ John, Mueller. Ten Managed Application Pitfalls that Kill Version Compatibility. devsource.com. 2005-02-11 [2008-01-26]. (原始内容存档于2013-01-21). 

外部链接 编辑