色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SharpDevelop代碼解析:AddInTree如何進行初始化工作

454398 ? 來源:csdn ? 作者:石榴刺猬 ? 2020-10-16 15:03 ? 次閱讀

主程序

在大學課程里面,我對于模擬電路總是搞不清楚,直到現在也是這樣。我總覺得電路圖很奇怪,總會問“這部分電路是做什么用的”、“為什么會有這樣的效果”。在我的腦海里面,每部分的電路都應該有一定的用處,可是我總是看不明白。我媽媽說,我的思路被軟件所固化的太久了,看電路圖不應該總是一個個模塊的看,正確的方法應該是從電源的一極順著電路看,一直看到電源的另一極。我現在仍然不懂看電路圖,可是以我看代碼的經驗來說,我覺得分析源代碼按照這樣的思路來看會比較容易把脈絡理清楚。

在SharpDevelop的代碼中,由于很多的接口和插件的原因,很多代碼在看到某個地方會突然失去函數/方法調用的線索。例如看某個函數的實現的時候會跳到一個接口里面去,那是因為這部分功能在運行期才會給一個實現了這個接口的對象來進行具體的執行。從這個角度來說,設計模式也給我們研究代碼稍微帶來了一點小小的難度。在看Linux下源代碼的時候也經常遇到這種問題,在這個時候尋找代碼線索比較好的方法是用一個文本搜索工具來搜索相關的關鍵字。在Linux下我經常會用grep,Windows下面類似UltraEdit的“批量文件查找”功能會很好用(或者“Search And Replace”之類的工具)。這個是我讀代碼的一點小小的經驗,如果你知道有更好的方法,請告訴我讓我也學習一下 ? 。

我不想大段大段的貼代碼出來占地方(空間、帶寬,還有各位看官的注意力),在需要的地方我會貼上主要的代碼,因此最好能夠找代碼來對應著看。把代碼包解壓縮,我把它解到了“F:/SharpDevelop”(如果沒有說明,下文都是以此為代碼的根目錄了)。由于SharpDevelop本身對于察看代碼不是很方便,沒有“轉到定義”之類的功能,因此我建議你把它的代碼轉成VS的工程來看。不過很可惜,SharpDevelop的工程導出功能現在有問題,如果導出/src/SharpDevelop.cmbx 這個總的復合工程的話會失?。ㄎ矣浀肦C1版本是可以成功的,不知道為什么后來的版本反而會出問題),所以只能一個一個工程的導出。

好了,讓我們來看SharpDevelop的代碼吧。

1、起點

在主程序的起點在/src/Main/StartUp/SharpDevelopMain.cs,找到Main函數這就是整個程序的起點了。開始的部分是顯示封面窗體并加上命令行控制,其中SplashScreenForm 定義在/src/Main/Base/Gui/Dialogs/SplashScreen.cs文件中,這部分我就不多說了。之后是

Application.ThreadException += new ThreadExceptionEventHandler(ShowErrorBox);

SharpDevelop為了有效的進行錯誤報告,因此自己進行了異常的控制。系統出現異常的時候,SharpDevelop會攔截下來彈出它自己的異常提示報告對話框。這個代碼就是在這一行實現的。其中 ShowErrorBox 這個方法就在類SharpDevelopMain中,ExceptionBox 定義在/src/Main/StartUp/Dialogs/ExceptionBox.cs中。如果需要進行自己的異??刂?,可以學習一下這里的技巧。

2、充滿玄機的初始化

string [] addInDirs = ICSharpCode.SharpDevelop.AddInSettingsHandler.GetAddInDirectories( out ignoreDefaultPath );

AddInTreeSingleton.SetAddInDirectories(addInDirs, ignoreDefaultPath);

通過AddInSettingsHandler取得插件的目錄,并告知AddInTreeSingleton。AddInSettingsHandler定義在/src/Main/StartUp/Dialogs/AddInTreeSettingsHandler.cs中,它通過讀取系統配置(App.config)文件中的AddInDirectory節點的Path屬性來確定插件的目錄位置,或者你也可以通過自己定義的AddInDirectories節來指定插件目錄。如果你沒有做這些配置,默認的目錄在SharpDevelop運行目錄的。./Addins目錄下。

ServiceManager.Services.AddService( new MessageService());

ServiceManager.Services.AddService( new ResourceService());

ServiceManager.Services.AddService( new IconService());

通過ServiceManager(服務管理器)加入三個系統默認的服務,消息服務、資源服務、圖標服務。這三個服務中,消息服務是顯示各種信息提示,另外兩個是屬于系統的資源,SharpDevelop通過服務來進行統一調用和管理。

ServiceManager.Services.InitializeServicesSubsystem(“/Workspace/Services”);

