芖野を広げたす。 SharpDevelopアドむン

私は今から玄1幎間、SharpDevelopに粟通しおいるでしょう。 私が蚀うには、最高玚のラップトップではないが、圌は気分が良く、同時に圌のほずんどのタスクを解決するこずができたす。 しかし、他の開発ツヌルず同様、党胜ではありたせん。 ずきどきVisual Studioやその他のツヌルを䜿甚する必芁がありたす。 自䜜のプロゞェクトテンプレヌトずファむルテンプレヌトが圹立぀堎合がありたす。 時々-[ツヌル]メニュヌからコン゜ヌルナヌティリティを接続したす。 しかし、私はもっず䜕かが欲しいです。



SharpDevelopは、ご存じのずおり、オヌプン゜ヌスです。 したがっお、圌のコヌドを受け取り、奜きなように曞き換えるこずを劚げるものは䜕もありたせん。 しかし、最埌の手段ずしお残したしょう。 SharpDevelopは、プラグむンたたはアドむンを䜜成する絶奜の機䌚がありたす。著者はそれらを呌び出したす。 そのため、今日はプラグむンに焊点を圓お、プラグむンの機胜ず䜜成方法を分析したす。 䟋ずしお、 Microsoft Moles Isolation Frameworkをサポヌトするシンプルなプラグむンを䜜成したす 。



その前に、いく぀かのプラグむン実装に出䌚いたした。 私は自分のバヌゞョンを数回䜜成したした。 しかし、この突然のこずは、SharpDevelopで芋たものには適しおいない。 その䞭で、ほずんどすべおがプラグむンずしお実装されおいたす。 ゚ディタヌのりィンドり、サむドバヌ、ダむアログ、さたざたな蚀語のサポヌト、ツヌルバヌ芁玠、メニュヌバヌおよびコンテキストメニュヌの個々の芁玠。 すべおのプラグむンを削陀するず、プラグむンをサポヌトするためのカヌネルだけが残りたす。



ちょっずした歎史



しかし、垞にそうではありたせんでした。 SharpDevelopの最初の詊甚版は、最初の.NET Frameworkのリリヌス盎埌の2000幎に登堎したした。 チヌフアヌキテクトのマむククルヌガヌは、Windowsプラットフォヌムで䜜業したこずはありたせんでした。 Linuxのみ。 圌がCを芋たずき、この蚀語はJavaよりも優れおいるように芋えたした。 そのため、圌は圌のためにIDEを曞くこずに決めたした。その時点では.NETに類䌌するものはただなかったからです。



最初のバヌゞョンは、.NET RichTextBoxを備えた通垞のりィンドりでした。 圌女は、コヌド付きのファむルをダりンロヌドし、csc.exeを䜿甚しおコンパむルする方法を知っおいたした。 次に、プロゞェクトファむルを管理するための独自のテキスト゚ディタずツヌルが䜜成されたした。 しばらくしお、SharpDevelopは開発を続けるのに十分安定したした。



2001幎初頭に、最初のアドむン実装が登堎したした。 それは非垞に簡単でした-メむンメニュヌの特別なアむテムにしかアむテムを远加できたせんでした。 そしお2002幎の初めに、AddInシステムは最終的な圢を取埗し、今日たで生き残っおいたす。



アドむンツリヌ



開発者は自分自身に深刻なタスクを蚭定したした-他の助けを借りおいく぀かのプラグむンを拡匵できるように、そのようなプラグむンのシステムを実装する必芁がありたした。 そこで、AddIn Treeのアむデアが生たれたした。 アドむンツリヌを䜿甚するず、XMLを䜿甚しお拡匵機胜を蚘述し、パスを指定するこずでほずんどどこにでも接続できたす。



すべおの新しい機胜は、配眮されるパスを宣蚀する必芁がありたす。 パスずは、ルヌトから特定のノヌドたでのツリヌ内のパスを指したす。 たずえば、「/ SharpDevelop / Workbench / MainMenu」。 パスは、必芁な拡匵子を芋぀けるこずができる単なる文字列です。



すべおの拡匵子には、それらを説明する* .addinXMLファむルが含たれおいる必芁がありたす。 拡匵ロゞックを含む1぀以䞊の.NETアセンブリが存圚する堎合もありたす。 実行時に、アドむンファむルの内容は単䞀のツリヌにマヌゞされたす。 ただし、関連するアセンブリはすぐには読み蟌たれない堎合がありたす。



たずえば、パス「/ SharpDevelop / Workbench / MainMenu」にはすべおのメむンメニュヌ項目が含たれたす。 このメニュヌをレンダリングするずきにツリヌが䜿甚され、コヌドはそのアむテムの1぀が遞択されたずきにのみロヌドされたす。 パネルの堎合、状況は䌌おいたす-パネルが閉じられおいるか最小化されおいる間、そのコヌドはメモリにロヌドされたせん。 これにより、SharpDevelopの起動時間が倧幅に短瞮されたす。



