/// <summary> /// Executes a script, automatically storing the script value within an ExternalArrayBuffer. /// </summary> /// <remarks> /// This extension method exists for simplicity. /// </remarks> /// <param name="jsrt"></param> /// <param name="script"></param> /// <param name="sourceContext"></param> /// <param name="sourceUrl"></param> /// <param name="parseAttributes"></param> /// <param name="result"></param> /// <returns>A JavaScriptValueSafeHandle containing the result.</returns> public static JavaScriptValueSafeHandle JsRunScript(this IJavaScriptEngine jsrt, string script, JavaScriptSourceContext sourceContext = default(JavaScriptSourceContext), string sourceUrl = null, JavaScriptParseScriptAttributes parseAttributes = JavaScriptParseScriptAttributes.None) { var ptrScript = Marshal.StringToHGlobalAnsi(script); JavaScriptObjectFinalizeCallback callback = (IntPtr ptr) => { //Release pinned string. Marshal.FreeHGlobal(ptrScript); }; var scriptHandle = jsrt.JsCreateExternalArrayBuffer(ptrScript, (uint)script.Length, callback, IntPtr.Zero); if (sourceContext == default(JavaScriptSourceContext)) { sourceContext = JavaScriptSourceContext.None; } JavaScriptValueSafeHandle sourceUrlHandle; if (string.IsNullOrWhiteSpace(sourceUrl)) { sourceUrl = "[eval code]"; } sourceUrlHandle = jsrt.JsCreateString(EvalSourceUrl, (ulong)EvalSourceUrl.Length); if (parseAttributes == default(JavaScriptParseScriptAttributes)) { parseAttributes = JavaScriptParseScriptAttributes.None; } try { return(jsrt.JsRun(scriptHandle, sourceContext, sourceUrlHandle, parseAttributes)); } finally { //Release variables created during this operation. sourceUrlHandle.Dispose(); scriptHandle.Dispose(); } }
public void JsRunDoesRun() { var script = "(()=>{return 6*7;})()"; string sourceUrl = "[eval code]"; using (var runtimeHandle = Engine.JsCreateRuntime(JavaScriptRuntimeAttributes.None, null)) { using (var contextHandle = Engine.JsCreateContext(runtimeHandle)) { Engine.JsSetCurrentContext(contextHandle); IntPtr ptrScript = Marshal.StringToHGlobalAnsi(script); try { var scriptHandle = Engine.JsCreateExternalArrayBuffer(ptrScript, (uint)script.Length, null, IntPtr.Zero); JavaScriptSourceContext sourceContext = JavaScriptSourceContext.None; var sourceUrlHandle = Engine.JsCreateString(sourceUrl, (ulong)sourceUrl.Length); var resultHandle = Engine.JsRun(scriptHandle, sourceContext, sourceUrlHandle, JavaScriptParseScriptAttributes.None); Assert.True(resultHandle != JavaScriptValueSafeHandle.Invalid); var handleType = Engine.JsGetValueType(resultHandle); Assert.True(handleType == JsValueType.Number); var resultValue = Engine.JsNumberToInt(resultHandle); Assert.True(resultValue == 42); resultHandle.Dispose(); sourceUrlHandle.Dispose(); scriptHandle.Dispose(); } finally { Marshal.FreeHGlobal(ptrScript); } } } }