예제 #1
0
        /// <summary>
        /// 注册Lua方法
        /// </summary>
        /// <param name="methodName">方法名称</param>
        /// <param name="handler">事件处理器</param>
        public void registerMethod(string methodName, LuaMethodHandler handler)
        {
            _methodHandlers [methodName] = handler;

            if (_methodHandleDelegate == null)
            {
                _methodHandleDelegate = new LuaMethodHandleDelegate(luaMethodRoute);
            }

            IntPtr fp = Marshal.GetFunctionPointerForDelegate(_methodHandleDelegate);

            NativeUtils.registerMethod(_nativeObjectId, methodName, fp);
        }
예제 #2
0
        /// <summary>
        /// Lua方法处理器
        /// </summary>
        /// <returns>返回值</returns>
        /// <param name="methodName">方法名称</param>
        /// <param name="arguments">参数列表</param>
        private IntPtr luaMethodHandler(string methodName, IntPtr args, int size)
        {
            if (_methodHandlers.ContainsKey(methodName))
            {
                //反序列化参数列表
                LuaObjectDecoder decoder = new LuaObjectDecoder(args, size);
                int argSize = decoder.readInt32();

                List <LuaValue> argumentsList = new List <LuaValue> ();
                for (int i = 0; i < argSize; i++)
                {
                    LuaValue value = decoder.readObject() as LuaValue;
                    argumentsList.Add(value);
                }

                LuaMethodHandler handler  = _methodHandlers [methodName];
                LuaValue         retValue = handler(argumentsList);

                if (retValue == null)
                {
                    retValue = new LuaValue();
                }

                LuaObjectEncoder encoder = new LuaObjectEncoder();
                encoder.writeObject(retValue);

                byte[] bytes = encoder.bytes;
                IntPtr retPtr;
                retPtr = Marshal.AllocHGlobal(bytes.Length);
                Marshal.Copy(bytes, 0, retPtr, bytes.Length);

                return(retPtr);
            }

            return(IntPtr.Zero);
        }