Show page source of CommandImplementation #87997

'''このページはドラフトです。'''
{{{
コマンドは、スクリプトからパラメータを受け取り、結果を返します。

例えばパラメータの正弦を返すコマンドは、次のように実装できます。

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 やそのメンバへのアクセスがコマンドで必要であるならば、内部変数を用意してインスタンスを保存してください。
}}}