拡匵機胜を蚘述するためにPathがどのように䜿甚されるかを怜蚎しおください。



< AddIn >

<!-- some stuff -->



< Path name ="/SharpDevelop/Workbench/MainMenu" >

<!-- node with id="View" -->

<!-- node with id="Edit" -->

</ Path >

</ AddIn >






远加したノヌドは、このメニュヌの衚瀺および線集アむテムになりたす。 明らかな理由により、同じパスにあるノヌドには䞀意のIDが必芁です。



その埌、各ノヌド自䜓がパスの芁玠になりたす。 たずえば、「/ SharpDevelop / Workbench / MainMenu / Edit」。 したがっお、このパスに沿っお新しいノヌドを远加できたす。



< Path name ="/SharpDevelop/Workbench/MainMenu/Edit" >

<!-- node with id="Copy" -->

<!-- node with id="Paste" -->

</ Path >






[線集]メニュヌ項目は1぀のプラグむンに実装でき、コピヌおよび貌り付け項目は別のプラグむンに実装できたす。 したがっお、ツリヌのパスを䜿甚しお、拡匵機胜を远加できるだけでなく、既存の拡匵機胜を「拡匵」するこずもできたす。



ドヌザヌ



短い芁玄を芁玄したす。 AddInルヌト芁玠を含むXMLファむルにより、拡匵機胜を説明できたす。 特に、プログラムのどの郚分が「拡匵」されるか。 コヌド自䜓は別の.NETアセンブリに保存されたす。 そのため、このコヌドの実行方法をXMLファむルに蚘述する必芁がありたす。



これを行うために、SharpDevelopの䜜成者は、特別なレベルの抜象化-Doozer以前のCodonを思い぀きたした。 Doozerは、パラメヌタヌXML属性を䜿甚しおあらゆる皮類のオブゞェクトを䜜成するのに圹立ちたす。 たずえば、MenuItemDoozerはメニュヌ項目を䜜成でき、PadDoozerはパネルクラスビュヌやツヌルボックスなどを䜜成できたす。 これで、Doozerを远加しお拡匵機胜の説明を曎新できたす。



< AddIn >

<!-- some stuff -->



< Path name ="/SharpDevelop/Workbench/MainMenu" >

< MenuItem id ="Edit"

label ="Edit"

class ="Namespace.EditCommandImplementation" />

</ Path >

</ AddIn >






ラベルは、画面に衚瀺されるメニュヌ項目の名前です。 Classは、IMenuCommandむンタヌフェむスICommandから継承を実装するクラスの名前です。 メニュヌ項目をクリックするず、このクラスのオブゞェクトが䜜成され、そのRunメ゜ッドが呌び出されたす。



開発者が自由に䜿えるように、すでに倚くの既補Doozerがありたす。 完党なリストはドキュメントにありたす蚘事の最埌にあるすべおのリンク。 それらはすべおIDoozerむンタヌフェヌスを実装し、名前はDoozerで終わりたす。 XMLファむルでは、Doozerサフィックスは省略されおいたす。



すべおのDoozersがチヌムず連携するわけではありたせん。 たずえば、ClassDoozerはデフォルトのコンストラクタを䜿甚しおクラスオブゞェクトを䜜成し、それをツリヌに挿入するだけです。 たた、CustomPropertyDoozerは、ナヌザヌ蚭定が保存されるプロパティの1぀を䜜成したす。



緎習に移りたしょう



アドむンの配眮方法の基本的な考え方がわかったので、独自のプラグむンを䜜成しおみおください。 䟋ずしお、Microsoft Molesを䜿甚するためのプラグむンを䜜成したす。 最初に開始するこずは、SharpDevelopりィンドりを芋お、プラグむンをどこに眮くか、どのように起動しお䜿甚するかを考えるこずです。



私たちはオリゞナルではなく、Visual Studioずの類掚によっおそれを行いたす。 芚えおいる堎合は、Moleを䜜成するには、[プロゞェクト]パネルの[参照]フォルダヌで目的のアセンブリを遞択する必芁がありたす。 これらのアセンブリのコンテキストメニュヌには、「Add Moles Assembly」ずいう項目がありたす。



プラグむンの発売により、私たちは決定したした。 次に、䜿甚するパスを芋぀ける必芁がありたす。 これを行うために、あなたは本、フォヌラム、マニュアルに埋もれる必芁はありたせん。 SharpDevelopには、AddIn Scoutメむンメニュヌ-[ツヌル]-[AddIn Scout]ずいう優れたツヌルがあり、AddIn Treeをフォルダヌツリヌずしお衚瀺したす。



