2009-06-10 66 views
4

我們的媒體中心加載項作爲一個駐留在GAC(mediabrowser.dll)中的DLL提供,我們允許用戶通過引用我們的DLL和訪問來爲我們的加載項編寫擴展預定義的可擴展性點。.Net加載項和版本號

在加載時,我們通過插件目錄搜索,加載目錄中的所有程序集,在程序集中搜索實現IPlugin的類型,並在插件的實例上執行initialiaztion例程。我知道這不是最穩健的設計(例如:我們可能想在稍後查看appdomain隔離插件),但它現在可以正常工作。

就目前來看,這似乎工作正常,除了一個大的警告。

當插件編寫者編譯插件時,插件引用mediabrowser.dll與特定版本。稍後當我們修改我們的DLL(修復錯誤或添加功能)時,所有針對mediabrowser.dll break的早期版本編寫的插件。

我已經想了幾個解決方案,這個問題(注意程序集是在GAC):

  1. 船舶與mediabrowser.dll發行者策略將重定向mediabrowser.dll的所有早期版本兼容到當前版本(這也必須在GAC中)。
  2. 運送一個單獨的程序集,其中包含所有固定的擴展點和合同,對於更改此程序集要格外謹慎,讓插件作者鏈接此程序集。 (但仍然着眼於使用發佈者策略對接口進行非重大更改)
  3. 讓第三方擔心這個問題,並利用MEF或其他一些處理此類內容的框架。
  4. Hookup AppDomain.CurrentDomain.Assembly將程序集的早期版本解析並解析爲當前版本。這隻有在該特定版本的程序集不在GAC中時纔有效。

是否有任何其他解決方案來解決這個問題?

更新我結束了選項去4.

+0

+1。但是你可能想改變這個問題的標題,使它更清晰一些? – 2009-06-11 08:15:28

+0

我正在爲標題苦苦掙扎。任何人都可以拿出更好的?只要繼續編輯這個,沒有難過的感覺。 – 2009-06-11 08:16:31

回答

1

我看你已經選擇一個答案,但如果你仍然是開放的思路還有另外一個值得考慮的選擇(非常一個由.NET框架中使用):不要在兩個版本之間增加彙編版本(但要增加彙編版本號)。

這將允許您的程序集保留相同的強名稱,而不會破壞插件compat,並且仍然允許您將構建與對方區分開來(使用程序集內部版本號)。

你可以在.NET 2.0到3.5中看到這一點。這些發行版都使用程序集版本2.0.50727,但具有不同的版本。

只要你不破壞你的接口契約(你永遠不應該這樣做),這種方法是非常合理的。