C#一步一步實現插件框架的示例(二)


前一篇鏈接: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窗口

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM