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
どちらもステートメントを入力しないとエラーになりました.