выполнить исполняемый файл, используя Jint - Javascript Interpreter - PullRequest
0 голосов
/ 02 марта 2011

У меня есть одно консольное приложение, и я использовал Jint - JavaScript Interpreter для запуска функции JavaScript. но когда я использую activexobject в 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);

Может кто-нибудь сказать мне, как я могу это сделать?

1 Ответ

1 голос
/ 17 мая 2011

Джинт не знает, что такое ActiveXObject, поэтому вы должны сказать Джинту. Я не знаю, можете ли вы передать что-то в 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 использует рефлексию, когда пытается вызвать MyObject.Run, что в моем примере заканчивается ошибкой: 1011 * Метод не определен: Run . Я подозреваю, что вызов Run не работает, потому что COM-Interop и отражение могут стать хитрыми (я думаю, MethodInfo s не может быть получено из базового типа COM).

Другой подход может заключаться в регистрации функции, которая просто вызывает 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);

Надеюсь, это поможет.

...