全局程序集緩存

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

外部連結 編輯