參見:Fbt2008的大作 SharpDevelop源碼分析筆記(一)
來源文件 <http://www.cnblogs.com/fbt2008/archive/2005/08/02/205785.aspx?Pending=true>
在Fbt2008的大作中描述了SharpDevelop其Runtime的啟動過程,我把其中GUI啟動補充一下。
其中寫到如下系統代碼啟動片斷
系統代碼:
//這段代碼就是程式啟動時載入前台外掛程式了,/Workspace/Autostart是系統自動運行命令的擴充點路徑,定義在這個路徑下的外掛程式會在系統啟動的時候自動運行。在這裡,通過外掛程式樹初始化建立處於這個路徑下的Command(命令),並逐一執行。BuildChildItems方法的功能是建立這個擴充點下的Command列表
commands = AddInTreeSingleton.AddInTree.GetTreeNode("/Workspace/Autostart").BuildChildItems(null);
for (int i = 0; i < commands.Count - 1; ++i)
{
((ICommand)commands[i]).Run();
}
}
這段代碼會載入如下資訊清單檔,並根據此資訊清單檔中的ClassId載入運行
外掛程式清單之一(SharpDevelopCore.addin檔案)
片斷
<Extension path = "/Workspace/Autostart">
<Class id = "InitializeWorkbenchCommand"
class = "ICSharpCode.SharpDevelop.Commands.InitializeWorkbenchCommand"/>
<Class id = "StartCodeCompletionWizard"
class = "ICSharpCode.SharpDevelop.Commands.StartCodeCompletionWizard"/>
<Class id = "StartParserServiceThread"
class = "ICSharpCode.SharpDevelop.Commands.StartParserServiceThread"/>
<!-- #assembly preload -->
<Class id = "StartSharpAssemblyPreloadThread"
class = "ICSharpCode.SharpDevelop.Commands.StartSharpAssemblyPreloadThread"/>
<Class id = "StartWorkbenchCommand"
class = "ICSharpCode.SharpDevelop.Commands.StartWorkbenchCommand"/>
</Extension>
大家注意了:"/Workspace/Autostart" 就是上面代碼根據此描述將這一段的描述中的Class的執行個體載入,然後執行他們的方法(這些Class都繼承了Icommand)
這些類都在檔案AutostartCommands.cs中
而GUI的主要啟動過程就在InitializeWorkbenchCommand類上,如下:
public class InitializeWorkbenchCommand : AbstractCommand
{
const string workbenchMemento = "SharpDevelop.Workbench.WorkbenchMemento";
public override void Run()
{
//產生一個預設的Workbench
DefaultWorkbench w = new DefaultWorkbench();
WorkbenchSingleton.Workbench = w;
//啟動Workbench
w.InitializeWorkspace();
PropertyService propertyService = (PropertyService)ServiceManager.Services.GetService(typeof(PropertyService));
//將上一次使用的Workbench布局等資訊重新載入
w.SetMemento((IXmlConvertable)propertyService.GetProperty(workbenchMemento, new WorkbenchMemento()));
//重新整理Workbench,根據布局資訊,開啟啟動時需要展現的Pad和Editor
w.UpdatePadContents(null, null);
WorkbenchSingleton.CreateWorkspace();
}
}
DefaultWorkbench 的 InitializeWorkspace代碼如下
public void InitializeWorkspace()
{
Menu = null;
//狀態條
statusBarManager.Control.Dock = DockStyle.Bottom;
ActiveWorkbenchWindowChanged += new EventHandler(UpdateMenu);
MenuComplete += new EventHandler(SetStandardStatusBar);
SetStandardStatusBar(null, null);
IProjectService projectService = (IProjectService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IProjectService));
IFileService fileService = (IFileService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IFileService));
projectService.CurrentProjectChanged += new ProjectEventHandler(SetProjectTitle);
projectService.CombineOpened
+= new CombineEventHandler(CombineOpened);
fileService.FileRemoved += new FileEventHandler(CheckRemovedFile);
fileService.FileRenamed += new FileEventHandler(CheckRenamedFile);
fileService.FileRemoved += new FileEventHandler(fileService.RecentOpen.FileRemoved);
fileService.FileRenamed += new FileEventHandler(fileService.RecentOpen.FileRenamed);
//
TopMenu.Selected += new CommandHandler(OnTopMenuSelected);
//
TopMenu.Deselected += new CommandHandler(OnTopMenuDeselected);
//建立菜單
CreateMainMenu();
//建立工具條
CreateToolBars();
}
w.SetMemento(...);
w.UpdatePadContents(null, null);
這兩句稍稍複雜些,在這裡就不分析了。
注意:有關Workbench,pad和Editor等概念基本可以參照Eclipse文檔。有一些細小差別,例如Pad在Eclipse中叫View,Workench在SharpDevelop僅存在一個WorkbenchWindow.而在SharpDevelop有多個等等。