我應該什麼時候將我的程序集部署到 GAC 中?
我想知道我應該在 GAC 中部署什麼樣的程序集。
案例 1:如果在我的解決方案中多個項目使用 log4net.dll 那麼它應該部署在 GAC 中嗎?
案例 2:如果我在一台機器上部署了多個應用程序,每個應用程序都使用 log4net.dll,這是否足以將 log4net.dll 部署到 GAC 中?
問題:我應該什麼時候將我的程序集部署到 GAC 中?
答案: 從不
實際、誠實、真實的答案: 幾乎沒有
討論
僅當機器上的多個應用程序將使用程序集、程序集是基礎程序集(可能被多個應用程序使用)、簽名時以及您希望幾乎永遠不會更新該程序集時,才將內容放入 GAC。也許補充一點,當每個應用程序部署多個獨立版本的 DLL 時,實際上是有害的。
後者的一個例子是:假設你有 2 個獨立的應用程序,獨立開發和獨立部署。儘管如此,他們還是有可能相互交流。他們將在本地機器上通過 .NET Remoting 交換……一些東西……。如果您在 GAC 中有一個程序集,則可以確保這些應用程序之間的通信正常工作。但是,如果它們各自有一個單獨的程序集版本,則它們可能無法交換對象。 這種情況非常罕見,您可能不需要它。如果你不確定,那麼你就不需要它。
基本 GAC 方案是 .NET 基類庫。這些程序集由 Microsoft 提供。他們是權威的。它們是基礎的。並簽字。他們很少改變。所有應用程序都應使用這些 DLL 的相同副本。因此,它們屬於 GAC。
相反,您的應用程序 DLL 不是來自 Microsoft,它們不是基礎的,並且可能沒有簽名。它們更頻繁地更改,並且只有少數應用程序(可能只有一個!)使用每個 DLL。沒有廣汽。
我可以想像一個硬體設備,比如數位相機,它安裝了一個 .NET 程序集以實現可程式性。在這種情況下,程序集可能很適合 GAC。它允許任意 .NET 應用程序以程式方式訪問數位相機。
在我看來,您的 log4net 範例不足以證明將程序集放入 GAC 是合理的。想像一下其中一個應用程序獲得更新的場景,作為更新的一部分,它使用了新版本的 log4net。怎麼辦?是否應該將新的 log4net 程序集放入 GAC?可能不是。
跨應用程序共享 DLL 的整個想法植根於記憶體和磁碟儲存稀缺的前提。曾幾何時,這是真的。這不再是真的了。如有疑問,請不要使用 GAC。