Jint は何が何だかわからないActiveXObject
ので、Jint に伝えなければなりません。JintEngine
JavaScript コンストラクターとして扱うことができるものを に渡すことができるかどうかはわかりませんが、特定の COM ProgId のインスタンスを作成するカスタム関数を登録できます。
private delegate object CreateActiveXObjectDelegate(string progId);
private static object CreateActiveXObject(string progId)
{
var type = Type.GetTypeFromProgID(progId);
if(type!=null)
{
return Activator.CreateInstance(type);
} else
{
return null; // alternatively throw an exception or whatever is suitable in your situation
}
}
次に、このメソッドを関数として登録JintEngine
し、スクリプトから呼び出すことができます。
string script = @"
function square() {
MyObject = createActiveXObject('WScript.Shell' );
MyObject.Run('whatever');
return 2 * 2;
};
return square();
";
var jintEngine = new JintEngine();
jintEngine.DisableSecurity(); // required, cannot tell why exactly
jintEngine.SetFunction("createActiveXObject", (CreateActiveXObjectDelegate)CreateActiveXObject);
var result = jintEngine.Run(script);
Jint は を呼び出そうとするときにリフレクションを使用しますが、私の例では Method isn't defined: RunMyObject.Run
というエラーで失敗します。COM-Interop とリフレクションが複雑になる可能性があるため、呼び出しが機能しないのではないかと思います (基になる COM 型から s を取得できないと思います)。Run
MethodInfo
別のアプローチは、単に呼び出す関数を登録することですWScript.Shell.Run
(または、より良い: System.Diagnostics.Process.Start
):
private delegate void Runner(string progId);
private static void ShellRun(string command)
{
var type = Type.GetTypeFromProgID("WScript.Shell");
if(type!=null)
{
var shell = Activator.CreateInstance(type);
type.InvokeMember("Run", BindingFlags.InvokeMethod, null, shell, new object[] {command});
}
}
次にShellRun
、スクリプトから呼び出します(として登録されていますrun
):
string script = @"
function square() {
run('whatever');
return 2 * 2;
};
return square();
";
var jintEngine = new JintEngine();
jintEngine.DisableSecurity(); // required, cannot tell why exactly
jintEngine.SetFunction("run", (Runner)ShellRun);
var result = jintEngine.Run(script);
それが役立つことを願っています。