数据加载中……

插件系统的设计

插件系统就是指 当宿主程序开发好以后,可以开发一些符合自定义规范的程序(插件),来扩充宿主程序的功能。

插件系统的设计注意点就是
1. 宿主程序如何知道插件的存在
2. 插件如何从宿主程序获得必需要的内容
3. 插件之间如何交换信息
4. 如何对插件进行扩充(也就是说每一个插件都可以作为一个宿主程序)
5. 考虑插件升级,等一些其它因素
如果前四点都能做到的话,此插件系统的就会具有较强的适应能力了,是不是还有什么没有考虑到:(。

基于此,插件系统的设计原则就是
1. 宿主程序就是插件系统的核心,不含任何与业务相关的内容,不含任何界面,只负责处理自定义的一套插件规范
    由于宿主程序只处理了自定义规范,这样,2, 3 设计注意点则合并成3注意点,2设计注意点不存在了。
2. 插件之间交换信息,借鉴Service模型,每个插件都是提供一个(或多个)服务,并将服务注册到Host中,当需要其它插件提供的服务时,则从Host中去请求。
3. 每一个需要扩充的插件都引用宿主程序(待定???)

至此,插件系统的设计变为自定义插件规范解释程序(宿主程序)的设计。
1. 插件规范的定义  是一个难点

如何定义规范?

posted on 2004-03-31 13:38 muddle 阅读(5125) 评论(36)  编辑 收藏 所属分类: 问题多多

评论

#1楼    回复  引用  查看    

你有没有开发过VS.NET IDE的插件啊??
你可以参考一下它的设计方法..

厄,说起来也不是很难的.
插件是在程序启动的时候就加载了的,加载的时候就把此软件核心有关的对象(主要是操作对象或是主要对象,如VS.NET IDE里面的IDE对象)传给插件..这样子完成了插件的初始化工作.
然后,插件就得向系统注册消息(Message).
系统每收到一个消息,就进行轮循,,找到与此消息绑定的插件,就把参数传给插件.由它进行操作.完成后再把控制权交还系统...
差不多就酱紫..
2004-03-31 16:36 | hBifTs      

#2楼    回复  引用  查看    

厄,我的感觉是差不多像Windows的HOOK的机制...
自己的软件本来有一套消息循环,自定义的插件HOOK消息,从而达到通过插件增加软件功能的目的...
2004-03-31 16:38 | hBifTs      

#3楼    回复  引用    

test
2004-04-01 09:30 | pantian [未注册用户]

#4楼    回复  引用    

其实插件说白了,也就是一个程序而已。
所谓程序,都是千变万化的。
所以,插件其实也可以有无数种实现方式。只要你愿意:
你可以在程序启动时,调用插件,也可以在主程序启动后再调用插件。
你可以将插件在主程序里的显示方式,定义为菜单,工具栏,甚至任何一个可视的控件,或者是几种控件的组合。
你可以将插件定义成文本,EXE,DLL,XML都可以。
你还可以将插件再定义成其它插件的主程序,也就是插件的插件。
有一点,我理解是这样的:主程序做成不可见的,对于插件来说,并不是一个好主意。


我们做一个软件,是有需求的,只要符合一定的需求就可以了。并不需要把它做得非常灵活,这就跟模式设计一样,并不需要做一个“超级电视”(引,2003《程序员》上的一篇关于模式设计的文章),所以,如果一级插件就可以符合需求了,我们就没必要定义二级插件,也就是“插件的插件”。这样,可以降低程序的复杂性,增强可维护性。

对于插件来说,最重要的是使用“反射”机制,这一点,你可以在MSDN里找到。只要将反射机制运用好了,你就可以做无数个千奇百怪的、足够满足你的需求的插件。

插件的例子极多:QQ,WINAMP,PHOTOSHOP,MYIE2,OFFICE,ACDSEE等等,当然还有VISUAL,C#DEVELOP。你可以看看别的程序是怎么定义插件的。
个人认为:MYIE2是插件定义的相当好的一个程序。几乎用到了相当多的、不同类型的插件。而且是一个开源软件。
2004-04-01 09:46 | pantian [未注册用户]

#5楼    回复  引用  查看    

Zezeze....
@pantian
你说了这么多?我完全没有感到对设计/开发插件有一点点帮助??
你所说是只是实现后的东东,说白了,插件只是一个Dll,由主程序来调用的?
你有没有想过,主程序怎么来调用?一两个插件还好,如果多了呢??像MyIE,几十个.你怎么控制插件??你怎么让插件能够完成它想要完成的功能而不会影响到别的插件的使用??? 你是自己没开发过插件的吧....

还有,是不可能做一个"超级电视",但是做为一个程序员,我们得尽力把东西做好一点.对自己的好处是勿拥置疑的..
2004-04-01 11:12 | hBifTs      

#6楼    回复  引用    

插件系统不包含通常意义上的主程序原因在于,主程序是业务相关的。
而我们要是对每一个应用系统都要重新修改插件系统是一件很烦人的事

从某种角度上讲,主程序也是一个插件,它可以与其它的插件协同工作

2004-04-01 12:37 | muddle [未注册用户]

#7楼    回复  引用    

TO hBifTs:
第一,我在上面已经说得很清楚了,在。NET里面做插件,唯一用到的就一个是“反射”,如果对反射很熟悉了,做个插件还不是一个小儿科的东东。

第二,我看你对插件倒不是很熟悉的样子。你既然可以做一个插件,为什么就不能做十个,百个插件呢?这有什么本质上的不同吗?之于MYIE怎么管理插件,就不用我多嘴了。你自己打开MYIE看看就知道了。

第三,对于你认为插件就是一个DLL,很是好笑。你自己没做过,就不要多说嘛。插件本来可以是各种形式的:文本、EXE、DLL、XML等等,就一个MYIE,就可以支持三种插件格式:COM Object,Exe File,Script File。

第四,插件之间的通讯,及其的相互影响,写过两行程序的都知道,插件就相当于一个大程序里的模块,当然得遵守高内聚,低耦合了,将插件之间的影响减至最低了。

第五,“超级电视”确实没什么必要,我在上面也说得很清楚。做程序的,都有点完美主义,这可以理解。但千万不要将这种完美主义发挥到极致,程序够用,有一定的扩展性足矣。绝不需要太多。

最后,你最好不要再问我插件怎么做了?我已经说得很清楚了。老大,一个“反射”就足够了。
2004-04-01 15:48 | pantian [未注册用户]

#8楼    回复  引用  查看    

@pantian
呵呵,好啊,你说做插件只要用Reflection就OK了,呵呵,,Reflection后呢??主程序和插件怎么进行通信呢??使用Reflection么?
Reflection难道就这么强么?就可以不用程序员去自己设计插件与主程序间的通信么?
如果按你这样说,VS.NET的IDE的插件做起来N简单,只要VS.NET的IDE能把它给Reflection就ok了,,那现在所有的程序(用.NET写的)都可以Reflection啊,那是不是都是VS.NET IDE的插件呢???

btw,你自己有没有做过插件啊??我有点怀疑你有没有编过程序??
2004-04-01 15:56 | hBifTs      

#9楼    回复  引用    

TO hBifTs:

好吧,再告诉你几个有关“反射”的名词,你去查查这几个名词,大概也能做个插件出来了。

using System.Reflection;

Assembly.LoadFrom

CreateInstance

还有一点忘了说了,插件并不是一定要在主程序启动时加载的,可以在主程序启动后任何时候加载。这也就是.net里的动态编译。
2004-04-01 15:57 | pantian [未注册用户]

#10楼    回复  引用    

TO hBifTs:

确实忘了,我还真没编过程序呢。不好意思,让你笑掉大牙了。

之于插件之间的通讯,和主程序之间的通讯,老大,你不会自己定义一个好一点的通讯协议呀,笨。

你有没有做过任何接口的通讯,比如:串口,USB,网关,或者纯软件的interface,你哪怕随便做过其中一样,你大概也就知道定义一个通讯协议了就可以解决你那个所谓的难题了。

唉,“没编过程序的人”问的问题都不一样呀,PFPF
2004-04-01 16:04 | pantian [未注册用户]

#11楼    回复  引用  查看    

@pantian
好啊,你就用Reflection给我写一个VS.NET IDE的插件出来啊...
我看你是不是就用到了这个??

算了,告诉你吧,Reflection只是程序加载的途径,不是程序和插件进行通信的方法...Windows为什么要有API,还不就是和Windows进行通信的方法.只有满足了主程序的通信协议后才可称之为插件....

唉,用江Core的话说, too simply,sometimes ....
2004-04-01 16:06 | hBifTs      

#12楼    回复  引用    

TO hBifTs:

还忘了一件事了。

“没编过程序的人”前段时间刚好翻过一本书《C#软件项目开发全程剖析--全面透析SharpDevelop软件的开发内幕》,清华大学出版的。

里面就说了整个CSharpDevelop软件的开发过程(不要告诉我你只用VISUAL,没用其它的IDE来开发.net),里面的AddIns树就是一个极好的插件例子。个人认为:如果你能把这个看懂了,就算再做一个visual ide也不是一件难事。

。。。。。。
书看完了没?
恭喜你终于成为了“插件高手”,呵呵。。。。
2004-04-01 16:16 | pantian [未注册用户]

#13楼    回复  引用  查看    

@Pantian
Zezeze...我还以为是什么呢..原来还是一纸老虎啊...
唉,还是 too simply sometimes naive....

哼,,,期待你的VS.NET IDE做出来.....
2004-04-01 16:19 | hBifTs      

#14楼    回复  引用    

谢谢两位对我的支持
你们两位的观点一合并对我的帮助很大,一位告诉我要了解反射,一位告诉基本想法

我目前在考虑一个软件开发平台的工作,因为现在对具体的需求没能完全确定,所以现在希望先搞一个插件系统出来,以后的平台开发就基于这个插件系统,哪一个功能不需要,扔掉这个插件就OK了,新增一个功能,写一个插件就OK了。而且每一部分都希望可以单独运行,也可以集合在一起运行。所以我希望的是一个异于扩展的系统。我也参看了#development 以及正在看eclipse。

2004-04-01 16:22 | muddle [未注册用户]

#15楼    回复  引用  查看    

@muddle
在.NET出来以前,有没有做插件的???
有,对不对,,Winamp有很多,对不对..所以说Reflection只是实现动态加载插件的途径,对于真正设计插件是完完全全的没有帮助的...

Good Luck~
2004-04-01 16:25 | hBifTs      

#16楼    回复  引用    

TO hBifTs:

看样子,你钻牛角尖了。或者我们对问题的理解都有误了。

谁都知道反射只是一个加载插件的手段。
谁都知道需要定义一个通讯协议。我不是也说了,需要定义一个通讯协议嘛。好像有人还以为我一个反射就做完了似的。就好像给你一个高级语言,你就说软件写好了。可能吗?

只是,楼主好像问的是怎么做一个插件,并不是说让我们给他定义一个通讯协议,再说,通讯协议与每个软件的具体需求有关,他爱怎么定义就怎么定义好了。这点应该就不用我们指手划脚了吧,楼主自己可以解决的。

算了,再吵下去,也没什么意义,楼主要骂人了。我也不说了。我还是写我的通讯协议去。反正偶也没编过程序。呵呵。。。。。。
2004-04-01 16:25 | pantian [未注册用户]

#17楼    回复  引用    

to 楼主:

呵呵,打扰良久,不好意思(今天偶心情好,想跟人吵吵:))。
既然楼主有具体的想法,那我也就随便说两句,谈谈我的看法。

