最BT的就是这里了,连个Application.Run()都没有——而全都是从AddIns读取。

 1从分析Main函数开始        [STAThread()]
 2从分析Main函数开始        public static void Main(string[] args)
 3        }

逐行分析如下:
18行之前是“每日提示”——splashScreen的现实与否,33行在最后一个命令(激活IDE主窗口)启动前关闭这个Form。
18行以后是关键:
ServiceManager这个单件,先初始化所有服务(包括Core中的4个核心服务,Base中的11个服务,其中Core中的服务调用是写死的,Base中调用的服务是动态加载SharpDevelop.Addin的节点"/Workspace/Services。

接着获取AddIn树结点"Workspace/Autostart"上所有Codons——BuildChildItems()方法,因为每个Codons都是一个命令,所以都有Run()方法作各自的事情。通过for循环依次执行这些命令。
其中,最后一个命令是"激活IDE主窗口",在确保所有Codons都正常运行时,才执行这个命令。在这个命令中,才可以看到Application.Run()这样的语句。

最后,ServiceManager这个单件卸载所有服务。


补注:另一个BT的地方是SharpDevelop中没有把编译dll目录放在各自工程的bin下,而是所有的project共享外部的同一个bin目录,于是每个需要反射dll的类中都写死了一个静态只读常量,记录这个相对路径——这套做法完全有别于VS2003,所以在把cmbx转为proj工程时,会发生dll引用丢失的问题。配置文件也是这个问题。


相关文章: