/// <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); }
/// <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); }