偶然在博客園中瞭解到這種技術,順便學習了幾天。 以下是搜索到一些比較好的博文供參考: MEF核心筆記 《MEF程式設計指南》博文彙總 先上效果圖 一、新建解決方案 開始新建一個解決方案Mef,再添加一個winform項目為:MefDemo 如圖: 打開Form1視窗,拉入MenuStrip菜單控制項, ...
偶然在博客園中瞭解到這種技術,順便學習了幾天。
以下是搜索到一些比較好的博文供參考:
先上效果圖
一、新建解決方案
開始新建一個解決方案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目錄下