最近开始学习.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 等等。
写了两个小时了,休息一下。且听下回分解吧。
相关推荐
Xilinx ZYNQ 7000学习笔记二(FSBL代码分析启动-汇编代码)
Xilinx ZYNQ 7000学习笔记
SharpDevelop的安装与配置
保姆级SharpDevelop安装配置教程。
PnP 单目相机位姿估计(二):solvePnP利用二维码求解相机世界坐标
前言 原理简介 输入参数准备 1 objectPoints特征点世界坐标 2 imagePoints特征点在摄像头下的像素点坐标 3cameraMatrixdistCoeffs内参矩阵和畸变矩阵 相机世界坐标的求解 1求世界坐标中的点在相机坐标系下的坐标 2求相机在世界坐标中的坐标 3效果求解相机在世界坐标系下的坐标点 4求解代码1.前言 很多时候,当我们利用单目相机获取图像时,往往只能获取图像中
【C#】SharpDevelop使用教程,C#写windows下第一个窗口程序,简单粗暴,初学者进,全图文,一看就明白
VS不说,功能强大,但是挺大。 下面,来说说轻量级IDE来写一个简单的windows程序。 首先,下载,不说了,最新版本5.x需要.net4.x支持,需要先安装.net framework 4.x框架。(版本控制此文不做其他说明,自己多做做功课) 下载好了安装。都不说。装好了双击打开。进入。。。 一进来是这样,然后第一步切换语言, TOOLS-->option 正式开始
【人脸识别/轻量级模型】MobileFaceNet:适用于人脸识别的轻量级网络模型(文末附pytorch代码)
MobileFaceNet:用于人脸识别的轻量级网络模型
SXU—软件测试方法和技术-朱少民-第四部分 软件测试流程和规范-附考点
软件测试方法和技术-朱少民-第四章 软件测试流程和规范—这本书最后一部分的考点整理,考点分析
SharpDevelop 开发WPF教程
最近写项目需要用到windows GUI开发,想到的第一个框架是QT。可是对方需要软件在XP运行,QT5.X写的桌面程序无法直接在XP主机运行,还需要一些额外的包装和操作。加上看QT教程,感觉从配置和教程都略微复杂,就放弃了,转用别人介绍的WPF。 一.WPF框架介绍: WFP的全称是Windows Presentation Foundation,你可以把它翻译成“微软呈现基础”。是微软推出的基
基于STM32L4XX、HAL库的ESP32-C3-WROOM-02-N4 WIFI模块驱动程序设计
支持802.11 b/g/n Wi-Fi (2.4GHz)RISC-V 32位单核处理器,主频高达160MHz。封装尺寸:18mm × 20mm × 3mm。工作温度范围:-40°C ~ 85°C。// 设置WiFi模式为STA。支持Bluetooth 5 (LE)// 发送AT指令测试通信。// 检查响应是否包含OK。内置4MB SPI Flash。// 连接TCP服务器。// 发送HTTP请求。// 初始化UART。// 建立TCP连接。低功耗设计,适合IoT应用。
【亲测免费】 探索SharpDevelop:一个强大的开源IDE平台
探索SharpDevelop:一个强大的开源IDE平台 是一个专为.NET Framework和.NET Core设计的开放源代码集成开发环境(IDE),它由IC#Code团队维护,提供了一整套用于创建、测试和调试C#、VB.NET以及其他.NET语言的应用程序工具。 项目简介 SharpDevelop的核心目标是为开发者提供一个自由、灵活且易于扩展的工作台,与商业IDE相比,它不仅具备类似的功能...
大模型——Dify:知识库与外部知识库
摘要 Dify的知识库功能为开发者提供了动态知识管理解决方案,超越了大模型静态预训练数据的限制。知识库支持多种文档格式(如txt、pdf、docx等),通过文档分段、索引设置和检索优化机制提升LLM的响应准确性。系统提供高质量和经济两种索引模式,前者采用向量化检索技术,后者使用关键词匹配以降低成本。知识库支持元数据管理,包括自动生成的内置元数据和用户自定义元数据,便于内容分类和检索。对于高级需求,Dify还支持连接外部知识库,通过API实现跨平台数据共享和检索优化,满足企业级知识管理需求。
使用Open3D进行RGB-D图像点云处理
在本文中,我们将使用Open3D来处理RGB-D图像,提取点云并进行一些基本的操作。总结起来,本文介绍了如何使用Open3D库处理RGB-D图像并提取点云。我们展示了如何读取RGB-D图像,创建RGB-D图像和点云,并显示点云。除了显示点云,Open3D还提供了许多其他功能,如点云滤波、点云配准、表面重建等。在创建RGB-D图像时,我们需要指定深度图像的缩放因子和截断值,以及是否将RGB图像转换为强度图像。希望本文能够帮助您入门Open3D,并在处理RGB-D图像和点云数据时提供一些指导。
SharpDevelop安装与配置
SharpDevelop是一个用于C#开发的IDE,相比于VisualStudio的臃肿,SharpDevelop的小巧能让人专注于C#开发。 SharpDevelop官方下载地址:http://www.icsharpcode.net/OpenSource/SD/Download/ 注意:最新的4.4和5.1不支持XP,如果想在XP上使用,建议下载3.2版 安装SharpDevelop之前必
prplOS适配USB LAN网卡
本文介绍了将USB LAN网卡(如rndis0)适配到prplOS的LAN管理流程。
SharpDevelop
不得不佩服老外的创造力。很早以前就久闻SharpDevelop的大名,终于抽空一睹庐山真面目!这不简直就是IDE中的Firefox吗?!全插件式开源IDE!牛B。当然,SharpDevelop不如visualstudio,那是Microsoft的重量级产品之一了。不过还好了,没有VS那么大,有时候携带安装还是挺方便的。
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
efm32 入门.pdf
本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。
SharpDevelop的AddInTree View 插件
自从SharpDevelop 源码分析的系列文章发出来之后,很多朋友给了不错的评价,在这里先感谢各位朋友的鼓励。另外,评论中有位朋友想看看我在文章中提到的AddInTreeView插件,其实这个是个很简单的小东西,因此单独发在这里了。(好像没有找到那里能上传文件,因此直接贴代码了)AddinTreeViewCommand.cs/**//* * Created by SharpDevelop
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
sharpdevelop简介
sharpdevelop简介
sharpdevelop官方下载地址
sharpdevelop官方下载地址http://www.icsharpcode.net/OpenSource/SD/Download/
sharpdevelop mysql_使用sharpdevelop连接MySQL
MySQL版本为:5.0.88;sharpdevelop版本3.1综合网上查找的信息,通过MySQL.DATA这个类来连接数据库,其特性和ODBC一样,其中的方法和属性也基本一致。首先去MySQL网页上下载5.0.9版本的Connector。安装好以后可以在/windows/assembly文件夹找到MySQL.DATA这个组件。这时候已经将这个组件注册到全局程序集中了,我们就可以在sharpde...
SharpDevelop代码分析
SharpDevelop代码分析作者:tupunco 日期:2004-12-28字体大小: 小 中 大SharpDevelop代码分析 (一、序+基本概念)序 最近开始学习.Net,遇到了一个比较不错的开源的IDE SharpDevelop。这个开发工具是使用C#开发的,比较吸引我的一点就是它是采用了和 Eclipse类似的插件技术来实现整个系统的。而这个插
C# IDE SharpDevelop的一些缺陷
趁早放弃SharpDevelop,别在它上面浪费时间!1.不支持64bit程序的调试。2.界面容易变花。3.不支持C# 6.0的新特性。比如不能用static声明静态类的引用。
[Dev-Boo]SharpDevelop修改快捷键
使用SharpDevelop开发boo很好用,项目组织,代码提示什么的.SharpDevelop是一款很好的open IDE,如果写一些简单的dotnet产品使用#Develop会很容易上手.#Develop对boo已经支持代码提示(快捷键:Ctrl+Space),可惜跟中文系统的输入法切换冲突了.我也为这个烦恼了一阵,虽说可以用,但不能主动调出提示也很不方便,我曾经尝试修改#Develop的源码
sharpdevelop mysql_SharpDevelop + MySql | 学步园
Vista + VS 2005 + Oracle 10g开发环境,内存使用1.5G,系统速度终于让人受不了了。还没有用VS 2005调试,因为NUnit + log4net可以方便的测试和debug。code generator做一个MySql生成脚本,建立MySql数据库,把开发环境换成SharpDevelop + MySql,内存使用700M左右,总算好多了。MySql内存4M不到,Sharp...
SharpDevelop源代码分析笔记
1.如何创建插件树 CoreStartup的RunInitialization调用AddInTree.Load方法,加载Addins,并执行/Workspace/Autostart节点下的Addin的Command 加载Addins时,XmlReader解析.addin文件,调用了AddIn.Load,AddIn.SetupAddIn,根据xml元素是Runtime,Include,Path,M
关于SharpDevelop
前一段时间研究了一下SharpDevelop,不知道这里有没有同道中人。 转载于:https://www.cnblogs.com/levi/archive/2004/09/29/47753.html
SharpDevelop with Silverlight
Error creating project :The imported project “C:\Program Files (x86)\MSBuild\Microsoft\Silverlight\v4.0\Microsoft.Silverlight.CSharp.targets” was not found
4247



被折叠的 条评论
为什么被折叠?



