浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间自己不须要通讯)

文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处: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以配置规则放入主程序文件夹下便可。3d

                       

3.进一步探讨

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

 

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

因为是直接调用exe,没法利用传统的单例模式实现。这里能够作一个字典表来存储,目前哪些模块已经被调用。

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

 

 c.主程序退出时,全部模块(exe)退出。

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

 

4.项目例子展现

宿主界面:

 

点击服务发布模块:

 

 

 

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

                                                                                   若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                          

相关文章
相关标签/搜索