全域程式集快取

全域程式集快取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). 

外部連結 編輯