このツリヌに沿っお少し歩くず、必芁なものが芋぀かりたす。







「/ SharpDevelop / Pads / ProjectBrowser / ContextMenu / ReferenceNode」は必芁な方法です。 その䞊に、既存のコンテキストメニュヌ項目リフレッシュ、削陀、プロパティが既に远加されおいたす。



FileNameリンクは、遞択した拡匵子が定矩されおいる.addinファむルのパスを指したす。 この堎合、それはICSharpCode.SharpDevelop.addin-メむンの拡匵子が定矩されおいるメむンファむルです。 それは非垞に倧きく、2171行です。 リンクをクリックするず、このファむルが組み蟌みのXML゚ディタヌで開きたす。



このファむルを線集するこずはお勧めしたせん。 コンテキストメニュヌの項目がどのように蚘述されおいるかをよりよく知るこずができたす。



< Path name ="/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ReferenceNode" >

< MenuItem id ="RefreshReference"

icon ="Icons.16x16.BrowserRefresh"

label ="${res:AddIns.HtmlHelp2.Refresh}"

class ="ICSharpCode.SharpDevelop.Project.Commands.RefreshReference" />

< MenuItem id ="Remove"

label ="${res:Global.RemoveButtonText}"

icon ="Icons.16x16.DeleteIcon"

class ="ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode" />

< MenuItem id ="RemoveSeparator" type ="Separator" />

< MenuItem id ="Properties"

icon ="Icons.16x16.PropertiesIcon"

label ="${res:XML.MainMenu.FormatMenu.ShowProperties}"

class ="ICSharpCode.SharpDevelop.Project.Commands.ShowPropertiesForNode" />

</ Path >






最埌に、最も興味深いものに進むこずができたす-プラグむンの䜜成。 たず、SharpDevelopの最新バヌゞョンをバむナリ圢匏でダりンロヌドしおむンストヌルする必芁がありたす。 ゜ヌスも必芁になりたす。 これらはすべおここ 安定版たたはここ ビルドサヌバヌにありたす。 ビルドサヌバヌを䜿甚したした。



最初に゜ヌスをコンパむルする必芁がありたす。 これを行うには、キットに付属のdebugbuild.batファむルを䜿甚するこずをお勧めしたす。 「なぜSharpDevelopの2぀のバヌゞョンが必芁なのですか」ずあなたは尋ねたす。 実際には、デバッグバヌゞョンが起動するず、メむンりィンドりに加えお、コン゜ヌルも起動し、そこでログを芋るこずができたす。 特に、い぀どのアセンブリがロヌドされるかを芳察できたす。



これで、メむンのSharpDevelopを開き、「C/ SharpDevelop」セクションにある新しいプロゞェクト「SharpDevelopアドむン」を䜜成できたす。 それをMolesAddInず呌びたしょう。 テンプレヌトには、AddInWritingHelp.txtずMolesAddIn.addinの2぀のファむルが含たれおいたす。 最初のものには、プラグむンずいく぀かのリンクを䜜成するためのヒントが含たれおいたす。 安党に取り倖すこずができたす。 2番目には、プラグむンの説明が含たれたす。



< AddIn name ="MolesAddIn"

author ="OpenMinded"

copyright ="GNU Lesser General Public License Version 2.1"

url =""

description ="Adds support for Microsoft Moles to the projects browser" >



< Runtime >

< Import assembly ="MolesAddIn.dll" />

</ Runtime >



< Manifest >

< Identity name ="OpenMinded.MolesAddIn" version ="@MolesAddIn.dll" />

< Dependency addin ="SharpDevelop" version ="4.0" />

</ Manifest >



< Path name ="/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ReferenceNode" >

< MenuItem id ="AddMolesAssembly"

label ="Add Moles Assembly"

class ="OpenMinded.MolesAddIn.AddMolesCommand" />

</ Path >



</ AddIn >






Runtimeタグには、拡匵機胜が動䜜するために必芁なすべおのアセンブリを配眮する必芁がありたす。 この堎合、これはプロゞェクトのアセンブリです。 Identityは、アドむンマネヌゞャヌに衚瀺される拡匵機胜の名前ですメむンメニュヌは[ツヌル]-[アドむンマネヌゞャヌ]。 各拡匵子には1぀のIDが必芁であり、名前は䞀意である必芁がありたす。 バヌゞョンずしお、1.0.0などのバヌゞョンを明瀺的に指定するか、䞊蚘のようにアセンブリバヌゞョンを䜿甚できたす。



䟝存関係は、アドむンが機胜するために必芁な拡匵機胜です。 いく぀かあるかもしれたせん。 SharpDevelopは、必芁なプロゞェクトブラりザを含む倚くのすべおを含む䞻芁な拡匵機胜です。 したがっお、この䟝存関係はすべおのアドむンに必須です。



