SharpDevelop源代码分析笔记

 1.如何创建插件树
 CoreStartup的RunInitialization调用AddInTree.Load方法,加载Addins,并执行/Workspace/Autostart节点下的Addin的Command
 加载Addins时,XmlReader解析.addin文件,调用了AddIn.Load,AddIn.SetupAddIn,根据xml元素是Runtime,Include,Path,Manifest等,分别解析,填充到AddIn对象 例如Path,调用ExtensionPath.SetUp方法(递归),会解析并创建下层所有Codon对象,添加到ExtensionPath对象中。
 AddInTree.Load方法调用AddInTree.InsertAddIn方法添加每一个AddIn到插件树中:对AddIn中的每一个Path,首先创建AddInTreeNode,然后把之前解析存放在ExtensionPath中的Codon列表拷贝到AddInTreeNode对象,
 这样,整个插件数就创建起来了。

2.如何获得插件实例
 调用AddInTree.BuildItem(一个Codon)/BuildItems(AddInNode下所有Codon)方法。
 BuildItem方法首先分析出AddInTreeNode,创建出这个节点下的Codon对象,再根据Codon的id查找需要的插件实例。
 AddInTree.BuildItems -> AddInTreeNode.BuildChildItems(递归) -> Codon.BuildItem -> IDoozer.BuildItem
 实例化的Codon存放在什么地方?

3.Doozer,Codon,addin
 Doozer提供实例化Codon的方法,Codon与Doozer的关系相当于Object与Class的关系。SD中所有的资源包括Menu,Toolbar,Icon,String,Pad,Dialog等都可在.addin中描述,用对应的Doozer实例化。

4.Service
 提供功一些通用的操作,是static或Singleton的,它在各个addin之间起到的粘合的作用
 MenuService提供了从Addin树创建菜单的功能,
 ToolBarService提供了从Addin树创建工具栏的功能,
 LoggingService调用log4net记录日志
 FileUtility提供通用的文件操作
 PropertyService提供全局属性关系,包括属性的持久化
 ResourceService提供资源的管理
 MessageService显示消息给用户

5.ICSharpCode.SharpDevelop工程
 位于Main/Base目录,是应用程序的基础Addin,Core工程提供的组织插件的方法,SharpDevelop也只是在Core之上的一个插件。但它提供了一些基本的功能供其余插件使用。
 SharpDevelop提供了控制应用程序主窗口的代码,提供了主要功能的接口,例如:管理,撤销/重做,pad(可停靠的面板)

6.初始化过程
 [StartUp]->(SharpDevelopMain.cs).RunApplication
   创建并设置StartupSettings,SharpDevelopHost,WorkbenchSettings,调用SharpDevelopHost.RunWorkbench
   在SharpDevelopHost的构造函数中,调用CallHelper.InitSharpDevelopCore方法初始化Core(调用了Core工程中的CoreStartup的StartCoreServices和RunInitialization方法,创建Addin树)
 [SharpDevelop.Sda]->(SharpDevelopHost.cs).RunWorkbench
   创建新的AppDomain,让Workbench在这里面运行,为什么这么做?
 [SharpDevelop.Sda]->(CallHelper.cs).RunWorkbench
   决定是否创建新的线程,让workbench在新线程中运行
 [SharpDevelop.Sda]->(CallHelper.cs).RunWorkbenchInternal
   调用WorkbenchSingleton.InitializeWorkbench(),创建主界面DefaultWorkbench,调用DefaultWorkbench.InitializeWorkspace初始化主界面,初始化各种服务
   触发CallHelper的BeforeRunWorkbench事件;
   主界面退出后,触发CallHelper的WorkbenchClosed事件;
 [SharpDevelop]->(Commands/AutostartCommands.cs).Run
 Application.Run(WorkbenchSingleton.MainFor

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值