看来楼主是准备在.net下做这个平台了。
我以前在.net下做的很多平台,一般情况下,也是使用插件系统的。

首先一点:你这个软件不可能什么都做,所以,要有的放矢。
做插件,如果技术不是问题的话,最重要的一点就是:前期的架构设计,也就是你计划这个主程序加载插件后是什么样子?一起运行可以得到什么结果?把这个想清楚了,程序写起来就不会很难了。
还有,对于非本公司的第三方插件,需要做一个权限,以免差劲的插件导致主程序的崩溃。

因为不知道楼主的非常具体的细节,所以,我就谈谈我的平台设计。
说实话,那个AddIns树实现起来确实太底层了,就像继承Object一样。所以,我一般都是做一些简单一点的(工作不需要特复杂的)。
我的主程序一般是有界面的。就像visual ide一样,有工作区,有菜单,有工具栏,当然还有其它一些东东。
主程序启动时,会去一个专门存放插件的文件夹里寻找已有的插件,找到之后,按规则将插件显示成菜单,或工具栏什么的,这里使用反射机制。当然,你也可以在需要某个插件时再加载也行。

加载完成之后,就是插件与主程序之间的通讯(这是主要的,由于插件的开发可能是第三方的,第四方的,甚至第N方的开发人员开发,所以,一般情况下,极少考虑插件之间的通讯,除非在自己以前开发的插件的基础上再开发插件),因为我们一个专门的工作区,所以,我们的通讯协议里面,有专门的接口,可以得到工作区的数据,你可以根据具体情况来决定使用函数,文本,XML,甚至数据库来交换数据。

