私は今から約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何らかの理由で、ソースタグは私のために働くことを拒否します。