偶然在博客园中了解到这种技术,顺便学习了几天。

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

MEF核心笔记

《MEF程序设计指南》博文汇总

先上效果图

一、新建解决方案

开始新建一个解决方案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目录下

Demo下载

作者:李子深
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

[转][MEF插件式开发] 一个简单的例子的更多相关文章

  1. [MEF插件式开发] 一个简单的例子

    偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...

  2. MEF 插件式开发 - 小试牛刀

    原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Fra ...

  3. MEF 插件式开发 - WPF 初体验

    原文:MEF 插件式开发 - WPF 初体验 目录 MEF 在 WPF 中的简单应用 加载插件 获取元数据 依赖注入 总结 MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场 ...

  4. MEF 插件式开发之 小试牛刀

    MEF 简介 Managed Extensibility Framework 即 MEF 是用于创建轻量.可扩展应用程序的库. 它让应用程序开发人员得以发现和使用扩展且无需配置. 它还让扩展开发人员得 ...

  5. 【UI插件】开发一个简单日历插件(上)

    前言 最近开始整理我们的单页应用框架了,虽然可能比不上MVVM模式的开发效率,也可能没有Backbone框架模块清晰,但是好歹也是自己开发出来 而且也用于了这么多频道的东西,如果没有总结,没有整理,没 ...

  6. MEF 插件式开发之 DotNetCore 中强大的 DI

    背景叙述 在前面几篇 MEF 插件式开发 系列博客中,我分别在 DotNet Framework 和 DotNet Core 两种框架下实验了 MEF 的简单实验,由于 DotNet Framewor ...

  7. MEF 插件式开发之 DotNetCore 初体验

    背景叙述 在传统的基于 .Net Framework 框架下进行的 MEF 开发,大多是使用 MEF 1,对应的命名空间是 System.ComponentModel.Composition.在 Do ...

  8. MEF 插件式开发之 WPF 初体验

    MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场景中,C/S 和 B/S 中都有相应的使用场景,其中包括但不限于 ASP.NET MVC .ASP WebForms.WPF ...

  9. 零基础ASP.NET Core MVC插件式开发

    零基础ASP.NET Core MVC插件式开发 一个项目随着业务模块的不断增加,系统会越来越庞大.如果参与开发的人员越多,管理起来也难度也很大.面对这样的情况,首先想到的是模块化插件式开发,根据业务 ...

随机推荐

  1. springboot与dubbo整合遇到的坑

    整合环境: dubbo 2.6.2 springboot 2.1.5 遇到的问题:服务一直无法注册到zookeeper注册中心 项目结构: 使用application.properties文件: 配置 ...

  2. ES6 学习笔记 - let和const

    let 和 const 命令 学习资料:ECMAScript 6 入门 let 所声明的变量,只在let命令所在的代码块内有效.用途:循环计数器. 如果使用var,只有一个全局变量i: var a = ...

  3. 添加telnet命令

    打开控制面板,打开程序和功能,看到左边有个“打开或关闭Windows功能 ,打开找到telnet客户端,把这2项都勾选上,然后确定就可以了 注意,如果只要telnet别人的话,就选telnet客户端. ...

  4. 树莓派+百度api实现人脸识别

    title: 树莓派+百度api实现人脸识别 tags: 树莓派 date: 2018-5-31 20:06:00 --- 树莓派对接百度api 我以前玩安卓的时候一直用的讯飞的平台和api,对于百度 ...

  5. 自定义样式 dialog

    自定义样式 dialog,可设置界面外点击屏幕外和返回键  是否消失 基本用法如下: CustomDialog.Builder customBuilder = new CustomDialog.Bui ...

  6. C++(变量类型-深入)

    变量类型 变量其实只不过是程序可操作的存储区的名称.C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字 ...

  7. 跨站脚本攻击XXS(Cross Site Scripting)修复方案

    今天突然发现,网站被主页莫名奇妙的出现了陌生的广告. 通过排查发现是跨站脚本攻击XXS(Cross Site Scripting).以下为解决方案. 漏洞类型: Cross Site Scriptin ...

  8. git分支拉取

    假设你已经配置好了各种SSH Key之类并熟悉基本的git创建分支.提交分支命令.比如共有2个分支,自己在一台未配置origin电脑上想要拉取某个分支(dev)到本地.步骤如下:1.新建git项目 与 ...

  9. [Windows Server 2008] IP安全策略限制端口方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:限制143 ...

  10. HDU_1024_dp

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...