教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

SharpDevelop插件系统完全分析

来源:网络收集 时间:2026-07-30
导读: SharpDevelop插件系统完全分析 http://blog.csdn.net/tangxuehua/archive/2005/10/01/493460.aspx搜唐雪华(tangxuehua)这个人 前言 2005年2月,我申报了一个学校组织的大学生SRTP项目,项目的题目是数据结构动画演示系统。当初在做项目之前,我无意中买了

SharpDevelop插件系统完全分析

http://blog.csdn.net/tangxuehua/archive/2005/10/01/493460.aspx搜唐雪华(tangxuehua)这个人 前言

2005年2月,我申报了一个学校组织的大学生SRTP项目,项目的题目是数据结构动画演示系统。当初在做项目之前,我无意中买了一本书,书名为《SharpDevelop软件项目开发全程剖析》。买这本书的目的显而易见,就是想看看人家老外是怎么做项目的。谁知买来一看,基本看不懂。随后,我在书里介绍的网站上http://www.icsharpcode.net下载了其项目的源代码。解压一看,更是傻掉了,搞了半天还不知道整个程序的主窗体是怎么显示的,是什么时候显示的。尽管这样,我还是没有气馁,因为我对它整个程序有很多感兴趣的东西:如可拖动的面板,可高亮度显示的文本,专业的菜单,那些有着良好定义的XML属性配置文件,等等。所以我就开始认真学习它的源代码。但是在研究的过程中发现它的工程文件只能用自己才能打开,而且发现SharpDevelop不能调试,使我分析源代码很不方便。所以,我先从全局分析整个解决方案,最后终于把那些不熟悉项目全部都转换成了VS中能运行的项目,而且最后整个程序能够在VS中运行和调试。那是,我为了和大家一起分享我的成果,特地把SharpDevelop的VS版本放在了互联网上,希望能对那些也想学习其源代码的朋友有所帮助。从那之后,我就开始研究其插件(Add In)系统。现在,我已经对其中的三个项目很熟悉,并且将它们完全整合到了我的项目中去,在研究这三个项目的过程中,我对其源代码文件的目录结构按照我的理解作了调整,修改和优化了其中的部分源代码,另外为了帮助理解,我添加了很多的注视。好了,讲了很多的废话,下面我开始分析其源代码:

1. 一些基本的概念:

AddInTree(插件树)

SharpDevelop中的所有东西都是被挂接在一棵插件树中的。这棵插件树是在程序运行时动态创建的,树的所有路径(这些路径是逻辑路径)都定义在插件文件中。如果某个插件文件中有以下片断:

class = \

class = \

class = \

extensions = \

resource = \

extensions = \

resource = \

则说明插件树的根节点下有一个子节点Workspace,Workspace下又有Services和Icons两个子节点,Services下又有FileUtilityService,MessageService,TaskService三个子节点。。。

AddIn(插件)

SharpDevelop中的一个插件由一个插件文件(以addin为后缀名)定义,该插件文件中定义了很多的插件树的路径(由Extension节点指定)。另外,该插件文件中还指定了运行该插件所需的所有的程序集。如果一个插件文件中有一个节点如下:

则说明,运行该插件需要一个名为Base.dll的程序集,该程序集的路径为一个相对目录(相对于当前插件文件的目录)。

Codon(代码子)

按照我的理解,代码子是一个对象创建器。被创建的对象具有某个具体的功能。如ServiceCodon(服务代码子,这个名字在SharpDevelop中叫作ClassCodon)通过其BuildItem方法可以创建一个服务对象,该服务对象可为程序提供某种具体的服务;PadCodon(面板代码子)通过其BuildItem方法可以创建一个面板对象,该面板对象可能是一个属性面板,文件浏览面板,等等。

class = \

extensions = \

resource = \

上面的两个XML元素代表两个代码子节点,这里我把他们叫做代码子节点是因为它们在XML文件中以元素(节点)出现,而在程序运行时这两个元素会被初始化成两个代码子对象。像上面这样,如果某个代码子节点有Class属性,则说明该代码子对象可以根据这个属性值创建一个对象,如果没有提供Class属性,则该代码子对象直接将自己返回。这里,值得一提的是,所有的Class属性所指定的类必须在上面介绍的节点中指定的某个程序集中定义过。这一点是我对SharpDevelop源代码的修改,因为在SharpDevelop中,如果Class定义的某个类在当前插件文件的节点中没有指定,程序会将当前未初始化好的代码子对象先保存起来,待当前插件初始化完成之后,再尝试从后面的插件文件中所指定的程序集中创建该代码子。

AddInTreeNode(插件树节点)

既然整个程序的结构是一棵插件树,就肯定有很多插件树节点。那么插件树节点有什么功能呢?其实,在整棵插件树中并不是所有的节点都有功能,有些节点没有任何功能,只是起到构成路径的作用;而有些节点如上面所讲的FileUtilityService,MessageService,TaskService三个子节点才有具体的功能,因为它们在整棵树中不仅代表一个节点,而且还代表一个代码子。实际上,在创建整棵树的过程中,如果为当前节点指定了一个代码子对象,则该树节点就具有具体的功能,如果没有指定,则该节点只是起到构成路径的作用。

2. 整个插件系统的创建过程:

为了方便分析,我用我自己的项目代码来给大家分析,各位看官不必担心,因为我只是稍微修改了其插件系统,大部分代码没有变化。所以在阅读下面的内容之前建议大家去我的个人网站(http://www.netfocus.cn)下载程序源代码“数据结构动画演示系统“,以方便你理解本文。

和SharpDevelop一样,程序的入口点在\\src\\StartUp\\DataStructureMain.cs的Main函数中。至于前面语句我在这里就不在解释了,我已经标了注视。下面从AddInTreeSingleton.CreateAddInTree()方法开始分析。首先,从AddInTreeSingleton这个类的名在来看,这个类应该采用Singleton设计模式。下面转入CreateAddInTree方法,

…… 此处隐藏:877字,全部文档内容请下载后查看。喜欢就下载吧 ……
SharpDevelop插件系统完全分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/443140.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)