初始化其他的服務。SharpDevelop把服務定義在插件樹的/Workspace/Services這個路徑中,凡是在這個路徑下的插件都被認為是服務,因此如果你自己定義了一個服務的話,也需要掛到這個路徑下(這里就是系統服務的擴展點了)。

注意!這一步中,在我們的眼皮子底下悄悄的進行了一個重要的初始化工作。各位看官請看,ServiceManager 定義在/src/Main/Core/Services/ ServiceManager.cs文件中,察看它的InitializeServicesSubsystem方法,我們發現這樣一行

AddServices((IService[]) AddInTreeSingleton.AddInTree.GetTreeNode(servicesPath).BuildChildItems(this).ToArray(typeof(IService)));

在這里,AddInTreeSingleton首次調用了AddInTree(插件樹)的實例。按照Singleton模式,只有在首次調用的時候才會初始化實例,這里也是同樣如此。整個系統的AddInTree是在這一步中進行了初始化工作,稍候我們將詳細介紹AddInTree如何進行初始化工作,先順便看看服務的初始化。在ServiceManager的InitializeServicesSubsystem方法中,通過AddInTree檢索服務插件路徑下的所有配置,并通過它來讀取、建立具體的對象,然后加入到服務列表中。之后通過一個循環,逐個的調用各個服務的InitializeService方法初始化服務。

AddInTree的初始化工作容我們稍候再看,先把主體的代碼看完。

commands = AddInTreeSingleton.AddInTree.GetTreeNode(“/Workspace/Autostart”).BuildChildItems(null);

for (int i = 0; i 《 commands.Count - 1; ++i)

{

((ICommand)commands[i]).Run();

}

/Workspace/Autostart是系統自動運行命令的擴展點路徑,定義在這個路徑下的插件會在系統啟動的時候自動運行。在這里,通過插件樹初始化建立處于這個路徑下的Command(命令),并逐一執行。BuildChildItems方法的功能是建立這個擴展點下的Command列表,我會在介紹AddTree的時候具體說明它的實現。

程序代碼的最后,初始化完畢、關閉封面窗體,然后執行命令列表中最后一個命令(也就是系統的主界面)。在主界面退出的時候,系統卸載所有的服務。

在這部分代碼中,我們知道了兩個系統指定的擴展點路徑 /Workspace/Services 和 /Workspace/Autostart ,我們實現服務和指定系統自動運行命令的時候就可以掛到這兩個擴展點路徑下了。

托反射的福,ServiceManager.Services可以通過類型(接口)來查找具體的實例,也就是GetServices方法。但是ServiceManager的具體實現我們可以容后再看,這里已經不是最緊要的部分了。

接下來,我們來看看整個插件系統的核心-AddinTree的代碼,看看它是如何通過插件配置進行初始化并建立起整個系統的插件樹骨干。

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11341

    瀏覽量

    210134
  • 服務管理器
    +關注

    關注

    0

    文章

    2

    瀏覽量

    477