最后,需要注意插件的注销,这也是很重要的一点。插件有可能在主程序还没关闭之前就已经因为需要而注稍了,资源的释放都是要考虑的。不过,如果你的插件如果设计的好的话,可以让插件退出时自动释放资源的。

.net下的插件简单一点,大概也就这些了,具体也没什么好谈的了。希望楼主多动动手。这种事情,你一做就什么都明白了。
2004-04-01 17:04 | pantian [未注册用户]

#18楼    回复  引用    

TO hBifTs:

还是忍不住再说一句:)

那本书估计你没看过吧,什么时候有空去买一本看看,你大概就知道“没编过程序的人”看那本书的目的了。

因为那个软件本来就是一个IDE,可以编辑,可以编译。而且是一个开源软件,还据说比VISUAL的C#编译得还要好。所以,“没编过程序的人”也去看看热闹,看看别人的编译器是怎么写出来的,跟MS的有什么不同?
先用段时间,感觉还不错。再看了源码,可惜太过于复杂,偶们这种“没编过程序的人”看起来有点吃力。最后没办法了,刚好又出一本配套的书,于是买回来,看看是不是可以多理解一点别人的想法。

之于那个AddIns树,只是其中一小部分而已。在那本书里,也就花了一章大概说了一下而已。不过,对于偶们来说也是精华了。

