我開發了一個基於WPF插件的應用程序,藉此插件程序集動態加載到「主機」應用程序中,並且宿主應用程序及其插件都引用常見程序集。在主機/插件場景中使用相同類的不同版本
如果在將來的某個時候我想調整普通程序集的一個類,我不想重新編譯所有的插件,以便它們在可能運行的主機應用程序內工作不同版本的通用組件。
場景:
- 有2個版本的常見組件(1.1.0.0 1.2.0.0和)的簽署和部署全局程序集緩存。每個版本都包含一個「Foo」類,它在版本之間保持不變。由於架構的原因,Foo必須保留在通用程序集內。
- 宿主應用程序是針對通用版本1.1.0.0構建的,並提供了一個基類,所有插件中的視圖模型都可以派生出來;它的功能非常以用戶界面爲中心,所以它必須留在主機應用程序中。
- 插件#1是建立對常見的版本1.1.0.0
- 插件#2是建立對常見的版本中使用1.2.0.0
- 相關第三方組件:微軟的棱鏡和的serviceLocation和城堡(溫莎)
常見:
public class Foo
{
// Some useful properties
}
主持人:
public class ViewModelBase<T> where T : Foo
{
// Some useful behaviour
}
插件#1:
public class ViewModel : ViewModelBase<Foo>
{
}
插件#2:
public class ViewModel : ViewModelBase<Foo>
{
}
ISSUE:
在加載插件#2時,收到一個ReflectionT因爲1.1.0.0版的Foo類與1.2.0.0版的Foo類不相同,所以在插件#2中使用Foo作爲視圖模型的類型參數是無效的。
IDEAS:
使用更不可改變「核心」公共組件以包含Foo類(但最終,這將需要從太多不同的組件服用太多班)和所以是不是一種選擇
用匯編重定向(但迫使插件使用的通用組件相同版本的主機應用程序並不能保證開發的Wi期間工作的插件會繼續工作部署後,除非規則落實到位,以確保使用過時的屬性可引入無重大更改)
有沒有人得到了一個真正的並排側(不被與.NET框架並行混淆)像這樣的情況(在單個或多個應用程序域中)?
非常感謝,
羅布
Rob,我正在嘗試做類似的事情。你有沒有解決這個令人滿意的?如果是這樣,你最終採取了什麼方法? – 2013-04-24 09:58:10
嗨@Dommer,我們最終決定在主機應用程序中使用程序集重定向。所以插件只需要使用主機使用的任何版本(我們會讓開發人員知道對常見程序集的任何重大更改)。總而言之,所有插件都將採用相同的版本。 – Rob 2013-04-24 15:57:26
Hi @Rob。感謝您回覆我:-)我們現在正在與您一樣決定,因爲每個插件只能有一個版本同時運行。當然,我們總是可以重新命名每個插件的新版本,然後他們可以並排運行。 – 2013-04-25 07:22:10