SharpDevelop程式碼分析 (一、序+基本概念)

來源:互聯網
上載者:User
概念 序

最近開始學習.Net,遇到了一個比較不錯的開源的IDE SharpDevelop。這個開發工具是使用C#開發的,比較吸引我的一點就是它是採用了和Eclipse類似的外掛程式技術來實現整個系統的。而這個外掛程式系統是我最感興趣的地方,因此開始了一段代碼的研究。在本篇之後,我會陸續把我研究的心得寫下來。由於是在網吧上網,有諸多不便,因此可能會拖比較長的時間。



一、基本概念

首先,我們先來對 SharpDevelop 有一個比較感性的認識。你可以從這裡下載到它的可執行程式和程式碼封裝 http://www.icsharpcode.com/ ,安裝的廢話就不說了,先運行一下看看。感覺跟VS很像吧?不過目前的版本是1.0.0.1550,還有很多地方需要完善。關於代碼和系統結構,SharpDevelop的三個作者寫了一本書,各位看官可以參考一下,不過我看過之後還是有很多地方不太理解。

然後,讓我來解釋一下什麼叫外掛程式以及為什麼要使用外掛程式系統。我們以往的系統,開發人員編譯發布之後,系統就不允許變更和擴充了,如果要進行某個功能的擴充,則必須要修改代碼重新編譯發布。這就給我們帶來了比較大的不方便。解決的方法有很多,例如提供配置等等方法。在解決方案之中,外掛程式是一個比較好的解決方案。大家一定知道PhotoShop、WinAmp吧,他們都有“外掛程式”的概念,允許其他開發人員根據系統預定的介面編寫擴充功能(例如PhotoShop中各種各樣的濾鏡)。所謂的外掛程式就是系統的擴充功能模組,這個模組是以一個獨立檔案的形式出現的,與系統是相對獨立。在系統設計期間並不知道外掛程式的具體功能,僅僅是在系統中為外掛程式留下預定的介面,系統啟動的時候根據外掛程式的配置尋找外掛程式,根據預定的介面把外掛程式掛接到系統中。

這樣的方式帶來什麼樣的優點呢?首先是系統的擴充性大大的增強了,如果我們在系統發布後需要對系統進行擴充,不必重新編譯,只需要修改外掛程式就可以了。其次有利與團隊開發,各個功能模組由於是以外掛程式的形式表現在系統中,系統的每日構造就很簡單了,不會因為某個模組的錯誤而導致整個系統的BUILD失敗。失敗的僅僅是一個外掛程式而已。

PhotoShop和Winamp的外掛程式系統是比較簡單的,他們首先實現了一個基本的系統,然後在這個系統的基礎上掛接其他擴充的功能外掛程式。而SharpDevelop的外掛程式系統更加強大,它的整個系統的基礎就僅僅是一個外掛程式管理系統,而你看到的所有的介面、功能統統都是以外掛程式的形式掛入的。在這樣的一個外掛程式系統下,我們可以不修改基本系統,僅僅使用外掛程式就構造出各種各樣不同的系統。

現在讓我們來看看它的外掛程式系統。進入到SharpDevelop的安裝目錄中,在Bin目錄下的SharpDevelop.exe 和 SharpDevelop.Core.dll是這個系統的基本的外掛程式系統。在Addins目錄下有兩個尾碼是addin的檔案,其中一個 SharpDevelopCore.addin 就是它的核心外掛程式的定義(配置)檔案,裡面定義的各個功能模組存在於Bin\Sharpdevelop.Base.DLL 檔案中,另外還有很多其他的外掛程式定義在Addins目錄下的addin檔案中。

分析SharpDevelop的代碼,首先要弄清楚幾個基本的概念,這些概念和我以前的預想有一些區別,我深入了代碼之後才發現我的困惑所在。

1、AddInTree 外掛程式樹
SharpDevelop 中的外掛程式被組織成一棵外掛程式樹結構,樹的結構是通過 Extension(擴充點)中定義的Path(路徑)來定義的,類似一個檔案系統的目錄結構。系統中的每一個外掛程式都在設定檔中指定了 Extension,通過Extension中指定的 Path 掛到這棵外掛程式樹上。在系統中可以通過 AddTreeSingleton對象來訪問各個外掛程式,以實現外掛程式之間的互動。

