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