偶然在博客园中了解到这种技术,顺便学习了几天。
以下是搜索到一些比较好的博文供参考:
先上效果图
一、新建解决方案
开始新建一个解决方案Mef,再添加一个winform项目为:MefDemo
如图:
打开Form1窗口,拉入MenuStrip菜单控件,把name改名为"ms",菜单控件什么菜单都不加,如下图:
接着双击窗口写如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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); } } |
在继续写一个初始化插件代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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就是插件目录,所有插件都放到这个目录下
1
2
3
4
5
|
public Form1() { InitializeComponent(); Init(); } |
二、新建接口类库PluginInterface
现在来创建一个接口项目(PluginInterface),它就像数据线或电源线一样,一端连接终端(手机、电脑),一端插到插座(电脑USB接口、插排),完全可以相像一下,手机在电脑充电的情形(它就需要一条数据线,一端连手机,一端连电脑)。
再新建一个接口IPlugin
1
2
3
4
5
|
public interface IPlugin { string Text { get ; } //插件名称 void Do(); //动作 } |
现在回到主程序,打开Form1窗口,写上如下代码:
需要引用System.ComponentModel.Composition
1
2
|
[ImportMany] public IEnumerable<IPlugin> plugins; |
三、新建插件类库
现在可以来开发一个插件,为了方便,我在同一解决方案下创建,创建了一个Plugin1类库
再类库下新建一个类MyPlugin并实现IPlugin,有一点要注意,需要把MyPlugin命名空间改成和主程序一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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目录下
作者:李子深
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。