`
cuijiemin
  • 浏览: 255627 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SharpDevelop代码分析 (一、序+基本概念)

阅读更多


最近开始学习.Net,遇到了一个比较不错的开源的IDE SharpDevelop。这个开发工具是使用C#开发的,比较吸引我的一点就是它是采用了和Eclipse类似的插件技术来实现整个系统的。而这个插件系统是我最感兴趣的地方,因此开始了一段代码的研究。在本篇之后,我会陆续把我研究的心得写下来。由于是在网吧上网,有诸多不便,因此可能会拖比较长的时间。



一、基本概念

首先,我们先来对 SharpDevelop 有一个比较感性的认识。你可以从这里下载到它的可执行程序和代码包http://www.icsharpcode.com/ ,安装的废话就不说了,先运行一下看看。感觉跟VS很像吧?不过目前的版本是1.0.0.1550,还有很多地方需要完善。关于代码和系统结构,SharpDevelop的三个作者写了一本书,各位看官可以参考一下,不过我看过之后还是有很多地方不太理解。

然后,让我来解释一下什么叫插件以及为什么要使用插件系统。我们以往的系统,开发人员编译发布之后,系统就不允许进行更改和扩充了,如果要进行某个功能的扩充,则必须要修改代码重新编译发布。这就给我们带来了比较大的不方便。解决的方法有很多,例如提供配置等等方法。在解决方案之中,插件是一个比较好的解决方法。大家一定知道PhotoShop、WinAmp吧,他们都有“插件”的概念,允许其他开发人员根据系统预定的接口编写扩展功能(例如PhotoShop中各种各样的滤镜)。所谓的插件就是系统的扩展功能模块,这个模块是以一个独立文件的形式出现的,与系统是相对独立。在系统设计期间并不知道插件的具体功能,仅仅是在系统中为插件留下预定的接口,系统启动的时候根据插件的配置寻找插件,根据预定的接口把插件挂接到系统中。

这样的方式带来什么样的优点呢?首先是系统的扩展性大大的增强了,如果我们在系统发布后需要对系统进行扩充,不必重新编译,只需要修改插件就可以了。其次有利与团队开发,各个功能模块由于是以插件的形式表现在系统中,系统的每日构造就很简单了,不会因为某个模块的错误而导致整个系统的BUILD失败。失败的仅仅是一个插件而已。

PhotoShop和Winamp的插件系统是比较简单的,他们首先实现了一个基本的系统,然后在这个系统的基础上挂接其他扩展的功能插件。而SharpDevelop的插件系统更加强大,它的整个系统的基础就仅仅是一个插件管理系统,而你看到的所有的界面、功能统统都是以插件的形式挂入的。在这样的一个插件系统下,我们可以不修改基本系统,仅仅使用插件就构造出各种各样不同的系统。

现在让我们来看看它的插件系统。进入到SharpDevelop的安装目录中,在Bin目录下的SharpDevelop.exe 和 SharpDevelop.Core.dll是这个系统的基本的插件系统。在Addins目录下有两个后缀是addin的文件,其中一个 SharpDevelopCore.addin 就是它的核心插件的定义(配置)文件,里面定义的各个功能模块存在于Bin\Sharpdevelop.Base.dll 文件中,另外还有很多其他的插件定义在Addins目录下的addin文件中。

分析SharpDevelop的代码,首先要弄清楚几个基本的概念,这些概念和我以前的预想有一些区别,我深入了代码之后才发现我的困惑所在。

1、AddInTree插件树
SharpDevelop 中的插件被组织成一棵插件树结构,树的结构是通过 Extension(扩展点)中定义的Path(路径)来定义的,类似一个文件系统的目录结构。系统中的每一个插件都在配置文件中指定了 Extension,通过Extension中指定的 Path 挂到这棵插件树上。在系统中可以通过 AddTreeSingleton对象来访问各个插件,以实现插件之间的互动。

2、AddIn 插件
在 SharpDevelop 的概念中,插件是包含多个功能模块的集合(而不是我过去认为的一个功能模块)。在文件的表现形式上是一个addin配置文件,在系统中对应 AddIn 类。

3、Extension 扩展点
SharpDevelop中的每一个插件都会被挂到 AddInTree(插件树) 中,而具体挂接到这个插件树的哪个位置,则是由插件的 Extension 对象中的 Path指定的。在addin 配置文件中,对应于 <Extension> 。例如下面这个功能模块的配置
<Extension path = "/SharpDevelop/Workbench/Ambiences">
<Class id = ".NET" class = "ICSharpCode.SharpDevelop.Services.NetAmbience"/>
</Extension>
指定了扩展点路径为 /SharpDevelop/Workbench/Ambiences ,也就是在插件树中的位置。

4、Codon
这个是一个比较不好理解的东西,在 SharpDevelop 的三个作者写的书的中译版中被翻译为代码子,真是个糟糕的翻译,可以跟Handle(句柄)有一拼了。词典中还有一个翻译叫“基码”,我觉得这个也不算好,不过还稍微有那么一点意思。
根据我对代码的理解,Codon 描述(包装)一个功能模块,一个功能模块对应一个实现了具体功能的 Command 类。为了方便访问各个插件中的功能模块, Codon 给各种功能定义了基本的属性,分别是 ID (功能模块的标识),Name (功能模块的类型。别误会,这个Name 是addin文件定义中Codon的XML结点的名称,ID才是真正的名称),其中Name可能是Class(类)、MenuItem(菜单项)、Pad(面板)等等。根据具体的功能模块,可以继承Codon定义其他的一些属性,SharpDevelop中就定义了 ClassCodon、MenuCodon、PadCodon等等。
在addin定义文件中,Codon对应于 <Extension> 标签下的内容。 例如下面这个定义
<Extension path = "/SharpDevelop/Workbench/Ambiences">
<Class id = ".NET" class = "ICSharpCode.SharpDevelop.Services.NetAmbience"/>
</Extension>

<Extension ...> 内部定义了一个Codon,<Class ...> 表示该Codon是一个 Class(类),接着定义了该Codon的ID和具体实现该Codon的类名ICSharpCode.SharpDevelop.Services.NetAmbience。运行期间将通过反射来找到对应的类并创建出来,这一点也是我们无法在以前的语言中实现的。

再例如这一个定义
<Extension path = "/SharpDevelop/Views/ProjectBrowser/ContextMenu/CombineBrowserNode">
<MenuItem id = "Compile"
label = "${res:XML.MainMenu.RunMenu.Compile}"
class = "ICSharpCode.SharpDevelop.Commands.Compile"/>
<MenuItem id = "CompileAll"
label = "${res:XML.MainMenu.RunMenu.CompileAll}"
class = "ICSharpCode.SharpDevelop.Commands.CompileAll"/>
<MenuItem id = "CombineBuildGroupSeparator" label = "-" />
....
</Extension>
这个扩展点中定义了三个菜单项,以及各个菜单项的名字、标签和实现的类名。这里的Codon就对应于系统中的MenuCodon对象。

5、Command 命令
正如前文所述,Codon描述了一个功能模块,而每个功能模块都是一个 ICommand 的实现。最基本的 Command 是 AbstractCommand,根据Codon的不同对应了不同的 Command。例如 MenuCodon 对应 MenuCommand 等等。

6、Service 服务
插件系统中,有一些功能是整个系统都要使用的,例如文件访问、资源、消息等等。这些功能都作为插件系统的一个基本功能为整个系统提供服务,我们就叫“服务”好了。为了便于访问,这些服务都统一通过 ServiceManager 来管理。其实服务也是一种类型的插件,它们的扩展点路径在目录树中的 /Services 中。


理解了这几个基本的概念之后,就可以看看 SharpDevelop 的代码了。从 src\main\startup.cs 看起吧,之后是addin.cs、addinTree.cs等等。

写了两个小时了,休息一下。且听下回分解吧。

<!-- Search Google -->
Google 输入您的搜索字词 提交搜索表单
<!-- google_ad_client = "pub-7330597899926046"; google_ad_format = "350x30_sdo"; google_link_target = 2; google_color_bg = "ffffff"; google_color_link = "000000"; google_encoding = "GB2312"; //-->
<!-- Search Google --> <!-- google_ad_client = "pub-7330597899926046"; google_ad_slot = "8791774696"; google_ad_width = 468; google_ad_height = 60; //-->
分享到:
评论

相关推荐

    SharpDevelop代码分析

    SharpDevelop代码分析 感觉挺不错的一个文档,适合有经验C#高手学习。

    SharpDevelop源码分析汇总

    关于SharpDevelop源代码分析的资源汇总。

    sharpdevelop源码分析

    开源IDE sharpdevelop 的作者对该IDE架构的介绍

    SharpDevelop_inside_SharpDevelop_

    Dissecting a C# Application Inside SharpDevelop

    SharpDevelop开发教程+内核源码分析

    关于SharpDevelop的开发教程,以及内核源码分析文档。

    SharpDevelop_4.1 源代码

    SharpDevelop is a free IDE for C#, VB.NET and Boo projects on Microsoft's .NET platform.

    SharpDevelop v4.4.0 Build 9722

    SharpDevelop 是一个用于制作C#或者VB.NET的项目而设计的一个编辑器,同时,这个编辑器本身就是使用C#开发的,而且公开了全部源代码,因此这个工具本身也是学习C#以及软件开发规范的一个很好材料。 SharpDevelop 这...

    SharpDevelop+调试器

    SharpDevelop是一个C#的开发工具,安装简单,使用方便,可以在工具选项中设置为中文的IDE。用SharpDevelop编写的代码可以用调试器进行调试.(提醒:必须已经安装了.net框架,并正确配置环境变量)

    SharpDevelop 4.0

    SharpDevelop 是一个用于制作C#或者VB.NET的项目而设计的一个编辑器,同时,这个编辑器本身就是使用C#开发的,而且公开了全部源代码,因此这个工具本身也是学习C#以及软件开发规范的一个很好材料。 SharpDevelop 这...

    SharpDevelop开发教程一

    SharpDevelop开发教程(一).doc

    SharpDevelop_4.3.1

    SharpDevelop 是一个用于制作C#或者VB.NET的项目而设计的一个编辑器,同时,这个编辑器本身就是使用C#开发的,而且公开了全部源代码,因此这个工具本身也是学习C#以及软件开发规范的一个很好材料。 SharpDevelop 这...

    SharpDevelop_5.1.0.5134源代码

    SharpDevelop_5.1.0.5134_RC_Source.zip是SharpDevelop的源代码

    SharpDevelop自己动手创建应用程序界面设计器

    SharpDevelop浅析_5_Windows+Forms+Designer自己动手创建应用程序界面设计器

    sharpdevelop内核源码分析

    sharpdevelop内核源码分析 sharpdevelop内核源码分析

    SharpDevelop Reports 3.0.0.616 Source ,SharpDevelop analyze SharpPad_Ext

    SharpDevelop Reports 3.0.0.616 Source SharpDevelop analyze SharpPad_Ext

    C#开发软件 SharpDevelop

    C#开发软件 SharpDevelop C#开发软件 SharpDevelop C#开发软件 SharpDevelop C#开发软件 SharpDevelop

    SharpDevelop 4.2 32位

    SharpDevelop 是一个用于制作C#或者VB.NET的项目而设计的一个编辑器,同时,这个编辑器本身就是使用C#开发的,而且公开了全部源代码,因此这个工具本身也是学习C#以及软件开发规范的一个很好材料。 SharpDevelop 这...

    SharpDevelop_4.0.0.7070 中文版

    SharpDevelop 是一个用于制作C#或者VB.NET的项目而设计的一个编辑器,同时,这个编辑器本身就是使用C#开发的,而且公开了全部源代码,因此这个工具本身也是学习C#以及软件开发规范的一个很好材料。 SharpDevelop 这...

    .net 4.0的sharpdevelop4 IronPython ADDIN补丁

    .net 4.0的sharpdevelop4 IronPython ADDIN补丁。把补丁复制到sharpdevelop 4的Python Addin目录:C:\Program Files\SharpDevelop\4.4\AddIns\BackendBindings\PythonBinding\。也就是相应的补丁所在目录。无需注册...

    C#学习SharpDevelop源码.zip

    SharpDevelop 是一个用于制作C#或者VB.NET的项目而设计的一个编辑器,同时,这个编辑器本身就是使用C#开发的,而且公开了全部源代码,因此这个工具本身也是学习C#以及软件开发规范的一个很好材料。

Global site tag (gtag.js) - Google Analytics