偶然在博客園中了解到這種技術,順便學習了幾天。
以下是搜索到一些比較好的博文供參考:
先上效果圖




一、新建解決方案
開始新建一個解決方案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目錄下

