private object ExecuteWithScriptArgs(ExpressionScriptProvided expressionScript, ScriptArgs args) { using (var engine = new Microsoft.ClearScript.Windows.JScriptEngine()) { var primitives = new ExpandoObject(); var primitivesAsDictionary = (IDictionary <string, object>)primitives; foreach (var binding in args.Bindings) { if (IsPrimitive(binding.Value)) { primitivesAsDictionary.Add(binding.Key, binding.Value); } else { engine.AddHostObject(binding.Key, binding.Value); } } ExposeTypesToEngine(engine); engine.AddHostObject("__variables", primitives); engine.AddHostObject("host", new XHostFunctions()); engine.AddHostObject("debug", new DebugFunctions(this)); var writer = new StringWriter(); WritePolyfills(writer); writer.WriteLine("var __result = (function() {"); foreach (var binding in primitivesAsDictionary) { writer.WriteLine("var {0} = __variables.{0};", binding.Key); } writer.WriteLine(expressionScript.Expression); writer.WriteLine("})();"); engine.Execute(writer.ToString()); var result = engine.Script.__result; if ((result is VoidResult) || (result is Undefined)) { return(null); } return(result); } }
public static void StartScript(string script, List<int> identEnts) { var scriptEngine = new JScriptEngine(); var collection = new HostTypeCollection(Assembly.LoadFrom("scripthookvdotnet.dll"), Assembly.LoadFrom("scripts\\NativeUI.dll")); scriptEngine.AddHostObject("API", collection); scriptEngine.AddHostObject("host", new HostFunctions()); scriptEngine.AddHostObject("script", new ScriptContext()); scriptEngine.AddHostType("Enumerable", typeof(Enumerable)); scriptEngine.AddHostType("List", typeof(IList)); scriptEngine.AddHostType("KeyEventArgs", typeof(KeyEventArgs)); scriptEngine.AddHostType("Keys", typeof(Keys)); foreach (var obj in identEnts) { var name = PropStreamer.Identifications[obj]; if (MapEditor.IsPed(new Prop(obj))) scriptEngine.AddHostObject(name, new Ped(obj)); else if (MapEditor.IsVehicle(new Prop(obj))) scriptEngine.AddHostObject(name, new Vehicle(obj)); else if (MapEditor.IsProp(new Prop(obj))) scriptEngine.AddHostObject(name, new Prop(obj)); } try { scriptEngine.Execute(script); } catch (ScriptEngineException ex) { LogException(ex); } finally { lock (ScriptEngines) ScriptEngines.Add(scriptEngine); } }
//---------------------------------------------------------------------------------------------- public static IntPtr CreateScope() { // まだエンジンが作られていなければ if (engine == null) { try { // Standardモードのコンプライアンスまで引き上げる engine = new Microsoft.ClearScript.Windows.JScriptEngine(Microsoft.ClearScript.Windows.WindowsScriptEngineFlags.EnableStandardsMode | Microsoft.ClearScript.Windows.WindowsScriptEngineFlags.EnableDebugging); engine.AddHostObject("clr", new HostTypeCollection("mscorlib", "System", "System.Core")); engine.AddHostObject("host", new ExtendedHostFunctions()); engine.AddHostObject("AssemblyPath", new List <String>()); hm = new Hidemaru(); engine.AddHostType("hm", typeof(Hidemaru)); console = new hmJSConsole(); engine.AddHostType("console", typeof(hmJSConsole)); // ヒアドキュメント用の関数 R(text) String expression = @" function R(text){ return text.toString().match(/\/\*([\s\S]*)\*\//)[1].toString(); } "; engine.Execute(expression); dpr = new DllPathResolver(); return((IntPtr)1); } catch (Exception e) { OutputDebugStream(e.Message); return((IntPtr)0); } } return((IntPtr)1); }
private static void ExecuteScript(UserScript script, ScriptHost scriptHost, Logger logger, object[] args) { try { //var engine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging); var engine = new JScriptEngine(); engine.AddHostObject("host", scriptHost); string initArgsScript = string.Format("var arguments = {0};", args.ToJson()); engine.Execute(initArgsScript); engine.Execute(script.Body); } catch (Exception ex) { var messge = string.Format("Error in user script {0}", script.Name); logger.ErrorException(messge, ex); } }
public void JScriptEngine_Current() { // ReSharper disable AccessToDisposedClosure using (var innerEngine = new JScriptEngine()) { engine.Script.test = new Action(() => { innerEngine.Script.test = new Action(() => Assert.AreSame(innerEngine, ScriptEngine.Current)); Assert.AreSame(engine, ScriptEngine.Current); innerEngine.Execute("test()"); innerEngine.Script.test(); Assert.AreSame(engine, ScriptEngine.Current); }); Assert.IsNull(ScriptEngine.Current); engine.Execute("test()"); engine.Script.test(); Assert.IsNull(ScriptEngine.Current); } // ReSharper restore AccessToDisposedClosure }
public void JScriptEngine_AddCOMType_XMLHTTP() { int status = 0; string data = null; var thread = new Thread(() => { using (var testEngine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.EnableStandardsMode)) { testEngine.Script.onComplete = new Action<int, string>((xhrStatus, xhrData) => { status = xhrStatus; data = xhrData; Dispatcher.ExitAllFrames(); }); Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => { // ReSharper disable AccessToDisposedClosure testEngine.AddCOMType("XMLHttpRequest", "MSXML2.XMLHTTP"); testEngine.Execute(@" xhr = new XMLHttpRequest(); xhr.open('POST', 'http://httpbin.org/post', true); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { onComplete(xhr.status, JSON.parse(xhr.responseText).data); } }; xhr.send('Hello, world!'); "); // ReSharper restore AccessToDisposedClosure })); Dispatcher.Run(); } }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join(); Assert.AreEqual(200, status); Assert.AreEqual("Hello, world!", data); }
public void JScriptEngine_MarshalArraysByValue_invokeMethod() { var args = new[] { Math.PI, Math.E }; engine.Script.args = args; engine.Execute("function foo(a, b) { return a * b; }"); Assert.AreEqual(Math.PI * Math.E, engine.Evaluate("EngineInternal.invokeMethod(null, foo, args)")); engine.Dispose(); engine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.MarshalArraysByValue); engine.Script.args = args; engine.Execute("function foo(a, b) { return a * b; }"); Assert.AreEqual(Math.PI * Math.E, engine.Evaluate("EngineInternal.invokeMethod(null, foo, args)")); }
public void JScriptEngine_MarshalArraysByValue() { var foo = new[] { DayOfWeek.Saturday, DayOfWeek.Friday, DayOfWeek.Thursday }; engine.Script.foo = foo; Assert.AreSame(foo, engine.Evaluate("foo")); engine.Dispose(); engine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.MarshalArraysByValue); engine.Script.foo = foo; Assert.AreNotSame(foo, engine.Evaluate("foo")); engine.Execute("foo = new VBArray(foo)"); Assert.AreEqual(foo.GetUpperBound(0), engine.Evaluate("foo.ubound(1)")); for (var index = 0; index < foo.Length; index++) { Assert.AreEqual(foo[index], engine.Evaluate("foo.getItem(" + index + ")")); } }