C# で ScriptControl を使って VBScript を実行する

ついでに,C# で実装したクラスのオブジェクトをスクリプト側から利用します.


公開側では,

  • プロジェクト種別を「クラスライブラリ」にして,プロジェクトを作成
  • プロジェクトの [プロパティ - アプリケーション - 出力の種類(U) - アセンブリ情報(I)] で [アセンブリを COM 参照可能にする(M)] を ON
  • プロジェクトの [プロパティ - ビルド - 出力] で [COM 相互運用機能の登録(C)] を ON


以下のような感じで実装 (参考:http://msdn.microsoft.com/ja-jp/library/c3fd4a20.aspx)

    public interface ITest
    {
        String Text
        {
            set;
            get;
        }
    }

    [ClassInterface(ClassInterfaceType.None)]
    public class Test : ITest
    {
        private String text = "ほげ";

        #region ITest メンバ

        public string Text
        {
            get
            {
                return this.text;
            }
            set
            {
                this.text = value;
            }
        }

        #endregion
    }


利用側では,

  • "Microsoft Script Control 1.0" を参照設定
  • 公開側プロジェクトが生成するアセンブリを参照設定


以下のような感じで利用

    class Program
    {
        static void Main(string[] args)
        {
            IScriptControl ctrl = new ScriptControl();
            ctrl.Language = "VBScript";

            ITest test = new Test();
            ctrl.AddObject("Test", test, false);

            ctrl.AddCode("Test.Text = \"ふぉー\"");
            Object value = ctrl.Eval("Test.Text");
            System.Console.WriteLine(value);
        }
    }


VBScript 側のプロシージャに引数を渡す場合は,"Run" メソッドを使う.


"AddObject" メソッドの説明については,以下のページぐらいしか見つけられなかった.
http://www.jose.it-berater.org/smfforum/index.php?topic=1048.0


あと,"AddCode" と "ExecuteStatement" の違いがよくわかりません...orz
どちらもステートメントを入力しないとエラーになりました.