我有一个创建的一个控制台应用程序,并且我使用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);
谁能告诉我该怎么做?
答案 0 :(得分:1)
Jint不知道ActiveXObject
是什么,所以你必须告诉Jint。我不知道你是否可以将某些东西传递给可以被视为JavaScript构造函数的JintEngine
,但是你可以注册一个自定义函数来为给定的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
时使用了反射,这在我的示例中失败,并显示方法未定义的错误:运行。我怀疑调用Run
不起作用,因为COM-Interop和反射可能会变得棘手(我认为无法从基础COM类型中检索MethodInfo
)。
一种不同的方法可能是注册一个只调用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);
希望有所帮助。