プラスルツール/プラグインの作り方

これはプラスルツールのプラグイン作者向けに書かれた記事です。
プラグインの使い方を知りたい方は[id:plusletool:20100918:howtouse]を参照。
ライブラリの仕様詳細を知りたい方は記事一覧から「プラスルツール/ライブラリ」タグを検索してください。

ここでは、プラスルツールプラグインの作り方を説明します。
使い方(インストール・アンインストールの方法)に関してはこちら

Microsoft Visual C# のインストール

Microsoft Visual C#をインストールします。
いくつか種類がありますが、「Express」(無料)のうち最新のものを使えば十分です。
ちなみに作者の制作環境は「Microsoft Visual C# 2010 Express」です。


インストールの詳細な手順に関しては各自検索してください。

ソリューションとプロジェクトの作成

Visual C# を起動。
メニューバーから「ファイル(F)」→「新しいプロジェクト(P)」を選択。
中央の選択肢から「クラス ライブラリ Visual C#」を選択。
名前欄にソリューション名を入力。
(例として、ここでは「Sample」として説明する。以下、適時「Sample」を入力した名前に読み替えてください。)
右下の「OK」をクリック。


メニューバーから「ファイル(F)」→「すべてを保存(L)」を選択。
「名前(N)」欄にプロジェクト名を、「ソリューション名(M)」欄にソリューション名をそれぞれ入力して「上書き保存(S)」。
(例として、ここではプロジェクト名「SampleProject」、ソリューション名「SampleSolution」として説明する。以下、適時読み替えてください。)


メニューバーから「表示(V)」→「その他のウィンドウ(E)」→「ソリューション エクスプローラー(P)」を選択。
ソリューションエクスプローラーが開くので、ソリューションとプロジェクトを確認する。
「ソリューション 'SampleSolution' (1 プロジェクト)」が、ソリューション。
また、太字で書かれた「SampleProject」がプロジェクト。


プロジェクトの設定変更

ソリューションエクスプローラーで、SampleProjectプロジェクトの中にある「Properties」をダブルクリック。
アセンブリ名(N)」欄と「規定の名前空間(L)」欄を、以下の注意にしたがって変更する。

注意
アセンブリ名が他の人が作ったプラグインアセンブリ名と重複した場合、誤作動の可能性がある。
そのため、次の例のように、他の人と絶対に重複しないようなアセンブリ名を入力してください。(名前空間も同様。)
    • 作者のホームページのアドレスを使用する(推奨)
      • 例:ttp://d.hatena.ne.jp/plusletool/→「Plusletool.Jp.Ne.Hatena.D.Plugin.SamplePlugin」など
    • 作者の名前(ハンドルネーム)を使用する
      • 例:ぷらす→「Plus.Plugin.SamplePlugin」など

また、「対象のフレームワーク(G)」欄から「.NET Framework 2.0」を選択*1
「ターゲット フレームワークを変更するには、現在のプロジェクトを閉じてから〜(以下略)」と聞かれたら、「OK」を選択。
(もしも「ターゲット フレームワークを変更する前に、現在のプロジェクトを保存しなければなりません。」と言われたら、プロジェクトを保存してから再度実行する。)
再び Properties を開き、設定が反映されていることを確認してから閉じる。



SampleProjectプロジェクトの中にある「参照設定」を開く。
その中に、黄色い三角アイコンの付いた項目がいくつかあるので、それらをすべて削除する(右クリック→「削除(V)」)。
(標準なら「Microsoft.CSharp」「System.Core」「System.Data.DataSetExtensions」「System.Xml.Linq」の4つのはず。)


ソリューションエクスプローラーで、「Class1.cs」を右クリック→「削除(D)」を選択。
「'Class1.cs' は完全に削除されます。」と聞かれるので、「OK」を選択*2

ライブラリの追加

エクスプローラを2つ開く。


1つ目のエクスプローラは、DLしたライブラリファイル「PlusleSeedCalculator.Library.dll」がある場所を開く。
(例の場合は、「(解凍したフォルダ)\プラスルツール\」)