唉,今天打字真多,不过开心,有人陪着吵吵也不错。
2004-04-01 17:21 | pantian [未注册用户]

#19楼    回复  引用  查看    

@pantian
唉,放心好了,偶是不会去买的.买了浪费钱啊,偶是穷人,只能买精华书啊.....

Zezeze... "偶们这种“没编过程序的人”看起来有点吃力" 前段时间刚好翻过一本书《C#软件项目开发全程剖析--全面透析SharpDevelop软件的开发内幕》,清华大学出版的


这样子都能翻译书?? 清华出版社早就不行了的..
btw,偶同学去看还写过一本书呢,也是清华出版社出了呢..哼...
2004-04-01 17:34 | hBifTs      

#20楼    回复  引用    

哈哈哈
你们吵得差不多了吧,我也已经实现了一个简单的插件系统,不过其功能比起#Develop的那个还是差了很多 :(

不行就借用#Develop那个插件系统了。

BTW:你们吵得开心,我看得也开心,呵呵
2004-04-01 18:01 | muddle [未注册用户]

#21楼    回复  引用    

TO hBifTs:

你又理解错了。呵呵,我只是翻过那本书,就是买回来随便看了看。因为在几乎没有任何文档的情况下,看源码有点吃力,所以,想找点相关的资料看看而已。不过,那本书确实翻译得还不错,至少让偶们这种“没编过程序的人”看起来爽了许多。