2、 AddIn 外掛程式
在 SharpDevelop 的概念中,外掛程式是包含多個功能模組的集合(而不是我過去認為的一個功能模組)。在檔案的表現形式上是一個addin設定檔,在系統中對應 AddIn 類。

3、Extension 擴充點
SharpDevelop中的每一個外掛程式都會被掛到 AddInTree(外掛程式樹) 中,而具體掛接到這個外掛程式樹的哪個位置,則是由外掛程式的 Extension 對象中的 Path 指定的。在addin 設定檔中,對應於 <Extension> 。例如下面這個功能模組的配置
<Extension path = "/SharpDevelop/Workbench/Ambiences">
<Class id = ".NET" class = "ICSharpCode.SharpDevelop.Services.NetAmbience"/>
</Extension>
指定了擴充點路徑為 /SharpDevelop/Workbench/Ambiences ,也就是在外掛程式樹中的位置。

4、Codon
這個是一個比較不好理解的東西,在 SharpDevelop 的三個作者寫的書的中譯版中被翻譯為代碼子,真是個糟糕的翻譯,可以跟Handle(控制代碼)有一拼了。詞典中還有一個翻譯叫“基碼”,我覺得這個也不算好,不過還稍微有那麼一點意思。
根據我對代碼的理解,Codon 描述(封裝)一個功能模組,一個功能模組對應一個實現了具體功能的 Command 類。為了方便訪問各個外掛程式中的功能模組, Codon 給各種功能定義了基本的屬性,分別是 ID (功能模組的標識),Name (功能模組的類型。別誤會,這個Name 是addin檔案定義中Codon的XML結點的名稱,ID才是真正的名稱),其中Name可能是Class(類)、MenuItem(功能表項目)、Pad(面板)等等。根據具體的功能模組,可以繼承Codon定義其他的一些屬性,SharpDevelop中就定義了 ClassCodon、MenuCodon、PadCodon等等。
在addin定義檔案中,Codon對應於 <Extension> 標籤下的內容。 例如下面這個定義
<Extension path = "/SharpDevelop/Workbench/Ambiences">
<Class id = ".NET" class = "ICSharpCode.SharpDevelop.Services.NetAmbience"/>
</Extension>

<Extension ...> 內部定義了一個Codon,<Class ...> 表示該Codon是一個 Class(類),接著定義了該Codon的 ID和具體實現該Codon的類名ICSharpCode.SharpDevelop.Services.NetAmbience。運行期間將通過反射來找到對應的類並建立出來,這一點也是我們無法在以前的語言中實現的。

再例如這一個定義
<Extension path = "/SharpDevelop/Views/ProjectBrowser/ContextMenu/CombineBrowserNode">
<MenuItem id = "Compile"
label = "${res:XML.MainMenu.RunMenu.Compile}"
class = "ICSharpCode.SharpDevelop.Commands.Compile"/>
<MenuItem id = "CompileAll"
label = "${res:XML.MainMenu.RunMenu.CompileAll}"
class = "ICSharpCode.SharpDevelop.Commands.CompileAll"/>
<MenuItem id = "CombineBuildGroupSeparator" label = "-" />
....
</Extension>
這個擴充點中定義了三個功能表項目,以及各個功能表項目的名字、標籤和實現的類名。這裡的Codon就對應於系統中的MenuCodon對象。

5、Command 命令
正如前文所述,Codon描述了一個功能模組,而每個功能模組都是一個 ICommand 的實現。最基本的 Command 是 AbstractCommand,根據Codon的不同對應了不同的 Command。例如 MenuCodon 對應 MenuCommand 等等。

6、Service 服務
外掛程式系統中,有一些功能是整個系統都要使用的,例如檔案訪問、資源、訊息等等。這些功能都作為外掛程式系統的一個準系統為整個系統提供服務,我們就叫“服務”好了。為了便於訪問,這些服務都統一通過 ServiceManager 來管理。其實服務也是一種類型的外掛程式,它們的擴充點路徑在分類樹中的 /Services 中。


理解了這幾個基本的概念之後,就可以看看 SharpDevelop 的代碼了。從 src\main\startup.cs 看起吧,之後是addin.cs、addinTree.cs 等等。

寫了兩個小時了,休息一下。且聽下回分解吧。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。