插件系统的构建

从去年开始,我就在思考如何对我们的程序进行改进,因为我们的项目更多的是对现有软件的定制,于是我开始在思考如何构建插件系统,通过对这些插件的动态加载与卸载,这段时间在新项目中已经试验了,不过现在还是以LIB库嵌入程序中,后期将会采用dll库动态加载

1.整理系统的接口
今年接手后,我开始整理接口,后续的定制开发将会使用这些接口而不是直接在主干上进行修改,我对主干的代码现在有绝对的控制权,不允许别人去修改他,接口需要经过我的同意后才能合进主干,并且在整理接口的时候,尽量将接口原子化,接口声明也都是C代码,我在想后续开发是否可以通过Lua来进行,当然这个想法只是从去年年底开始酝酿

2.使用回调机制
我们以前的开发是直接原有的代码上修改,然后通过配置文件或者宏来定义,这样做的后果就是代码复杂难以维护,一个文件里面有5000行代码很正常,而且合并非常困难,我们的以前的主管都是用人工下去合并的,出错几率非常高,去年我就深受这种开发模式之苦
后面我采用function和bind配合来提供类似于回调机制,其实原来系统内有一些接口已经提供了这种机制了,不过是使用虚函数的机制,但是因为我们的插件是构建在DLL上的,这样就要尽量避免DLL hell(http://blog.csdn.net/happydeer/article/details/8776) 的问题,最好不要使用虚函数,这个也是采用C代码而不是C++的原因之一
当用户利用bind将一个函数绑定后并且向我们的系统注册后,当时间发生的时候,系统将会一一通知这些函数,从这个项目开始,我们采用这种方式后,效率和维护简便了很多

从项目开始到现在,主要还是在做上面的事情,并且在新项目中使用这些,现在的"插件"还是在原有的解决方案里面加一个项目,然后按照上面的方式进行开发,后期只要改一下配置以及增加DLL管理模块,增加DLL导出接口就可以了,项目后面验收完毕后,将会开始采用这种方式下去开发

3.DLL的动态加载
DLL其实内部原理有点类似于我们的EXE程序,都是PE文件的格式,更重要的是,DLL在加载和卸载的时候都会有通知,这样,我们实际上可以将我们的插件当成一个程序
http://www.blogjava.net/yipak/articles/182025.html




posted @   linyilong  阅读(392)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2013-04-09 <<TCP/IP高效编程>>读书笔记
点击右上角即可分享
微信分享提示