当前位置: 首页 > news >正文

MEF 在 WPF 中的简单应用

MEF核心笔记MEF 的开发模式主要适用于插件化的业务场景中,C/S 和 B/S 中都有相应的使用场景,其中包括但不限于 ASP.NET MVC 、ASP WebFormsWPFUWP 等开发框架。当然,DotNet Core 也是支持的。

以下是搜索到一些比较好的博文供参考:

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

现在来创建一个接口项目(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下载

参考文章:[MEF插件式开发] 一个简单的例子 - 李子深 - 博客园

http://www.dtcms.com/a/283311.html

相关文章:

  • sky-take-out项目中的切点
  • 工控机内Docker容器间Socket通信实现
  • 继电器驱动电路注意的坑
  • AI产品经理面试宝典第30天:AI+教育个性化学习与知识图谱相关面试题的解答指导
  • 解锁支付宝小程序日活增长密码
  • 使用YOLOv11实现水果类别检测:从数据到模型训练的全过程
  • 【IDEA】格式化代码工具配置
  • 【语音技术】影视技能实现方法详细介绍
  • 基于拓扑图的故障定位系统:现代网络与电网的守护者
  • 31.Python 中初始化列表的几种方式
  • JS的防抖与节流
  • Javase总体回顾
  • EP01:【NLP 第二弹】自然语言处理概述
  • Postman接口
  • 代码随想录算法训练营第二十二天
  • AI编程神器 Claude Code 安装及使用体验
  • 横向移动(下)
  • RAG测试用例集的构造(Ragas的用法)
  • cell2location复现
  • MySQL基础学习之DML,DQL(二)
  • 访问继承成员(C++)
  • C语言数据存储与指针
  • 选择亿林数据软件测试服务,为哈尔滨企业数字化转型赋能
  • Rust入门之并发编程基础(三)
  • CSS全面系统教程:从入门到精通网页样式设计
  • Datawhale AI夏令营笔记-TF-IDF方法
  • 深度学习入门-卷积神经网络(CNN)
  • JS修改布局--两列布局,拖拽中间修改左右的宽度
  • GI6E 打破網路封鎖:保護你的通信身份安全
  • AI Agent开发学习系列 - langchain之LCEL(2):LCEL 链式表达解析