2012-08-27 47 views
0

我需要爲我們的應用程序(.NET,WinForms 3.5)設計一個簡單的插件框架。插件註冊時沒有實例化插件類

擴展點將是幾個應用程序事件/場景,用戶可以使用插件「掛鉤」來執行特定操作。

我想這對工作的方式是:

  1. 有一個插件文件夾,用戶將放置插件的DLL(含有/從特定基類派生的類型標記不知何故組件)。

  2. 讓我的應用程序插件系統找到這些文件並註冊它們以備後用。

  3. 在正確的時間調用正確的插件(例如:OnException,OnLog等)。

如果我將在註冊時創建插件對象(新建),該DLL將被加載到進程內存中。

我正在尋找一種簡單的方法做了登記,並僅在需要時「懶洋洋地」加載插件組裝,(如果需要的話)。

+0

可能偏離主題,但爲什麼經過的延遲加載插件的努力?爲自己節省一兩個啓動時間似乎並不值得。 –

回答

1

你有幾個選項 - 如果你能夠,你可以要求每個插件提供一個清單或其他文件來描述自己,然後你可以檢查所有清單並在必要時加載適當的插件。這樣可以避免檢查程序集,但它確實需要清單和程序集之間的一致性,這可能會非常棘手。

否則,如您所示,檢查插件程序集會將其加載到內存中。我發現要避免這種情況的唯一方法是將它們加載到單獨的AppDomain中,檢查它們並捕獲必要的信息,然後卸載AppDomain。有這樣的PRISM的地方(我可以嘗試追查)的例子,但我不知道你使用的是什麼框架(MEF,MAF,PRISM,國際奧委會等)。

1

在新的AppDomain加載每個候選組合,體現了它的類型和最後卸載的AppDomain的選擇,你可以嘗試Mono.Cecil。然後,您將不得不做這樣的事情:

AssemblyDefinition ad = AssemblyDefinition.ReadAssembly(assemblyPath); 

foreach (TypeDefinition td in ad.MainModule.GetTypes()) 
{ 
    if (td.BaseType != null && td.BaseType.FullName == "MyNamespace.MyAddInBase") 
    {   
     return true; 
    } 
} 

然後你就可以加載使用Assembly.LoadForm正確的組件,最後創建使用Activator.CreateInstance超載適合您的需要加載項的實例。