2011-03-02 13 views
0

私は作成された1つのコンソールアプリケーションを持っており、Jint-JavaScriptインタプリタを使ってjavascript関数を実行していました。しかし、私はそれは私のコードをエラーを与えるJavaScriptでActiveXオブジェクトを使用する場合である:は、Jintを使用してexeファイルを実行します - Javascriptインタプリタ

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); 

誰も私がこれをどのように行うことができます教えてもらえますか?

+0

エラーは何ですか? –

+0

エラー:ActiveXObjectが定義されていません 行:3文字:20 ソースコードがありません –

答えて

1

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を呼び出す関数を登録することであるかもしれません

希望に役立ちます。

関連する問題