前一篇鏈接:C#一步一步實現插件框架的示例(一)
今天我們再接着前一篇來完善插件功能。在前一篇中我們將生成插件按鈕的代碼直接寫在了WorkBench中,無法體現插件式開發的優越性,現在我們來對其進行分離。
首先對WorkBench類中的構造函數進行修改,刪除原來的生成按鈕功能的函數,改變后如下:
public WorkBench() { InitializeComponent(); this.Controls.Add(ToolBar); Application.Idle += new EventHandler(Application_Idle); LoadDlls(); }
前一篇中對插件所標識的功能直接在構造函數中寫死了。現在我們使用反射的方式來將其進行分離,我們將插件單獨編譯成一個DLL,當然一個DLL中可以包含多個插件,也可以一個DLL一個插件。由於在應用程序目錄中可能會有很多其他的DLL,所以我們在這里約定包含有插件的DLL命名規則為:*.addin.dll,這樣我們就只載入符合這種命名規則的DLL。
void LoadDlls() { //獲取所有符合命名規則的DLL var files = Directory.GetFiles(Application.StartupPath, "*.addin.dll"); for (int i = 0; i < files.Length; i++) { LoadAddin(files[i]); } } private void LoadAddin(string path) { //通過反射,獲取DLL中的類型,並遍歷所有為AbstractCommand子類的類,因為我們的插件都繼承於AbstractCommand Assembly assembly = Assembly.LoadFrom(path); Type[] types = assembly.GetTypes(); foreach (var t in types) { var obj = assembly.CreateInstance(t.ToString()); if (obj is AbstractCommand) { AddButton((AbstractCommand)obj); } } }
由於DLL中可能包含有不是插件的類,所以我們通過: if (obj is AbstractCommand)來判斷,因為我們的插件都是繼承於AbstractCommand類,然后就調用AddButton函數根據傳入的AbstractCommand的子類來生成工具欄的按鈕:
void AddButton(AbstractCommand info) { ToolBarButton t = new ToolBarButton(info); this.ToolBar.Items.Add(t); list.Add(t); }
關於ToolBarButton類請查看上一篇介紹或者源碼。
然后我們將上一篇中的test類移出,新建一個DLL,參考到本項目,編譯輸出名稱為:*.addin.dll,將其輸出目錄設置到相同的目錄。運行即可自動生成對應的按鈕。
如中我們將所生成的*.addin.dll拷貝多個到當前目錄,如:td1.addin.dll td2.addin.dll,再運行程序,程序會發現有三個插件,生成三個對應的按鈕,只是他們的功能都是相同的。
最后附上源代碼:http://files.cnblogs.com/city-hunter/ExampleAddin1.rar
下一篇介紹如何生成MDI窗口