Esempio n. 1
0
        /// <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));
        }
Esempio n. 2
0
        public void Init()
        {
            if (MBApi.wkeIsInitialize() == 0)
            {
                MBApi.wkeInitialize();
            }
            _disposed            = new jsFinalizeCallback(OnDispose);
            _loadLib             = new jsCallAsFunctionCallback(OnLoadLib);
            _createObj           = new jsCallAsFunctionCallback(OnCreateObject);
            _createComObj        = new jsCallAsFunctionCallback(OnCreateComObj);
            _applicationExit     = new jsCallAsFunctionCallback(OnApplicationExit);
            _getCurrentProcessId = new jsCallAsFunctionCallback(OnGetProcessId);
            _createControl       = new jsCallAsFunctionCallback(OnCreateControl);
            _changeControl       = new jsCallAsFunctionCallback(OnChangeControl);

            e_loadLib             = new wkeJsNativeFunction(GetOnLoadLib);
            e_createObj           = new wkeJsNativeFunction(GetOnCreateObject);
            e_createComObj        = new wkeJsNativeFunction(GetOnCreateComObj);
            e_applicationExit     = new wkeJsNativeFunction(GetOnApplicationExit);
            e_getCurrentProcessId = new wkeJsNativeFunction(GetOnGetProcessId);
            e_createControl       = new wkeJsNativeFunction(GetOnCreateControl);
            e_changeControl       = new wkeJsNativeFunction(GetOnChangeControl);
            MBApi.wkeJsBindGetter("_loadAssembly", e_loadLib, IntPtr.Zero);
            MBApi.wkeJsBindGetter("_createObject", e_createObj, IntPtr.Zero);
            MBApi.wkeJsBindGetter("_createComObject", e_createComObj, IntPtr.Zero);
            MBApi.wkeJsBindGetter("_createControl", e_createControl, IntPtr.Zero);
            MBApi.wkeJsBindGetter("_changeControl", e_changeControl, IntPtr.Zero);
            MBApi.wkeJsBindGetter("_getCurrentProcessId", e_getCurrentProcessId, IntPtr.Zero);
            MBApi.wkeJsBindGetter("_appExit", e_applicationExit, IntPtr.Zero);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        public static long ToJsValue(this object obj, IntPtr es)
        {
            if (obj == null)
            {
                return(MBApi.jsUndefined());
            }
            if (obj is int)
            {
                return(MBApi.jsInt((int)obj));
            }
            if (obj is bool)
            {
                return(MBApi.jsBoolean((bool)obj));
            }
            if (obj is double || obj is decimal)
            {
                return(MBApi.jsDouble((double)obj));
            }
            if (obj is float)
            {
                return(MBApi.jsFloat((float)obj));
            }
            if (obj is DateTime)
            {
                return(MBApi.jsDouble(((DateTime)obj).ToLong()));
            }
            if (obj is string)
            {
                return(MBApi.jsString(es, obj.ToString()));
            }
            if (obj is IEnumerable)
            {
                var list = new List <object>();
                foreach (var item in (IEnumerable)obj)
                {
                    list.Add(item);
                }
                var array = MBApi.jsEmptyArray(es);
                MBApi.jsSetLength(es, array, list.Count);
                for (var i = 0; i < list.Count; i++)
                {
                    MBApi.jsSetAt(es, array, i, list[i].ToJsValue(es));
                }
                return(array);
            }
            if (obj is TempNetFunc)
            {
                var func    = (TempNetFunc)obj;
                var funcptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(jsData)));
                var jsfunc  = new jsCallAsFunctionCallback(
                    (fes, fobj, fargs, fcount) =>
                {
                    var fps = new List <object>();
                    for (var i = 0; i < fcount; i++)
                    {
                        fps.Add(MBApi.jsArg(fes, i).ToValue(fes));
                    }
                    return(func(fps.ToArray()).ToJsValue(fes));
                });
                _keepref.Add(funcptr.ToInt64(), jsfunc);
                var funcdata = new jsData
                {
                    typeName       = "function",
                    callAsFunction = jsfunc,
                    finalize       = FunctionFinalize
                };
                Marshal.StructureToPtr(funcdata, funcptr, false);
                return(MBApi.jsFunction(es, funcptr));
            }
            if (obj is Delegate)
            {
                return(MBApi.jsUndefined());
            }

            var jsobj = MBApi.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;
                }
                MBApi.jsSet(es, jsobj, p.Name, v.ToJsValue(es));
            }
            return(jsobj);
        }