程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [MEF插件式開發] 一個簡單的例子,mef插件開發例子

[MEF插件式開發] 一個簡單的例子,mef插件開發例子

編輯:C#入門知識

[MEF插件式開發] 一個簡單的例子,mef插件開發例子


偶然在博客園中了解到這種技術,順便學習了幾天。

以下是搜索到一些比較好的博文供參考:

MEF核心筆記

《MEF程序設計指南》博文匯總

 

先上效果圖

一、新建解決方案

開始新建一個解決方案Mef,再添加一個winform項目為:MefDemo

如圖:

 

打開Form1窗口,拉入MenuStrip菜單控件,把name改名為"ms",菜單控件什麼菜單都不加,如下圖:

 

 

 

接著雙擊窗口寫如下代碼:

private void Form1_Load(object sender, EventArgs e)
        {
            
            ToolStripMenuItem item = new ToolStripMenuItem("插件");
            ms.Items.Add(item);
            foreach (IPlugin plugin in plugins)
            {
                ToolStripMenuItem subItem = new ToolStripMenuItem(plugin.Text);
                subItem.Click += (s, arg) => { plugin.Do(); };
                item.DropDownItems.Add(subItem);
            }
            
        }

  

在繼續寫一個初始化插件代碼:

private CompositionContainer _container;
        private void Init()
        {
            //設置目錄,讓引擎能自動去發現新的擴展
            var catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory+"plugin\\"));

            //創建一個容器,相當於是生產車間
            _container = new CompositionContainer(catalog);

            //調用車間的ComposeParts把各個部件組合到一起
            try
            {
                this._container.ComposeParts(this);//這裡只需要傳入當前應用程序實例就可以了,其它部分會自動發現並組裝
            }
            catch (CompositionException compositionException)
            {
                Console.WriteLine(compositionException.ToString());
            }
        }

  

Form1構造函數加入Init方法,程序剛啟動時會從運行目錄下plugin目錄搜索所有dll文件並加載,plugin就是插件目錄,所有插件都放到這個目錄下

public Form1()
        {
            InitializeComponent();
            Init();
        }

  

二、新建接口類庫PluginInterface

現在來創建一個接口項目(PluginInterface),它就像數據線或電源線一樣,一端連接終端(手機、電腦),一端插到插座(電腦USB接口、插排),完全可以相像一下,手機在電腦充電的情形(它就需要一條數據線,一端連手機,一端連電腦)。

再新建一個接口IPlugin

public interface IPlugin
    {
        string Text { get; } //插件名稱
        void Do(); //動作
    }

  

現在回到主程序,打開Form1窗口,寫上如下代碼:

需要引用System.ComponentModel.Composition

[ImportMany]
        public IEnumerable<IPlugin> plugins;

  

 

三、新建插件類庫

現在可以來開發一個插件,為了方便,我在同一解決方案下創建,創建了一個Plugin1類庫

再類庫下新建一個類MyPlugin並實現IPlugin,有一點要注意,需要把MyPlugin命名空間改成和主程序一樣

namespace MefDemo
{
    [Export(typeof(IPlugin))]
    public class MyPlugin:IPlugin
    {
        public string Text
        {
            get { return "插件1"; }
        }

        public void Do()
        {
            MessageBox.Show(Text);
        }
    }
}

  

同樣的方法再創建2個插件類庫,分別是Plugin2、Plugin3(winform)

插件類庫編譯後,復制dll到主程序plugin目錄下

 

Demo下載

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved