91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SharpDevelop代碼解析:AddInTree如何進(jìn)行初始化工作

454398 ? 來源:csdn ? 作者:石榴刺猬 ? 2020-10-16 15:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

主程序

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

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

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

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

1、起點(diǎn)

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

Application.ThreadException += new ThreadExceptionEventHandler(ShowErrorBox);

SharpDevelop為了有效的進(jìn)行錯(cuò)誤報(bào)告,因此自己進(jìn)行了異常的控制。系統(tǒng)出現(xiàn)異常的時(shí)候,SharpDevelop會(huì)攔截下來彈出它自己的異常提示報(bào)告對(duì)話框。這個(gè)代碼就是在這一行實(shí)現(xiàn)的。其中 ShowErrorBox 這個(gè)方法就在類SharpDevelopMain中,ExceptionBox 定義在/src/Main/StartUp/Dialogs/ExceptionBox.cs中。如果需要進(jìn)行自己的異??刂疲梢詫W(xué)習(xí)一下這里的技巧。

2、充滿玄機(jī)的初始化

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

AddInTreeSingleton.SetAddInDirectories(addInDirs, ignoreDefaultPath);

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

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

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

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

通過ServiceManager(服務(wù)管理器)加入三個(gè)系統(tǒng)默認(rèn)的服務(wù),消息服務(wù)、資源服務(wù)、圖標(biāo)服務(wù)。這三個(gè)服務(wù)中,消息服務(wù)是顯示各種信息提示,另外兩個(gè)是屬于系統(tǒng)的資源,SharpDevelop通過服務(wù)來進(jìn)行統(tǒng)一調(diào)用和管理。

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

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

注意!這一步中,在我們的眼皮子底下悄悄的進(jìn)行了一個(gè)重要的初始化工作。各位看官請(qǐng)看,ServiceManager 定義在/src/Main/Core/Services/ ServiceManager.cs文件中,察看它的InitializeServicesSubsystem方法,我們發(fā)現(xiàn)這樣一行

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

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

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

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

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

{

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

}

/Workspace/Autostart是系統(tǒng)自動(dòng)運(yùn)行命令的擴(kuò)展點(diǎn)路徑,定義在這個(gè)路徑下的插件會(huì)在系統(tǒng)啟動(dòng)的時(shí)候自動(dòng)運(yùn)行。在這里,通過插件樹初始化建立處于這個(gè)路徑下的Command(命令),并逐一執(zhí)行。BuildChildItems方法的功能是建立這個(gè)擴(kuò)展點(diǎn)下的Command列表,我會(huì)在介紹AddTree的時(shí)候具體說明它的實(shí)現(xiàn)。

程序代碼的最后,初始化完畢、關(guān)閉封面窗體,然后執(zhí)行命令列表中最后一個(gè)命令(也就是系統(tǒng)的主界面)。在主界面退出的時(shí)候,系統(tǒng)卸載所有的服務(wù)。

在這部分代碼中,我們知道了兩個(gè)系統(tǒng)指定的擴(kuò)展點(diǎn)路徑 /Workspace/Services 和 /Workspace/Autostart ,我們實(shí)現(xiàn)服務(wù)和指定系統(tǒng)自動(dòng)運(yùn)行命令的時(shí)候就可以掛到這兩個(gè)擴(kuò)展點(diǎn)路徑下了。

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

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

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11775

    瀏覽量

    219157
  • 服務(wù)管理器
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    564
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語(yǔ)言電源按鍵如何進(jìn)行按鍵端口初始化

    C語(yǔ)言電源按鍵如何進(jìn)行按鍵端口初始化
    發(fā)表于 06-28 20:06

    請(qǐng)問IO初始化工具好用嗎?

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

    LPC21XX初始化工

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

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

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

    使用QCS生成DPAA初始化代碼

    本文檔指導(dǎo)用戶如何使用從qc DPAA生成的代碼,用戶應(yīng)用程序的上下文中利用USDPAA司機(jī)。該文檔解釋了反射器應(yīng)用程序,并演示了幫助用戶快速插入QCS的步驟,這些插件在應(yīng)用程序中生成DPAA初始化代碼。
    發(fā)表于 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 內(nèi)核,可在耗電極低的工作狀態(tài)下為電池供電的便攜式產(chǎn)品提供高性能的語(yǔ)音及音樂處理能力。本文詳細(xì)介紹了如何初始化miniDSP Codec 并提供了基于MCU 控制器的參考
    發(fā)表于 09-21 15:09 ?12次下載
    <b class='flag-5'>初始化</b>miniDSP Codec及MCU控制器的參考<b class='flag-5'>代碼</b>

    objc源碼中NSObject如何進(jìn)行初始化

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

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

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

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

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

    AT91SAM7初始化工具應(yīng)用程序免費(fèi)下載

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

    uboot中進(jìn)行LCD初始化的流程免費(fèi)下載

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

    霍爾無刷電機(jī)如何進(jìn)行程序初始化?

    霍爾無刷電機(jī)這種系統(tǒng)在進(jìn)行程序初始化已經(jīng)預(yù)先設(shè)定好一些變量,因此隨著系統(tǒng)的初始化進(jìn)行,這些變量也開始進(jìn)入了初始化過程中,而且這個(gè)過程中也設(shè)計(jì)
    的頭像 發(fā)表于 10-15 17:29 ?8705次閱讀

    STM32執(zhí)行代碼初始化卡住,或者上電卡住,或者復(fù)位卡住,導(dǎo)致代碼不執(zhí)行

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

    BF533 AD73360初始化程序代碼

    BF533 AD73360初始化程序代碼源碼分享
    發(fā)表于 10-08 14:59 ?0次下載

    使用STM32CubeMX生成初始化代碼

    我使用STM32CubeMX生成初始化代碼,使用LL庫(kù),這里只介紹跟i2c相關(guān)的部分,其他必要的初始化需要自己完成。芯片使用stm32f042。本文的代碼不能到手即用,只提供思路。
    的頭像 發(fā)表于 03-22 15:26 ?4769次閱讀