MonoDevelopのアドインを開発する

はじめに
Linux環境でC#を書くときのIDEといえば、やっぱりMonoDevelopです。
MonoDevelopはアドイン(プラグイン)で拡張できるのですが、アドインの開発方法についてはあまり取り上げられることが多くありません。しかし、アドインが作れればもっとMonoDevelop上での開発が楽になるはず。
そこで今回、MonoDevelopのアドインの作り方を調べてみました。


環境


MonoDevelopのアドインとは

  • MonoDevelopの機能を拡張
    • 例: Gtk# Visual Designer, XML Editorなど
  • 実体はDLLファイル
  • C#で開発(VBとかでも多分可能)


MonoDevelopのアドインを作ってインストールするまでの手順
アドインの開発からインストールまでは以下の3ステップです。
1. アドインのコードを書く
実際の機能を実現するコード
実際の処理を行うプログラムを作成します。
手順は

  • MonoDevelop.Ideのアセンブリを参照
  • MonoDevelop.Components.Commands.CommandHandlerクラスを継承したクラスを作成
  • Run()メソッドとUpdateメソッドをオーバーライドして処理を記述
    • Run() : コマンドを起動したときに実行されるメソッド
    • Update() : コマンドが表示されたときに実行されるメソッド

という感じ。ルートネームスペースは「MonoDevelop」です。


コマンドを定義する列挙型
メニューにコマンドを追加する場合に作成します。
ファイル名はCommands.csです。


2. XMLファイルを作る
XMLファイルを作成します。記述する内容は

  • メタ情報(作者、コピーライトなど)
  • 依存パッケージ
  • コマンドの定義やメニューへの追加の設定

など。
ファイル名は 「プロジェクト名.addin.xml*1とします。また、作成したXMLファイルはリソースとしてDLLに埋め込みます。


3. 配置する
DLLを作って所定のディレクトリに配置します(もしディレクトリが無かったら作成)。
MonoDevelopでビルドしてDLLを作成し、

~/.config/MonoDevelop/addins/

または

/usr/lib/monodevelop/AddIns/

にディレクトリを作成してDLLを配置します。
MonoDevelopを再起動すると自動的に読み込まれ、利用可能になります。


実際に作ってみる
例として、ステータスバーに文字列を表示するアドインを作成します。
作成したものをGitHubに置きましたので、よろしければどうぞ→ ser1zw's HelloAddin - GitHub


手順
1. MonoDevelopを起動してプロジェクトを作成

新規→ソリューション→C#→ライブラリ

HelloAddinという名前で作成します。
f:id:ser1zw:20101031122557p:image


2. 参照アセンブリの追加

プロジェクト→参照アセンブリの編集

MonoDevelop.Ide を追加します。
f:id:ser1zw:20101031122631p:image


3. コードを書く
以下の3つを作成します。

  • HelloAddinHandler.cs : 実際の機能を実現するクラス
  • Commands.cs : メニューにコマンドを追加するための列挙型
  • HelloAddin.addin.xml : メタ情報や設定などを記述するxmlファイル


実際の機能を実現するクラス

// HelloAddinHandler.cs
using MonoDevelop.Components.Commands; // CommandHander用
using MonoDevelop.Ide; // IdeApp用

// ネームスペースは MonoDevelop.HelloAddin にする
namespace MonoDevelop.HelloAddin
{
    public class HelloAddinHandler : CommandHandler
    {
        // コマンドを起動したときに実行されるメソッド
        protected override void Run()
        {
            base.Run();
            // ステータスバーに文字列を表示
            IdeApp.Workbench.StatusBar.ShowMessage("Hello, MonoDevelop Addin!!");
        }

        // コマンドが表示されたときに実行されるメソッド
        protected override void Update(CommandInfo info)
        {
            base.Update(info);
            info.Enabled = true; // コマンドを有効化
        }
    }
}

IdeAppは実行中のMonoDevelopにアクセスするためのクラスです。今回はステータスバーに文字列を表示するために使っていますが、この他にもいろいろできます。詳しくはAPI Overview - MonoDevelopなどを調べてみてください。


メニューにコマンドを追加するための列挙型

// Commands.cs
namespace MonoDevelop.HelloAddin
{
    // メニューに追加するコマンド
    public enum Commands
    {
        HelloCommand
    }
}


メタ情報や設定などを記述するxmlファイル

<!-- HelloAddin.addin.xml -->
<!-- 最初にメタ情報を記述 -->
<Addin	id		= "HelloAddin"
	namespace	= "MonoDevelop"
	name		= "Hello Addin"
	author		= "ser1zw"
	copyright	= "MIT"
	description	= "A sample addin"
	category	= "sample"
	version		= "1.0">

	<!--
	  依存パッケージを記述
	  "プロジェクト→参照アセンブリの編集"で追加したものをここに加える
	  idに記述するのはMonoDevelop以下の名前空間
	  例えば MonoDevelop.Ide なら <Addin id="Ide" version="2.4" /> みたいな感じ
	-->
	<Dependencies>
	       	<Addin id="Ide" version="2.4" />
	</Dependencies>
	
	<!-- コマンドを定義 -->
	<Extension path="/MonoDevelop/Ide/Commands">
		<!--
		  idはCommands.csで定義したコマンド(enum)の完全パス
	  	  _labelはメニューに表示される文字列
		  defaultHandlerは実行されるコマンドのクラス名(実際の処理を行うほう)
	  	-->
		<Command id="MonoDevelop.HelloAddin.Commands.HelloCommand"
			_label="Hello Addin"
			defaultHandler="MonoDevelop.HelloAddin.HelloAddinHandler" />
	</Extension>

	<!-- コマンドをツールメニューに追加 -->
	<Extension path="/MonoDevelop/Ide/MainMenu/Tools">
		<!-- idは上で定義したのと同じ -->
		<CommandItem id="MonoDevelop.HelloAddin.Commands.HelloCommand" />
	</Extension>
</Addin> 


4. XMLファイルをリソースとして埋め込む
作成したXMLファイルはリソースとして埋め込む必要があるので、ソリューションでxmlファイルを右クリックして

ビルドアクション→リソースとして埋め込む

とします。
f:id:ser1zw:20101031122715p:image


5. ビルド

ビルド→HelloAddinをビルド

または

F7

で、HelloAddin.dll が作成されます。


6. DLLの配置
今回は

~/.config/MonoDevelop/addins/

に配置します。もし無かったら作成してください。
上記ディレクトリにネームスペースと同じ名前のディレクトリを作成し、そこにDLLを配置すれば完了です。
今回はネームスペースをMonoDevelop.HelloAddinにしたので、

$ mkdir ~/.config/MonoDevelop/addins/MonoDevelop.HelloAddin
$ cp HelloAddin.dll ~/.config/MonoDevelop/addins/MonoDevelop.HelloAddin

のような感じで。


7. MonoDevelopを再起動
MonoDevelopを再起動すれば、アドインが読み込まれて使用できるようになります。
今回はツールメニューに登録したので、ここからアドインを実行できます。
f:id:ser1zw:20101031122831p:image


実行するとステータスバーに「Hello, MonoDevelop Addin!!」と表示されます。
f:id:ser1zw:20101031122846p:image


まとめ
MonoDevelopのアドインの開発方法について調査し、簡単なアドインを作成しました。
さらに詳しい情報はArticles - MonoDevelopにありますので、アドインを開発する際は調べてみてください。


参考
Addin development basics - MonoDevelop
API Overview - MonoDevelop

*1:.addin.xmlで終わるファイル名なら何でもいいんだけど、普通はこうするらしい