日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SharpDevelop源码分析 (一、序+基本概念) 收藏

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SharpDevelop源码分析 (一、序+基本概念) 收藏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? SharpDevelop源碼分析 (一、序+基本概念) 收藏

??? 最近開始學習.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(句柄)有一拼了。詞典中還有一個翻譯叫“基碼”,我覺得這個也不算好,不過還稍微有那么一點意思。(這里我原來誤寫為“代碼子”,在評論中有位仁兄說這個翻譯不錯,現在我覺得也好像確實不錯 ^o^)
??? 根據我對代碼的理解,Codon 的功能是描述(包裝)一個功能模塊(一個功能模塊對應一個實現了具體功能的 Command 類)。為了方便訪問各個插件中的功能模塊, Codon 給各種功能定義了基本的屬性,分別是 ID (功能模塊的標識),Name (功能模塊的類型。別誤會,這個Name 是addin文件定義中Codon的XML結點的名稱,ID才是真正的名稱),其中Name可能是Class(類)、MenuItem(菜單項)、Pad(面板)等等。根據具體的功能模塊,可以繼承Codon定義其他的一些屬性,SharpDevelop中就定義了 ClassCodon、MenuItemCodon、PadCodon等等,你可以根據需要自己定義其他類型的Codon。在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。例如 MenuItemCodon 對應 MenuItemCommand 等等。

6、Service 服務
??? 插件系統中,有一些功能是整個系統都要使用的,例如文件訪問、資源、消息等等。這些功能都作為插件系統的一個基本功能為整個系統提供服務,我們就叫“服務”好了。為了便于訪問,這些服務都統一通過 ServiceManager 來管理。其實服務也是一種類型的插件,它們的擴展點路徑在目錄樹中的 /Workspace/Services 中。

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

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

發表于 @ 2004年10月04日 18:55:00 | 評論( 29 ) | 編輯| 舉報| 收藏


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/passos/archive/2004/10/04/124722.aspx

總結

以上是生活随笔為你收集整理的SharpDevelop源码分析 (一、序+基本概念) 收藏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。