不是我翻译的哦,不要搞错了,我的水平如果有那么好,早就写编译系统去了。还用得着窝在角落里看示波器?切!
2004-04-02 09:29 | pantian [未注册用户]

#22楼    回复  引用    

谁比谁强? 这种争论有意义吗, 唉...... , 还是有时间看看代码, 解决问题得好
2004-05-23 23:05 | wheel [未注册用户]

#23楼    回复  引用    

to pantian 
暂时提几个问题
对于一个插件来说
比如说,可能是最简单的,做一个lex的语法highlighting
那么很简单的
对于你的vs.net来说,需要注册一个关联,也就是说,在双击lex文件后就能自动调用这个插件

对于用户来说,至少这时候应该增添菜单,提供诸如scan,parsing,generator这样的功能

然后,至少还应该有一个preference面板,让用户可以自由选择字体,颜色等等其他的最基本的信息

然后在你的编辑器内,至少还应该有一个插件定义的上下文菜单

你可能还要提供其他视图,例如outline之类的

当然,还有最基本的,用户改变输入,highlighting也要改变,意味着,你必须增添Document和View的事件listener

接下来也是必不可少的,用户输入错误的话,有权知道自己哪里错了,那至少还应该开放一个信息视图,让插件能定义错误信息

想必这些是最最基本的,试想是否能在一个通讯协议中大而化之?

试想,可能插件需要实现一个数据库浏览器,需要一系列的Tree,Table,可能还需要一个SQL执行器,但是我不一定需要编辑器
我可能在数据列表中修改数据,然后希望马上反映到数据库中,怎么去和插件通信?(在这个例子中,即使旁边的视图那也应该是MVC结构,每一层都应该开放接口)

或者说,我希望在C#里面提供一系列简便功能,例如自动在每个文件追加版本信息,格式化文本,甚至refactor
how to?




总结来说,并不在于写出什么,而是在于写的有没有价值,如果未来为了某一个功能的追加不得不推翻原来的架构,也就是说,没有充分考虑到未来的扩展性,稳固程度,那并没有什么意义

还有,站在.net上固然不错,不过我想你失去了eyes wide open的机会

我建议你去看看eclipse的架构,一个从core到view都是可配置的插件的架构,一个不会让core崩溃的架构,一个开放第三方插件的架构
2004-06-11 00:28 | allen [未注册用户]

#24楼    回复  引用    

我来说说吧,其实你们说的都有道理,但是插件本质很简单,就是反射,然后就是接口的通讯机制。我觉得大家说得极端,vs ide的插件也不是深不可测,说到底还是反射,只是在上面写了很多的功能而以,不要被诸多的现象迷失了眼睛。
我设计的一个插件如下:
1:在主程序的config中定义插件的描述。然后从主程序中通过反射加载插件。
2:所有的插件都从一个接口继承,我们定义这个接口为IPlugin,里面有一个run方法。插件的代码都在这个方法中。主程序调用方法的时候就是调用这个方法。
3:接口中包含一个context上下文对象,当主程序调用插件的时候,就把自身的信息放入到context对象中,传递到插件中。
4:当然后来我们又改了很多,context这个上下文也加了越来越多的属性。其实插件已开始就要设计好。我们是边做边加。
5:主程序应该是个主要的模块,而不是仅作为插件的宿主,那样太极端。
2004-11-09 15:22 | Ocean [未注册用户]

#25楼    回复  引用    

