浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

时间:2022-09-25 10:36:37

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

三年多前还在上研时,用C#+反射机制写过插件系统,后来又用MEF写过插件系统。插件系统本身具有易于扩展的优势,所以在实际项目中使用很频繁。即使在B/S项目中,插件的思想也是大行其道,比如前端单页面+AMD编程便可以理解为一种插件机制,以及后台扩展项目统一打包为一个jar放入主系统jar文件中一起发布,也可以理解为插件思想的运用。

这里我们回到C/S插件系统编写的问题上。由于之前诸多项目编写是将插件编译成dll,然后进行解析。这样做有其好处,即宿主中可以对各个模块解析,完成插件间、插件和主程序间的通信。但是在实际项目中,同样也有其劣势:

a.每一个插件被编译成了dll,各模块无法单独运行,必须依托于主程序。

b.修改插件时,由于生成的是dll,无法快速直观的查看修改以及调试。

c.每一个插件必须依赖于某一个规范。

当我们并不需要插件之间、插件和主程序之间有通信发生时,我们是否可以舍弃这种dll插件形式呢?

2.设计思路

此项目背景,即各模块之间无需通信。并且为了适应各模块能独立运行以及各模块需要单独调试的需求,这里我直接将各模块设计为单独的系统,即编译后生成exe。在主系统中,通过对配置文件的解译,生成界面以及绑定相关回调事件。各插件exe以配置规则放入主程序文件夹下即可。

浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

3.进一步探讨

a.C#调用exe,使用Process和 ProcessStartInfo配合完成。

浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

b.完成各模块(exe)的单例模式。

由于是直接调用exe,无法利用传统的单例模式实现。这里可以做一个字典表来存储,目前哪些模块已经被调用。

但是,当循环监听模块是否退出时,会导致系统卡顿,这里使用多线程来进行模块开启,解决监听模块导致的界面卡顿。

浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

c.主程序退出时,所有模块(exe)退出。

用字典表存储各模块的实际进程,主程序退出时,将各进程杀死关闭。

浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

4.项目例子展示

宿主界面:

浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

点击服务发布模块:

浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

          如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                          浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)的更多相关文章

  1. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  2. 浅谈C中的malloc和free

    转自http://bbs.bccn.net/thread-82212-1-1.html非常感谢作者 浅谈C中的malloc和free 在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的 ...

  3. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  4. 浅谈HTTP中GET、POST用法以及它们的区别

    浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...

  5. 视频基础知识:浅谈视频会议中H&period;264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  6. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  7. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  8. 浅谈JS中的&excl;&equals;、&equals;&equals; 、&excl;&equals;&equals;、&equals;&equals;&equals;的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C&num;中Cookie,Session,Application的用法与区别? c&num;反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  9. 浅谈WPF中对控件的位图特效(WPF Bitmap Effects)

    原文:浅谈WPF中对控件的位图特效(WPF Bitmap Effects) -------------------------------------------------------------- ...

随机推荐

  1. 给Eclipse提速的7个技巧

    这篇文章只是关注如何让Eclipse运行得更快.每个技巧都针对Windows.Linux和MacOS用户详细说明.在使用所有优化技巧之后,Eclipse应该能在10秒内启动,并且比以前运行得更流畅. ...

  2. XSS的防御

    基于代码修改的防御 和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免: 步骤1.对所有用户提交内容进行可靠的输入验证,包括对URL.查询 ...

  3. HDU2639Bone Collector II&lbrack;01背包第k优值&rsqb;

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. paip&period;提高效率---集合的存取括号方式 uapi java python php js 的实现比较

    paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...

  5. C语言-04函数

    1.参数 参数注意点 1.形式参数:定义函数时函数名后面中的参数,简称形参 2.实际参数:调用函数式传入的具体数据,简称实参 3.实参个数必须等于形参个数 4.函数体内部不能定义和形参一样的变量 5. ...

  6. ThinkPHP 3&period;2 模板使用函数

    {$name|md5|strtoupper|substr=0,3} 编译后的结果是: <?php echo (substr(strtoupper(md5($name)),0,3));?> ...

  7. &lbrack;操作系统&rsqb; OS X Yosemite U盘制作

    话不多说,DiskMakerX,大小6.3M,下载地址:http://www.liondiskmaker.com/,然后准备好U盘和从官网下的Yosemite系统就可以开始了. DiskMaker X ...

  8. Eclipse中删除tomcat server 导致不能重新创建该版本的tomcat server

    在Eclipse中创建了一个Web工程后,需要将该工程部署到Tomcat中进行发布.有时就会遇到在New Server对话框中选择了Tomcat 6/7后却无法单击“Next”按钮的问题,如下图所示: ...

  9. 点&lpar;x1&comma; y1&rpar;关于点&lpar;x0&comma; y0&rpar;逆时针旋转a度后的坐标求解

    问题描述: 求点(x1, y1)关于点(x0, y0)逆时针旋转a度后的坐标 思路: 1.首先可以将问题简化,先算点(x1, y1)关于源点逆时针旋转a度后的坐标,求出之后加上x0,y0即可. 2.关 ...

  10. &lbrack;WPF 容易忽视的细节&rsqb; —— x&colon;Name与Name属性

    一.前言 WPF使用XAML来对界面进行编写,界面与后台逻辑分离.我们也可以写Style.Trigger来实现一些界面效果, 这些都是通过Name来定位控件的,例如Setter.TargetName. ...