Джинт не знает, что такое 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);
Надеюсь, это поможет.