SharpDevelop源代码分析笔记

本文详细分析了SharpDevelop的插件系统,从AddInTree的构建到插件实例的获取,阐述了CoreStartup如何启动核心服务和运行初始化。此外,介绍了Service如MenuService、LoggingService的功能,以及ICSharpCode.SharpDevelop工程在整体架构中的作用。文中还探讨了应用的初始化过程,包括Workbench的创建和主界面的设置,以及如何使用Core服务进行应用程序的启动和配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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.MainForm)
   WorkbenchSingleton是单例模式的,包含DefaultWorkbench,是主界面

7.使用Core的例子

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 主函数:

   // The LoggingService is a small wrapper around log4net.
   // Our application contains a .config file telling log4net to write
   // to System.Diagnostics.Trace.
   LoggingService.Info("Application start");
   
   // Get a reference to the entry assembly (Startup.exe)
   Assembly exe = typeof(Program).Assembly;
   
   // Set the root path of our application. ICSharpCode.Core looks for some other
   // paths relative to the application root:
   // "data/resources" for language resources, "data/options" for default options
   FileUtility.ApplicationRootPath = Path.GetDirectoryName(exe.Location);
   
   LoggingService.Info

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值