2つ目のエクスプローラは、「SampleProject」プロジェクトの場所を開く。
(例の場合は、「(マイドキュメント)\Visual Studio 2010\Projects\SampleSolution\SampleProject\」)。


1つ目のエクスプローラで「PlusleSeedCalculator.Library.dll」をコピーし、2つ目のエクスプローラに貼り付ける。


Visual C# に戻り、ソリューションエクスプローラで、SampleProjectプロジェクトの中の「参照設定」を右クリック→「参照の追加(F)」。
「参照の追加」ウィンドウで、「参照」タブを選択。
先ほどコピペした「PlusleSeedCalculator.Library.dll」を選択して「OK」。


インターフェースの継承

ソリューションエクスプローラでSampleProjectプロジェクトを右クリックし、「追加(D)」→「ユーザー コントロール(U)」を選択。
名前欄にユーザーコントロールのクラス名を入力して「OK」。
(例として、「SamplePluginControl」として説明する。入力した名前に適時読み替えてください。)


また、ソリューションエクスプローラでSampleProjectプロジェクトを右クリックし、「追加(D)」→「クラス(C)」を選択。
名前欄にプラグインのクラス名を入力する*3
(例として、「SamplePlugin」として説明する。入力した名前に適時読み替えてください。)


作成した SamplePlugin.cs を開き(自動的に開かれるはず)、クラスのアクセスレベルを public に変更し、クラスに「PlusleSeedCalculator.Library.IPlugin」を継承する。

  • 具体的には、以下のように変更する。
    • 変更前: class SamplePlugin {
    • 変更後: public class SamplePlugin : PlusleSeedCalculator.Library.IPlugin {

さらに、いま追加した「PlusleSeedCalculator.Library.IPlugin」の部分を右クリックし、「インターフェースの実装(I)」→「インターフェースの実装(M)」を選択。



同様にして、クラスをもう1つ追加し(例として、「SampleCalculator」とする)、アクセスレベルを変更し、「PlusleSeedCalculator.Library.ICalculator」を継承する。

インターフェースの実装

検索内容にしたがって、SamplePlugin,SampleCalculator,SamplePluginControlを実装します。
サンプルソースや公開中のプラグインに付属のソースなどを参考に実装してください。
なお、ライブラリのクラスのメソッドなどの仕様については、[http://d.hatena.ne.jp/plusletool/20121014:title=こちら」を参照。


検索内容は人それぞれのため、これ以上の解説はできないと思います。
とはいえ、分かりにくい点など多々あると思いますので、ご指摘いただければ幸いです。


【参考URL】
C#初心者はここをどうぞ。

GUIに関してはここが参考になると思います。


サンプルソース

  • SamplePlugin.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Plus.Plugin.SamplePlugin {
	public class SamplePlugin : PlusleSeedCalculator.Library.IPlugin {
		private readonly SamplePluginControl _pluginControl = new SamplePluginControl();
		private PlusleSeedCalculator.Library.IUtil _util;

		public string PluginName { get { return "サンプル"; } }
		public System.Windows.Forms.UserControl PluginControl { get { return _pluginControl; } }

		public void InitializePlugin(PlusleSeedCalculator.Library.IUtil util) {
			_util = util;

			uint min;
			_pluginControl.MinValue = uint.TryParse(_util.GetIniValue("SampleSection","Min"),out min) ? min : 0U;
			uint max;
			_pluginControl.MaxValue = uint.TryParse(_util.GetIniValue("SampleSection","Max"),out max) ? max : 0xFFFFFFFFU;

			return;
		}
		public void FinalizePlugin() {
			_util.SetIniValue("SampleSection","Min",_pluginControl.MinValue.ToString());
			_util.SetIniValue("SampleSection","Max",_pluginControl.MaxValue.ToString());

			return;
		}

		public PlusleSeedCalculator.Library.ICalculator GetCalculator() {
			uint minValue = _pluginControl.MinValue;
			uint maxValue = _pluginControl.MaxValue;
			return new SampleCalculator(minValue,maxValue,_util);
		}

	}
}
  • SampleCalculator.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Plus.Plugin.SamplePlugin {
	public class SampleCalculator : PlusleSeedCalculator.Library.ICalculator {
		private readonly uint _minValue;
		private readonly uint _maxValue;
		private readonly PlusleSeedCalculator.Library.IUtil _util;

		public SampleCalculator(uint minValue,uint maxValue,PlusleSeedCalculator.Library.IUtil util) {
			_minValue = minValue;
			_maxValue = maxValue;
			_util = util;
		}

		public string HtmlPageTitle { get { return "ページタイトルのサンプル"; } }
		public string HtmlHeaderTitle { get { return "見出しタイトルのサンプル"; } }
		public string HtmlStyleSheet {
			get {
				return
@"table td.match,
table td span.match{
	background-color: #ccccff;
}
table td.mismatch,
table td span.mismatch{
	color: red;
}
";
			}
		}
		public PlusleSeedCalculator.Library.Result Header {
			get {
				return new PlusleSeedCalculator.Library.Result(
					new PlusleSeedCalculator.Library.ResultData("結果")
				);
			}
		}

		public bool Calculate(ulong seed,out PlusleSeedCalculator.Library.Result result) {
			// seedの消費
			seed = _util.GetNextSeed(seed);
			// 性格値乱数
			uint rand = _util.GetSeikakuchiRand(seed);
			// 乱数判定
			bool b = _minValue <= rand && rand <= _maxValue;

			// 結果を代入
			PlusleSeedCalculator.Library.ResultData datum = new PlusleSeedCalculator.Library.ResultData(b ? "○" : "×");
			result = new PlusleSeedCalculator.Library.Result(datum);

			return b;
		}

	}
}
  • SamplePluginControl.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace Plus.Plugin.SamplePlugin {
	public partial class SamplePluginControl : UserControl {
		public SamplePluginControl() {
			InitializeComponent();
		}

		public uint MinValue {
			get { return (uint)numericUpDown1.Value; }
			set { numericUpDown1.Value = value; }
		}
		public uint MaxValue {
			get { return (uint)numericUpDown2.Value; }
			set { numericUpDown2.Value = value; }
		}

	}
}

プラグインの完成

メニューバーから「デバッグ(D)」→「ソリューションのビルド(B)」を選択。
ステータスバーに「ビルド失敗」と表示されたら、「エラー一覧」のエラーメッセージにしたがって修正。
ステータスバーに「ビルド正常終了」と表示されたら成功。


エクスプローラを開き、プロジェクトの場所を開き、「bin\Release\」フォルダへ移動。
(例の場合は「(マイドキュメント)\Visual Studio 2010\Projects\SampleSolution\SampleProject\bin\Release\」)。
その中に拡張子「.dll」のファイルが2つある(はず)。
一方は「PlusleSeedCalculator.Library.dll」で、これはライブラリを定義したファイル。
もう一方(例の場合は、「Plus.Plugin.SamplePlugin.dll」)がいま作成したプラグインファイルで、このファイルを使用(または配布・公開)します。


なお、html出力でcssを使用したい場合は、これとは別にcssファイルも作成してください。
その場合、ファイル名は「(プラグインのクラスの完全名).css」になります。
(例の場合は、「Plus.Plugin.SamplePlugin.SamplePlugin.css」)。


作成したプラグインの配布・公開は自由ですが、できれば使い方やインストール方法などの説明をどこかに書いてください。
なお、作者への連絡などは不要ですが、こちらに一言いただければ、このブログで簡単なプラグイン紹介をさせていただきます。

質問・要望など

プラグイン作成に関する質問、プラグインのライブラリに関する要望、その他ご意見がありましたら、このコメント欄にどうぞ。

*1:どうしても他のバージョンを使用したい場合は、必ずプラグインのreadmeなどに必要なバージョンを明記してください。

*2:ホントは削除しなくてもできるけど、説明が面倒なので一旦削除する。名前空間とかクラス名とかusingとかが分かる人は自由にやって構いません。

*3:プラグインのクラス名は、iniファイルとcssファイルのファイル名としても使用されます。(例の場合、「Plus.Plugin.SamplePlugin.SamplePlugin.ini」「Plus.Plugin.SamplePlugin.SamplePlugin.css」。)