必赢亚洲手机app下载


366net必赢亚洲手机版并非就此借努力,换来一个借出生活

你的免束缚,正在逐渐毁掉你

[MEF插件式开发] 一个简练的事例

偶然在博客园中打探及这种技能,顺便学习了几乎龙。

以下是找到有些比好之博文供参考:

MEF核心笔记

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

 

先期上效益图

366net必赢亚洲手机版 1

366net必赢亚洲手机版 2

366net必赢亚洲手机版 3

366net必赢亚洲手机版 4

平等、新建解决方案

千帆竞发新建一个解决方案Mef,再补充加一个winform项目为:MefDemo

如图:

366net必赢亚洲手机版 5

 

开辟Form1窗口,拉入MenuStrip菜单控件,把name改名为”ms”,菜单控件什么菜单都无加以,如下图:

 

 366net必赢亚洲手机版 6

 

随后双击窗口写如下代码:

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;

  366net必赢亚洲手机版 7

 

老三、新建插件类库

当今可以来开一个插件,为了好,我当同样解决方案下创造,创建了一个Plugin1类库

还接近库下新建一个类MyPlugin并落实IPlugin,有好几使小心,需要把MyPlugin命名空间366net必赢亚洲手机版改成为跟主程序平

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

366net必赢亚洲手机版 8

 

Demo下载

 

相关文章

No Comments, Be The First!
近期评论
    文章归档
    功能
    网站地图xml地图