51Halcon机器视觉

 找回密码
 会员注册

QQ登录

只需一步,快速开始

查看: 397|回复: 3
收起左侧

[基础教程] C# MEF 通用插件框架

[复制链接]
  • TA的每日心情
    耍酷
    昨天 11:02
  • 签到天数: 480 天

    连续签到: 1 天

    [LV.9]以坛为家II

    113

    主题

    561

    帖子

    3061

    积分

    Rank: 9

    积分
    3061

    热心会员突出贡献切换助手验证会员最佳新人

    发表于 2019-8-27 19:56:19 | 显示全部楼层 |阅读模式

    管理员 |主题 113|帖子 561|积分 3061

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    废话少说,这个类我封装好了。
    首先看下约定:
    1. namespace PluginContract
    2. {
    3.     public interface IPlugin
    4.     {
    5.         string Name { get; set; }
    6.         void SayHello();
    7.     }
    8.     public interface IPluginMark
    9.     {
    10.         string Mark { get; }
    11.     }
    12. }
    复制代码
    1. //IPluginMark用来标识MetaData属性
    复制代码

    自动加载插件类:
    1. public class PlugerBase<T>
    2.     {
    3.         public T GetClass(string className)
    4.         {
    5.             if (Names.Contains(className))
    6.             {
    7.                 var plug = DoPluginList.Where(i => i.Metadata.Mark == className).Select(p => p.Value).FirstOrDefault();
    8.                 return (T)plug;
    9.             }
    10.             else
    11.             {
    12.                 return default(T);
    13.             }
    14.         }
    15.         public string[] Names
    16.         {
    17.             get
    18.             {
    19.                 List<string> name = new List<string>();
    20.                 foreach (var item in DoPluginList)
    21.                 {
    22.                     name.Add(item.Metadata.Mark);
    23.                 }
    24.                 return name.ToArray();
    25.             }
    26.         }
    27.         /// <summary>
    28.         /// 插件列表
    29.         /// </summary>
    30.         [ImportMany]
    31.         private List<Lazy<T, IPluginMark>> DoPluginList = new List<Lazy<T, IPluginMark>>();
    32.         public PlugerBase(string subFolderName="Plug")
    33.         {
    34.             Directory.CreateDirectory(Environment.CurrentDirectory + "\"+ subFolderName);
    35.             var catelog = new AggregateCatalog();
    36.             AssemblyCatalog assemblyCataLog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
    37.             catelog.Catalogs.Add(new DirectoryCatalog(subFolderName));
    38.             var container = new CompositionContainer(catelog);
    39.             container.ComposeParts(this);
    40.         }
    41.     }
    复制代码

    插件端:
    第一个:
    1. namespace MEF_Demo//第一个插件实现的插件需要被调用应用的命名空间一致,切记
    2. {
    3.     [ExportMetadata("Mark", "2")]//Mark需要和接口名称同步IPluginMark.后面的2便是GetClass(string className)的className
    4.     [Export(typeof(IPlugin))]
    5.     public class PluginFirst : IPlugin
    6.     {
    7.         public string Name { get; set; } = "张三";

    8.         public void SayHello()
    9.         {
    10.             MessageBox.Show($"你好啊{Name}");
    11.         }
    12.     }
    13. }
    复制代码

    第二个:
    1. namespace MEF_Demo
    2. {
    3.     [ExportMetadata("Mark","1")]
    4.     [Export(typeof(IPlugin))]
    5.     public class PluginSecod : IPlugin
    6.     {
    7.         public string Name { get; set; } = "李四";
    8.         public void SayHello()
    9.         {
    10.             MessageBox.Show($"你好啊{Name}");
    11.         }
    12.     }
    13. }
    复制代码

    最后调用时非常简单:
    1. public MainWindow()
    2. {
    3.     InitializeComponent();
    4.     PlugerBase<IPlugin> plug = new PlugerBase<IPlugin>();//编译好的插件需要放置在Plug文件夹内
    5.     var d= plug.GetClass("1");//通过名称直接反射出对应的类
    6.     d.SayHello();

    复制代码

    原文链接:https://blog.csdn.net/hotmee/article/details/53609052

    1.发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    2.提问请组织好自己的逻辑,标题注明大概是什么问题,问题内容写详细,需提供问题症状、错误代码、截图、位置等等信息,不要让别人去猜你想问啥;

    3.如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    4.回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

    该用户从未签到

    0

    主题

    10

    帖子

    31

    积分

    Rank: 1

    积分
    31
    发表于 2019-8-28 07:16:13 | 显示全部楼层

    试用员工 |主题 0|帖子 10|积分 31

    学习一下
    来自安卓客户端来自安卓客户端

    1.发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    2.提问请组织好自己的逻辑,标题注明大概是什么问题,问题内容写详细,需提供问题症状、错误代码、截图、位置等等信息,不要让别人去猜你想问啥;

    3.如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    4.回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    害羞
    2018-10-13 18:07
  • 签到天数: 24 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    6

    主题

    40

    帖子

    147

    积分

    Rank: 6Rank: 6

    积分
    147
    发表于 2019-8-28 10:42:02 | 显示全部楼层

    黄金VIP |主题 6|帖子 40|积分 147

    这玩意能干啥用

    1.发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    2.提问请组织好自己的逻辑,标题注明大概是什么问题,问题内容写详细,需提供问题症状、错误代码、截图、位置等等信息,不要让别人去猜你想问啥;

    3.如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    4.回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    窃喜
    2019-11-6 08:57
  • 签到天数: 17 天

    连续签到: 3 天

    [LV.4]偶尔看看III

    0

    主题

    65

    帖子

    555

    积分

    Rank: 3

    积分
    555
    发表于 2019-10-23 19:22:35 | 显示全部楼层

    部门助理 |主题 0|帖子 65|积分 555


    学习一下~~~謝謝分享~~~

    1.发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    2.提问请组织好自己的逻辑,标题注明大概是什么问题,问题内容写详细,需提供问题症状、错误代码、截图、位置等等信息,不要让别人去猜你想问啥;

    3.如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    4.回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    51Halcon会员技术交流会员技术交流 | 51Halcon官方客服咨询官方客服咨询 | Halcon切换助手使用反馈切换助手使用反馈 | 51Halcon论坛管理团队论坛管理团队

    申请友链| 小黑屋| 手机版| Archiver|  

    粤ICP备15095995号-2 粤公网安备44030602000670号

    Powered by 51Halcon机器视觉 X3.4 Licensed© 2015-2019 Comsenz Inc.

    快速回复 返回顶部 返回列表