/// <summary> /// 获取代表 function 的 JsValue /// </summary> /// <param name="jsExecState"></param> /// <param name="function">long (IntPtr jsExecState, long obj, jsValue[] args)</param> /// <returns></returns> public static JsValue FunctionValue(IntPtr jsExecState, jsCallAsFunction function) { if (function == null) { return(MBApi.jsUndefined()); } IntPtr pData = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(jsData))); if (pData == IntPtr.Zero) { return(MBApi.jsUndefined()); } jsData jd = new jsData(); jd.typeName = "function"; sm_jsCallAsFunctionDictionary[pData] = new jsCallAsFunctionCallback((IntPtr es, Int64 obj, IntPtr args, int argCount) => { JsValue[] argsValue = new JsValue[argCount]; for (int i = 0; i < argCount; i++) { argsValue[i] = MBApi.jsArg(es, i); } return(function(es, obj, argsValue)); }); jd.callAsFunction = sm_jsCallAsFunctionDictionary[pData]; jd.finalize = sm_finalize; Marshal.StructureToPtr(jd, pData, false); return(MBApi.jsFunction(jsExecState, pData)); }
public long CreateFunction(IntPtr es, jsCallAsFunctionCallback fun) { jsData data = new jsData(); data.callAsFunction = fun; data.propertyGet = null; data.propertySet = null; data.finalize = _disposed; var size = Marshal.SizeOf(typeof(jsData)); var ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(data, ptr, true); var v = MBApi.jsFunction(es, ptr); return(v); }
/// <summary> /// 获取代表 object 的 JsValue /// </summary> /// <param name="jsExecState"></param> /// <param name="jsObj">继承此类,Overite 方法</param> /// <returns></returns> public static JsValue ObjectValue(IntPtr jsExecState, JsObject jsObj) { if (jsObj == null) { return(MBApi.jsUndefined()); } IntPtr pData = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(jsData))); if (pData == IntPtr.Zero) { return(MBApi.jsUndefined()); } jsData jd = new jsData(); jd.typeName = "object"; jd.propertyGet = jsObj._jsGetProperty; jd.propertySet = jsObj._jsSetProperty; jd.finalize = jsObj._jsFinalize; Marshal.StructureToPtr(jd, pData, false); return(MBApi.jsObject(jsExecState, pData)); }
public CSharpMethodInfo(IntPtr es, object obj, MethodInfo methodInfo) { _obj = obj; _webView = MBApi.jsGetWebView(es); _methodInfo = methodInfo; _methodCall = new jsCallAsFunctionCallback(OnMethodCall); _jsFinalizeCallback = new jsFinalizeCallback(OnMehtodDispose); jsData data = new jsData(); data.typeName = new byte[100]; data.finalize = _jsFinalizeCallback; data.callAsFunction = _methodCall; var s = Marshal.SizeOf(typeof(jsData)); var ptr = Marshal.AllocHGlobal(s); Marshal.StructureToPtr(data, ptr, true); _jsValue = MBApi.jsFunction(es, ptr); MBApi.jsAddRef(es, _jsValue); }
public static long ToJsValue(this object obj, BlinkBrowser miniblink, IntPtr es) { if (obj == null) { return(BlinkBrowserPInvoke.jsUndefined()); } if (obj is int) { return(BlinkBrowserPInvoke.jsInt((int)obj)); } if (obj is bool) { return(BlinkBrowserPInvoke.jsBoolean((bool)obj)); } if (obj is double) { return(BlinkBrowserPInvoke.jsDouble((double)obj)); } if (obj is decimal) { var dec = (decimal)obj; if (dec.ToString().Contains(".")) { return(ToJsValue(Convert.ToDouble(dec.ToString()), miniblink, es)); } else { return(ToJsValue(Convert.ToInt32(dec.ToString()), miniblink, es)); } } if (obj is long) { return(ToJsValue(obj.ToString(), miniblink, es)); } if (obj is float) { return(BlinkBrowserPInvoke.jsFloat((float)obj)); } if (obj is DateTime) { return(BlinkBrowserPInvoke.jsDouble(((DateTime)obj).ToLong())); } if (obj is string) { return(BlinkBrowserPInvoke.jsString(es, obj.ToString())); } if (obj is IEnumerable) { var list = new List <object>(); foreach (var item in (IEnumerable)obj) { list.Add(item); } var array = BlinkBrowserPInvoke.jsEmptyArray(es); BlinkBrowserPInvoke.jsSetLength(es, array, list.Count); for (var i = 0; i < list.Count; i++) { BlinkBrowserPInvoke.jsSetAt(es, array, i, list[i].ToJsValue(miniblink, es)); } return(array); } if (obj is Delegate) { var func = (Delegate)obj; var funcptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(jsData))); var jsfunc = new jsCallAsFunctionCallback( (fes, fobj, fargs, fcount) => { if (func is TempNetFunc) { var fps = new List <object>(); for (var i = 0; i < fcount; i++) { fps.Add(BlinkBrowserPInvoke.jsArg(fes, i).ToValue(miniblink, fes)); } return(((TempNetFunc)func)(fps.ToArray()).ToJsValue(miniblink, fes)); } else { var fps = new object[func.Method.GetParameters().Length]; for (var i = 0; i < fcount && i < fps.Length; i++) { fps[i] = BlinkBrowserPInvoke.jsArg(fes, i).ToValue(miniblink, fes); } var rs = func.Method.Invoke(func.Target, fps); return(rs.ToJsValue(miniblink, fes)); } }); var funcdata = new jsData { typeName = "function", callAsFunction = jsfunc, finalize = FunctionFinalize }; _keepref.Add(funcptr.ToInt64(), funcdata); Marshal.StructureToPtr(funcdata, funcptr, false); return(BlinkBrowserPInvoke.jsFunction(es, funcptr)); } var jsobj = BlinkBrowserPInvoke.jsEmptyObject(es); var ps = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (var p in ps) { var v = p.GetValue(obj, null); if (v == null) { continue; } BlinkBrowserPInvoke.jsSet(es, jsobj, p.Name, v.ToJsValue(miniblink, es)); } return(jsobj); }