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