全局程序集緩存
外觀
全局程序集緩存(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).