0

私は1つのコンソールアプリケーションを作成しました。その中で、Jint-JavaScript Interpreterを使用してjavascript関数を実行しました。しかし、javascriptでactivexobjectを使用すると、エラーが発生します。コードは次のとおりです。

string  script= @"
                  function square() { 
                    MyObject = new ActiveXObject( 'WScript.Shell' );
                    MyObject.Run('file:///D:/test/Tools/ofc.exe D:/test/Tools/ofc.ini') ; 
                    return 2 * 2; 
                  };

                  return square();
                  ";

var result = new JintEngine()
                  .Run(script);

どうすればこれを行うことができますか?

4

1 に答える 1

1

Jint は何が何だかわからないActiveXObjectので、Jint に伝えなければなりません。JintEngineJavaScript コンストラクターとして扱うことができるものを に渡すことができるかどうかはわかりませんが、特定の 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 を取得できないと思います)。RunMethodInfo

別のアプローチは、単に呼び出す関数を登録することです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);

それが役立つことを願っています。

于 2011-05-17T06:44:35.863 に答える