Jintは、ActiveXObject
が何であるかわからないので、Jintに伝える必要があります。あなたがJavaScriptのコンストラクタとして扱うことができJintEngine
に何かを渡すことができるかどうかは知りませんが、特定のCOMプログラムIDのインスタンスを作成するカスタム関数を登録することができます。
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
内の関数として、この方法は:それはエラーがメソッドが定義されていないと言って私の例では失敗しMyObject.Run
を呼び出そうとした場合
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は、リフレクションを使用しています。実行。私はRun
がCOM-Interopと反射が難しい(私はMethodInfo
を基になるCOMタイプから取り出すことができないと思うので)呼び出すことができないと思う。 (: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});
}
}
は、スクリプト(run
として登録)あなたからShellRun
を呼び出す:
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);
別のアプローチは、単純にWScript.Shell.Run
を呼び出す関数を登録することであるかもしれません
希望に役立ちます。
エラーは何ですか? –
エラー:ActiveXObjectが定義されていません 行:3文字:20 ソースコードがありません –