2010-08-02 41 views
1

以下解決方案唯一的在代碼中使用GAC庫的可能性嗎?使用全局程序集緩存(GAC) - 按照其設計的方式

Assembly lib = Assembly.Load("MyLibrary, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=31f5625abd53197f"); 

Console.WriteLine(lib.GetType("MyClass").GetMethod("Start").Invoke(obj, null)); 

我是一個有點困惑 - 我讀過頗多約GAC,我知道如何註冊組件,intall和GAC卸載組件,但不知道如何使用它,以及如何做它有助於程序員(除了安全地存儲相同庫的不同版本)。我希望通常可以創建類,而不是被迫調用上面介紹的方法。

我不想要任何解決方法,比如:「更改Windows註冊表」,因爲我不認爲GAC是爲這種操作設計的。我想要一個簡單的答案:GAC的用途是什麼,運行時環境以某種方式使用它?

當代碼變得非常醜陋難以管理時,使用GAC有什麼意義?或者我錯過了什麼?也許我應該手動將程序集複製到我的本地文件夾中?但是我聽說這也很難做到。

回答

4

的GAC是有幫助你有多個版本的(這是公共密鑰是什麼 - 防止名稱衝突)安裝並排側組件,並提供給整機,不只是你的應用程序目錄

因此,使用版本號從GAC訪問程序集幾乎與GAC的設計方式完全相同。 ;-)

btw:當你不需要時,你不應該動態加載東西。 IOW:如果您已經知道類名稱和程序集版本,則可以引用該程序集並跳過不僅動態加載程序集而且還通過反射調用方法的顯着性能損失。 (而不是像通過接口或代理重用它們)

+1

然後爲什麼說GAC幫助解決所謂的「DLL地獄」問題,如果只有我的庫?如果我不知道如何讓它們出來並重用,那麼我的裝配就有什麼意義呢?我仍然需要一個本地副本:/。如果我理解正確,建議我在Windows文件夾中手動搜索文件。是否使用了反思方式?還有一點:mscorlib程序集如何鏈接到我的應用程序,因爲它駐留在GAC中,但我通常使用它(而不是通過反射)? (對不起,我只是想了解它; /) – 2010-08-02 09:04:24

+1

DLL Hell由全局安裝的庫組成,這些庫得到更新,這些更新有時會破壞需要其他版本的庫xyz的其他應用程序。此外,經典的DLL只能通過文件名訪問,而GAC也使用從強名稱生成的版本和公鑰。因此,即使是同名的圖書館也不會與您的圖書館衝突,因爲公鑰有所不同。 - 您爲什麼認爲,在將程序集安裝到GAC中時需要本地副本? – 2010-08-02 09:21:19

+1

@Marc,只需使用添加引用窗口添加對GAC中安裝的程序集的引用,並且可以像使用任何其他引用的程序集一樣使用其類型,而無需在代碼中指定任何內容(就像使用各種System。 *班)。 – 2010-08-02 09:21:30

1

如果你的程序集已被創建或GAC'd,那麼應用程序將自動使用它,如果一切(哈希等)匹配。

0

如果您在項目中引用程序集,則可以像使用通常所引用的不在GAC中的DLL那樣使用它。

相關問題