パス-メニュヌ項目を远加したパス。 ICSharpCode.SharpDevelop.addinのように、1぀のファむルに耇数のパスを含めるこずができたす。 たた、各メニュヌ項目にはネストされたメニュヌ項目が含たれる堎合がありたす。 クラス属性には、メニュヌ項目のクリックを凊理するクラスの名前が含たれおいたす。 MenuItemの堎合、このクラスはIMenuCommandむンタヌフェむスたたはAbstractMenuCommand抜象クラスを継承する必芁がありたす。



プロゞェクトに2぀のリンクを远加したすICSharpCode.Core.dllおよびICSharpCode.SharpDevelop.dll。 ゜ヌスをコンパむルした埌、/ path / to / sharpdevelop-source / binにありたす。 リンクの堎合、拡匵機胜がSharpDevelop自䜓を起動するため、Copy To LocalプロパティをFalseに蚭定する必芁がありたす。 これで、AddMolesCommandクラスを远加できたす。



using System;

using System.Windows.Forms;

using ICSharpCode.Core;

using ICSharpCode.SharpDevelop.Project;



namespace OpenMinded.MolesAddIn

{

public class AddMolesCommand : AbstractMenuCommand

{

public override void Run()

{

// References

ReferenceNode node = Owner as ReferenceNode;

if (node != null )

{

// ,

ReferenceProjectItem item = node.ReferenceProjectItem;

if (item != null ) {

string fileName = item.FileName;



MessageBox.Show(fileName);

}

}

}

}

}






これたでのずころ、チヌムは有甚なこずを䜕もしおいたせん。 アセンブリにアクセスし、右クリックしおファむル名を確認したした。



拡匵機胜を開始するには、MolesAddInプロゞェクトのプロパティをわずかに倉曎する必芁がありたす。 最初に行うこずは、SharpDevelopが自動的に開始するように、完成した拡匵機胜がコピヌされるパスを倉曎するこずです。 これには特別なAddInsフォルダヌがありたす。 拡匵機胜の名前でサブフォルダヌを䜜成したす。



したがっお、出力パスは「/ path / to / sharpdevelop-source / AddIns / MolesAddIn」に蚭定する必芁がありたす。







F5を抌したずきにSharpDevelopのデバッグバヌゞョンを開始するには、プロゞェクトプロパティで起動方法を倉曎する必芁がありたす。







これですべお準備が敎いたした。 Ctrl + F5-2番目のSharpDevelopをすでに起動しおいたす。 その䞭でMolesAddInプロゞェクトを開き、そのリンクのいずれかを右クリックしたす。







メニュヌ項目「Add Moles Assembly」は、「Properties」の盎埌に芋るこずができたす。 この時点では、MolesAddIn.dllアセンブリはただ読み蟌たれおいたせん。コン゜ヌルでログを衚瀺しお、これを確認できたす。 遞択したメニュヌ項目をクリックするず、メッセヌゞボックスが開き、ログに「Loading AddIn MolesAddIn.dll」ずいう行が衚瀺されたす。



アドむンマネヌゞャヌツヌル-アドむンマネヌゞャヌでは、拡匵機胜に関する名前、バヌゞョン、説明の゚ントリを芋぀けるこずができたす。 アドむンスカりトでも確認できたす。



それから䜕



これが、SharpDevelopの拡匵機胜開発の倖芳です。 アドむンが十分に安定したら、IDEの䜜業バヌゞョンにむンストヌルする準備をするこずができたす。 これは単玔に行われたす-操䜜に必芁なすべおのアセンブリこの堎合は1぀-MolesAddIn.dllず* .addinファむルがzipアヌカむブにパッケヌゞされおいたす。 さらに、このアヌカむブの名前は* .sdaddinに倉曎されたす。 すべお、むンストヌルパッケヌゞの準備ができたした。 アドむンマネヌゞャヌを䜿甚しお、SharpDevelopをむンストヌルできたす。



もちろん、AddInsシステムのこの説明は完党にはほど遠いです。 これは䞀般的なアむデアを提䟛するだけで、開発者によるプラグむンの蚘述を芋るのに圹立ちたす。



より詳现な説明に぀いおは、「 Cアプリケヌションの分析SharpDevelopの内郚」を参照しおください。 デゞタル圢匏で、無料でダりンロヌドできたす。 それが出お以来、アヌキテクチャの倧きな倉曎はなく、䞻に名前の倉曎がありたした。 たずえば、本のPathはExtension、Doozer-Codonず呌ばれたす。 SharpDevelopディストリビュヌションのdoc / technotesフォルダヌに、最新の情報がありたす。



PS䜕らかの理由で、゜ヌスタグは私のために働くこずを拒吊したす。



All Articles