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

3.进一步探讨

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

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

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

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

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

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

4.项目例子展示

宿主界面:

点击服务发布模块:

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

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

                                          

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

  1. java布尔类型比较器_浅谈Java中几种常见的比较器的实现方法

    在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...

  2. 浅谈EVE中的经济学问题

    浅谈EVE中的经济学问题 1.16340005 本人学院 目录 1.EVE中的货币 2.EVE中的市场 3.EVE中的战争 1.EVE中的货币 在EVE这个世界中,如果对制造业有着一定了解的话,你一定 ...

  3. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  4. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  5. 浅谈Linux中ldconfig和ldd的用法

    ldd 查看程序依赖库 ldd 作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题. 示例:查看test程序运行所依赖的库: /opt/app/todeav1/te ...

  6. python中怎么调用函数_浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 函数的作用:在开发时 ...

  7. file相对路径java_浅谈java 中文件的读取File、以及相对路径的问题

    一.对于java项目中文件的读取 1.使用system 或是 系统的properties对象 ①直接是使用 string relativelypath=system.getproperty(" ...

  8. 浅谈网络通信中的流量整形

    前言 在前面的<浅谈网络通信中的 ACK.NACK 和 REX>一文中,我们知道了网络通信中的丢包重传的相关理论和方法,既在网络发生丢包的情况下的补救措施,本文则往前进一步,介绍下如何通过 ...

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

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

最新文章

  1. JVM 史上最最最完整知识总结!
  2. Java对战.NET,战争与和平的游戏
  3. Ubuntu 10.04 is coming
  4. 十一、JAVA接口的定义和使用
  5. 扒小程序 小程序反编译 获取小程序源码 完美反编译任何小程序完整代码
  6. matlab实习维纳滤波,自编Matlab程序,维纳滤波器的Matlab实现
  7. html5粒子引擎 proton,质子引擎 Proton Engine
  8. 把视频转换成图片帧的代码
  9. 【Python】turtle安装报错ERROR: Command errored out with exit status 1
  10. 钟道隆逆向英语学习法—学习SpeciaI English的三个阶段
  11. 【译】Unity3D Shader 新手教程(5/6) —— Bumped Diffuse Shader
  12. 服务器响应码418,HTTP状态码是什么?与SEO相关的有哪些?
  13. 用python爬取智联招聘
  14. 面试必备之volatile
  15. 停车自助缴费模拟系统c语言,停车场管理系统C语言实现,全动画模拟.doc
  16. php短信接口开发(http协议)
  17. 上升百分之五计算机公式,如何简单计算同期上升下降的百分比?
  18. PHP制作简单仿路由器登录界面
  19. 浅析ActiveSLAM
  20. 嵌入式平台选择:树莓派 or BeagleBone Black(BBB)

热门文章

  1. C++中explicit关键字用法
  2. CentOS中无法使用setup命令 -bash:setup: command not found
  3. c++ -- union介绍
  4. Android在Context详细解释 ---- 你不知道Context
  5. EasyVS 0.3版本发布 -- 给力变换vs编辑器主题
  6. 浅尝boost之timer
  7. ASP网站实现防止被采集
  8. TCP/IP协议与Http协议的区别详解
  9. String到底是值类型还是引用类型(C#)
  10. 模态对话框和非模态对话框区别