收藏 人收藏

    評論

    相關推薦

    C語言電源按鍵如何進行按鍵端口初始化

    C語言電源按鍵如何進行按鍵端口初始化
    發表于 06-28 20:06

    請問IO初始化工具好用嗎?

    IO初始化工具好用嗎
    發表于 06-21 07:39

    LPC21XX初始化工

    LPC21XX初始化工
    發表于 09-06 14:32 ?35次下載

    RM68171配BOE3.97玻璃的初始化代碼

    RM68171配BOE3.97玻璃的初始化代碼,測試OK,確定沒問題!
    發表于 06-17 17:07 ?2次下載

    使用QCS生成DPAA初始化代碼

    本文檔指導用戶如何使用從qc DPAA生成的代碼,用戶應用程序的上下文中利用USDPAA司機。該文檔解釋了反射器應用程序,并演示了幫助用戶快速插入QCS的步驟,這些插件在應用程序中生成DPAA初始化代碼
    發表于 09-07 17:21 ?0次下載
    使用QCS生成DPAA<b class='flag-5'>初始化</b><b class='flag-5'>代碼</b>

    初始化miniDSP Codec及MCU控制器的參考代碼

    Texas instruments 推出的超低功耗miniDSP 音頻Codec 集成了miniDSP 內核,可在耗電極低的工作狀態下為電池供電的便攜式產品提供高性能的語音及音樂處理能力。本文詳細介紹了如何初始化miniDSP Codec 并提供了基于MCU 控制器的參考
    發表于 09-21 15:09 ?12次下載
    <b class='flag-5'>初始化</b>miniDSP Codec及MCU控制器的參考<b class='flag-5'>代碼</b>

    objc源碼中NSObject如何進行初始化

    + alloc 和 - init 這一對我們在 iOS 開發中每天都要用到的初始化方法一直困擾著我, 于是筆者仔細研究了一下 objc 源碼中 NSObject 如何進行初始化。 在具體分析對象
    發表于 09-26 09:58 ?0次下載

    如何排除代碼編寫器Studio 2和2.10的初始化問題

    此應用程序報告使讀者熟悉XDSPo探測實用程序。這個實用程序可能是用于排除代碼編寫器Studio 2和2.10的初始化問題通常表現為指示目標DSP的錯誤消息。無法初始化。此問題可能是由于配置或硬件不正確造成的。
    發表于 04-25 09:59 ?4次下載
    如何排除<b class='flag-5'>代碼</b>編寫器Studio 2和2.10的<b class='flag-5'>初始化</b>問題

    8259a初始化的步驟及代碼介紹

    本文首先介紹了8259a工作初始化的步驟及程序,其次介紹了通過OCW對8259A進行操作方法,最后介紹了8259A初始化編程。
    的頭像 發表于 05-23 14:24 ?3w次閱讀
    8259a<b class='flag-5'>初始化</b>的步驟及<b class='flag-5'>代碼</b>介紹

    AT91SAM7初始化工具應用程序免費下載

    本文檔的主要內容詳細介紹的是AT91SAM7初始化工具應用程序免費下載ARM初始化各寄存器值的計算
    發表于 04-28 16:24 ?6次下載
    AT91SAM7<b class='flag-5'>初始化工</b>具應用程序免費下載

    uboot中進行LCD初始化的流程免費下載

    本文檔的主要內容詳細介紹的是uboot中進行LCD初始化的流程免費下載。
    發表于 08-12 08:00 ?11次下載
    uboot中<b class='flag-5'>進行</b>LCD<b class='flag-5'>初始化</b>的流程免費下載

    霍爾無刷電機如何進行程序初始化

    霍爾無刷電機這種系統在進行程序初始化已經預先設定好一些變量,因此隨著系統的初始化進行,這些變量也開始進入了初始化過程中,而且這個過程中也設計
    的頭像 發表于 10-15 17:29 ?7759次閱讀

    STM32執行代碼初始化卡住,或者上電卡住,或者復位卡住,導致代碼不執行

    STM32的板子上電或者復位,接有顯示屏或者LED指示燈的都會卡住解決:1、檢查自己的代碼是否有中斷,有中斷的話,其初始化放在其他硬件初始化之后 即:中斷的初始化放在進入while
    發表于 12-09 09:21 ?22次下載
    STM32執行<b class='flag-5'>代碼</b><b class='flag-5'>初始化</b>卡住,或者上電卡住,或者復位卡住,導致<b class='flag-5'>代碼</b>不執行

    DB2163_STM32配置和初始化C代碼生成

    DB2163_STM32配置和初始化C代碼生成
    發表于 11-23 20:29 ?0次下載
    DB2163_STM32配置和<b class='flag-5'>初始化</b>C<b class='flag-5'>代碼</b>生成

    使用STM32CubeMX生成初始化代碼

    我使用STM32CubeMX生成初始化代碼,使用LL庫,這里只介紹跟i2c相關的部分,其他必要的初始化需要自己完成。芯片使用stm32f042。本文的代碼不能到手即用,只提供思路。
    的頭像 發表于 03-22 15:26 ?3102次閱讀
    主站蜘蛛池模板: 内射一区二区精品视频在线观看 | 国产免费人成在线视频视频 | 中文人妻熟妇精品乱又伧 | 久久三级视频 | 美女黄图大全 | 美国VICTORY DAY在线 | 婬香婬色天天视频 | 国产学生在线播放精品视频 | 欧美性最猛xxxx在线观看视频 | 欧美精品亚洲精品日韩专区一 | 蝴蝶中文综合娱乐网2 | 久久国产精品免费A片蜜芽 久久国产精品萌白酱免费 久久国产精品麻豆AV影视 | 国产在线观看www | 亚洲AV美女成人网站P站 | 在线看免费毛片 | 国产精品ⅴ视频免费观看 | 日本久久道一区二区三区 | 午夜亚洲精品不卡在线 | AV无码九九久久 | 97国内精品久久久久久久影视 | 久久受www免费人成_看片中文 | 亚洲国产精品高清在线 | 欧美精品久久久久性色AV苍井 | 偷尝禁果H1V1幸运的山熊 | 国产精品久久久久一区二区三区 | 亚洲美女视频高清在线看 | 日本午夜精品久久久无码 | 色狠狠xx| 在线中文字幕网站 | 成人免费在线视频 | yellow免费影视大全 | 亚洲综合日韩中文字幕v在线 | 国产精品野外AV久久久 | 久久久无码精品亚洲A片软件 | 黄色三级视频在线 | 在线免费观看亚洲视频 | 国产亚洲精品成人a在线 | 老湿司午夜爽爽影院榴莲视频 | qvod 在线电影| 精品一卡2卡三卡4卡乱码精品视频 | 亚洲中文有码字幕日本 |