全局程序集缓存
外观
全局程序集缓存(Global Assembly Cache,缩写GAC)是微软.NET框架中通用语言架构(CLI)在电脑范围内的一个CLI程序集缓存。这是一个有特殊控制的中央存储库,用以解决了共享程序库概念中的缺陷,并有助于避免其他解决方案中的陷阱,例如DLL地狱。
需求
[编辑]全局程序集缓存中驻留的程序集必须遵守特定的版本控制方案,以允许并行执行不同的代码版本。具体来说,程序集必须采用强命名。
使用
[编辑]与全局程序集缓存交互有两种方式:全局程序集缓存工具(gacutil.exe)和程序集缓存查看器(shfusion.dll)。
使用示例
[编辑]假设一台电脑上有两个名为程序集的AssemblyA,其中一个是1.0版本,另一个是2.0版本。由于编译时需要找到AssemblyA,而两个同名文件不能在FAT32文件系统上存在于同一个目录。而应用此技术,程序可以使用全局程序集缓存的虚拟文件系统,调用所需的特定版本程序集。
实现
[编辑]陷阱
[编辑]全局程序缓存机制有助于避免以前常见的DLL地狱,但它仍然有一些缺点,如:[1]
- 默认情况下,应用程式只使用编译它时所使用.NET Framework版本来运行,所以应用程式在安装了较新版本.NET框架的机器上有可能发生故障,即便应用程式能正常在新版中运行。
- 如果应用程式中使用了某些仅特定版本框架中可用的核心.NET调用,可能必须使用条件编译。
- 即便使用此机制,依赖于原生代码的 .NET应用程式可能不兼容。
- 添加到全局程序集缓存的每个程序集都必须使用Strong key。在某些情况下,完成强命名工作可能很麻烦。例如,如果程序集依赖于另一个非强命名的程序集,则无法在全局程序集缓存中注册。如果第三方程序集的代码不在程序员可修改的范畴,则将程序集转换为强命名是不可能完成的工作。
- 使用标准Windows API浏览文件时,不能选择“assembly”文件夹中的DLL文件,文件资源管理器将显示全局程序集缓存的用户友好视图。
参见
[编辑]参考资料
[编辑]- ^ John, Mueller. Ten Managed Application Pitfalls that Kill Version Compatibility. devsource.com. 2005-02-11 [2008-01-26]. (原始内容存档于2013-01-21).