:pantian
偶很好奇哦, #Develope里,写编译器了吗??真的假的,我怎么没
看到,如果有编译器,那应该可以 DEBUG 呀,我怎么没看到,哈哈,
你真的看过#Develope??源码 ??哪部分,Plug In ,Core??Form Designer??......
说实话,从你的言论,真的感觉你没写过程序,不过还是很佩服,没写
过程序,还这么能说,而且低气十足 .人才呀,哈哈
2004-11-10 09:52 | byrybye [未注册用户]

#26楼    回复  引用    

哈哈哈。。其实我觉得pantian蛮可爱的。。。。
想不到讨论问题还这么有趣。。。^^
2004-11-24 13:39 | 石沉大海 [未注册用户]

#27楼    回复  引用    

@pantian
sharpDevelop 没有编译器,而且现在的IDE做的还不如VS,这个是事实。

不过SharpDevelop的插件系统做的确实不错,偶不懂JAVA,因此只好看 SharpDevelop 的代码了。研究它的插件系统,有点心得,在此:
blog.csdn.net/passos
www.cnblogs.com/passos

各位有什么意见,可以一起研究一下。
BTW,其实我还是比较欣赏 eclipse。
2004-11-24 21:41 | 古月春秋 [未注册用户]

#28楼    回复  引用    

晕,不小心来了这儿,看了半天回复,原来就是两位大侠在吵...........,太寒了.其实插件本身并没有什么可吵的,无非是一个可以动态添加的功能模块罢了,其实真正难的是怎样设计插件系统,为无法预见到的插件提供功能强大的接口(也就是所谓的context),让插件能do anything,这才是难点
2004-12-13 22:31 | deadnight [未注册用户]

#29楼    回复  引用    

其实插件只是个概念形的东西,翻译的不同,理解的不同,都有可能产生不同的思想,说它是.dll也可以(我就是这样理解的),说它是别的也可以,只要能做出来,程序没有问题,老板看的满意,工资有发,就什么都OK了(说不定老板还不会程编).
2005-03-21 14:23 | 过客 [未注册用户]

#30楼    回复  引用    

哪位给个VC插件系统的例子?谢谢!ayee520@gmail.com
2006-03-13 20:49 | ayee [未注册用户]

#31楼    回复  引用    

Eclipse就是一个很好的插件体系,可以看一下OSGI规范,Eclipse就是根据这个规范实现得到插件体系

#32楼    回复  引用    

作研究和做工程差别是很大的

作研究,总想着完美,技术最高!
做工程,总想着交差,效率最高!

如果不是在同一层面上,争论没有多大的意思~~
2007-01-20 15:06 | wwwspider [未注册用户]

#33楼    回复  引用    

两位讨论的真好。别看有斗嘴,但还都大量,点到为止。
佩服佩服!

不过争论的东西对于我来讲让我理解了更多。

说一下,“翻”的书,我正在认真的读,刚好前天买了,太棒了的一本书。
两方面:一个是插件机制,一个国际化支持。这两方面都讲的太好了。
2007-02-11 21:07 | porener [未注册用户]

#34楼    回复  引用    

都是不知所谓
2007-05-24 02:24 | lyl [未注册用户]

#35楼    回复  引用    

猛然踩到这里,发现真的是不知所谓!
现在的小年轻就知道反射了么?
不要抱着微软的大腿,跟着人家的编译器走。
你是在做软件么?你是在做csharp。
你知道什么叫做kernel?
呵呵,操作系统的底层机制你明白多少?
从基于实模式的中断向量表机制,到基于保护模式的系统服务描述符表,再到所谓的二进制对象模型,com或者corba的底层,告诉你,这些设计思想都是类似的用到了同一模式的东西,这个东西就是你们讨论的插件的基础
2007-05-24 02:28 | lyl [未注册用户]

#36楼    回复  引用    

哪有MYIE2 源代码下载
2008-03-25 14:23 | yumeng [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-03-31 13:55 编辑过
成果网帮您增加网站收入


相关链接: