插件系统的构建

从去年开始,我就在思考如何对我们的程序进行改进,因为我们的项目更多的是对现有软件的定制,于是我开始在思考如何构建插件系统,通过对这些插件的动态加载与卸载,这段时间在新项目中已经试验了,不过现在还是以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




原文地址:https://www.cnblogs.com/linyilong3/p/b913678d2c6a3fbfd9b3e19693f3e40a.html