[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目录下

[MEF插件式开发] 一个简单的例子的更多相关文章
- [转][MEF插件式开发] 一个简单的例子
偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...
- MEF 插件式开发 - 小试牛刀
原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Fra ...
- MEF 插件式开发 - WPF 初体验
原文:MEF 插件式开发 - WPF 初体验 目录 MEF 在 WPF 中的简单应用 加载插件 获取元数据 依赖注入 总结 MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场 ...
- MEF 插件式开发之 小试牛刀
MEF 简介 Managed Extensibility Framework 即 MEF 是用于创建轻量.可扩展应用程序的库. 它让应用程序开发人员得以发现和使用扩展且无需配置. 它还让扩展开发人员得 ...
- 【UI插件】开发一个简单日历插件(上)
前言 最近开始整理我们的单页应用框架了,虽然可能比不上MVVM模式的开发效率,也可能没有Backbone框架模块清晰,但是好歹也是自己开发出来 而且也用于了这么多频道的东西,如果没有总结,没有整理,没 ...
- MEF 插件式开发之 DotNetCore 中强大的 DI
背景叙述 在前面几篇 MEF 插件式开发 系列博客中,我分别在 DotNet Framework 和 DotNet Core 两种框架下实验了 MEF 的简单实验,由于 DotNet Framewor ...
- MEF 插件式开发之 DotNetCore 初体验
背景叙述 在传统的基于 .Net Framework 框架下进行的 MEF 开发,大多是使用 MEF 1,对应的命名空间是 System.ComponentModel.Composition.在 Do ...
- MEF 插件式开发之 WPF 初体验
MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场景中,C/S 和 B/S 中都有相应的使用场景,其中包括但不限于 ASP.NET MVC .ASP WebForms.WPF ...
- 零基础ASP.NET Core MVC插件式开发
零基础ASP.NET Core MVC插件式开发 一个项目随着业务模块的不断增加,系统会越来越庞大.如果参与开发的人员越多,管理起来也难度也很大.面对这样的情况,首先想到的是模块化插件式开发,根据业务 ...
随机推荐
- Eclipse中启动tomcat报错java.lang.OutOfMemoryError: PermGen space的解决方法
有的项目引用了太多的jar包,或者反射生成了太多的类,异或有太多的常量池,就有可能会报java.lang.OutOfMemoryError: PermGen space的错误, 我们知道可以通过jvm ...
- [C#] 走进异步编程的世界 - 开始接触 async/await
走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...
- UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)
最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题. ...
- python笔记(持续更新)
1.编译python遇到下面的编码问题: SyntaxError: Non-ASCII character '\xe9' in file E:\projects\learn.py on lin ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- 微框架spark--api开发利器
spark简介 Spark(注意不要同Apache Spark混淆)的设计初衷是,可以简单容易地创建REST API或Web应用程序.它是一个灵活.简洁的框架,大小只有1MB.Spark允许用户自己选 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- Android Weekly Notes Issue #234
Android Weekly Issue #234 December 4th, 2016 Android Weekly Issue #234 本期内容包括: ConstraintLayout的使用; ...
- FineReport如何部署Tomcat服务器集群
环境准备 Tomcat服务器集群中需要进行环境准备: Apache:Apache是http服务器,利用其对Tomcat进行负载均衡,这里使用的版本是Apache HTTP Server2.0.64: ...
- SpringMvc中初始化参数绑定
初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 proper ...