偶然在博客園中了解到這種技術,順便學習了幾天。
以下是搜索到一些比較好的博文供參考:
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),它就像數據線或電源線一樣,一端連接終端(手機、電腦),一端插到插座(電腦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下載