2011-07-07 44 views
7

我有一個第三方庫,需要在調用代碼時加載程序集A.該組件通常安裝在GAC中,因此我有幾個選項來加載它:我應該如何強制加載引用程序集?

  1. 我可以明確地調用Assembly.Load()。但是,這需要我的程序中硬編碼不舒服的全名。
  2. 我可以明確地撥打Assembly.LoadWithPartialName()。當然,這是一個過時的API,當然我不願意在版本控制中失去控制。
  3. 我可以在我的Visual Studio項目文件中引用程序集,所以我總是獲得我構建的版本。但是,除非我在該程序集中創建一個虛擬對象,否則這將不起作用。如果我不這樣做,C#編譯器會簡單地忽略它。
  4. 同樣的問題,如果我打電話Assembly.GetReferencedAssemblies並強制加載匹配的問題。即使我把它放在引用列表中,C#編譯器也不會引用我的程序集。

現在我正在做的是調用typeof(A.Foo).Assembly.GetName()並忽略返回值。有沒有更好的方法來做到這一點?

+0

來抓住它,如果選項#1,但將程序集全名放在app.config(或其他類似的配置文件)?這樣你就可以得到兩全其美的效果: - 你需要一個明確的程序集加載,但是如果你需要 – dkackman

+0

@dkackman,那麼無需重新編譯就可以靈活更新 - 這也是我需要手動更新的東西。我希望Visual Studio從版本控制中獲取當前版本,因此我可以在構建時獲得版本,而不需要編碼時間或運行時間。 –

+0

@focey - 嗯,有一種可疑的氣味,但...後建立步驟?得到程序集,發現版本,寫入配置文件?可能最好只是繼續做你正在做的,雖然我不喜歡那 – dkackman

回答

1

對我來說,選項1將在VS項目中引用它。

但是,如果你想要一個更被動的方法,你可以使用AppDomain.CurrentDomain.AssemblyResolve事件處理程序。它在需要在AppDomain中找不到的程序集時執行。事件args會告訴你正在尋找的Assembly,並且你可以使用Assembly.Load()

+1

謝謝 - 不幸的是,第三方庫調用AppDomain.CurrentDomain.GetAssemblies()'並且如果找不到所需的引發。 –

+3

@ focey - 這是重擊 – dkackman

+0

完全重擊! –

相關問題