'''このページはドラフトです。'''
{{{
コマンドは、スクリプトからパラメータを受け取り、結果を返します。
例えばパラメータの正弦を返すコマンドは、次のように実装できます。
private static ScriptValue cmdSin(ScriptValue[] @params)
{
return Math.Sin(@params[0].AsDouble());
}
params という予約語を引数名として使用している理由は、ただ開発上の経緯によるもので、当然強制されるものではありません。当初は VB を使っていたため、予約語ではありませんでした。
cmdSin は、スクリプトから 1 個のパラメータを受け取ります。それは期待通りに double かも知れないし、int かも知れませんが、いずれの場合も AsDouble メソッドで double に変換されます。
そして Math.Sin で得られた正弦が、暗黙的に ScriptValue へと変換され、スクリプトにコマンドの結果として返されます。
cmdSin をプラグインのコマンド Sin として提供する場合、IHasCommand インターフェースを実装するクラスを定義します。例えば次のようにします。
public class MathUtil : IHasCommand
{
public void SetTarget(ScriptEngine obj)
{
}
private static ScriptValue cmdSin(ScriptValue[] @params)
{
return Math.Sin(@params[0].AsDouble());
}
public IDictionary<string, CommandImpl> GetCommandMap()
{
Dictionary<string, CommandImpl> dic = new Dictionary<string, CommandImpl>();
dic.Add("Sin", cmdSin);
return dic;
}
}
このクラスを含む dll を作成し、plugin フォルダに入れておきます。すると ScriptManager が dll 内のパブリックなクラスを検索し、IHasCommand を持つものがあればそのインスタンスを生成します。それからスクリプトエンジンが初期化される際に、SetTarget および GetCommandMap が呼び出され、コマンド名と実際のメソッドとが関連付けられた IDictionary がスクリプトエンジンに登録され、スクリプトから呼び出すことが可能になります。
この実装での SetTarget は何もしませんが、もし ScriptEngine やそのメンバへのアクセスがコマンドで必要であるならば、内部変数を用意してインスタンスを保存してください。
}}}