/// <summary> /// 初始化LuaValue对象 /// </summary> /// <param name="decoder">对象解码器</param> public LuaValue(LuaObjectDecoder decoder) : base(decoder) { int contextId = decoder.readInt32(); _context = LuaContext.getContext(contextId); _tableId = decoder.readString(); _type = (LuaValueType)decoder.readInt16(); _value = null; switch (_type) { case LuaValueType.Integer: _value = decoder.readInt32(); break; case LuaValueType.Boolean: _value = decoder.readByte(); break; case LuaValueType.Number: _value = decoder.readDouble(); break; case LuaValueType.Data: _value = decoder.readBytes(); break; case LuaValueType.String: _value = decoder.readString(); break; case LuaValueType.Array: _value = readArrayList(decoder); break; case LuaValueType.Map: _value = readHashtable(decoder); break; case LuaValueType.Function: _value = decoder.readObject() as LuaFunction; break; case LuaValueType.Ptr: _value = decoder.readObject() as LuaPointer; break; case LuaValueType.Tuple: _value = decoder.readObject() as LuaTuple; break; case LuaValueType.Object: _value = decoder.readObject(); break; } }
private static void _fieldSetter(int contextId, int classId, Int64 instancePtr, string fieldName, IntPtr valueBuffer, int bufferSize) { if (instancePtr != 0) { LuaContext context = LuaContext.getContext(contextId); LuaObjectReference objRef = LuaObjectReference.findObject(instancePtr); object instance = objRef.target; LuaObjectDecoder decoder = new LuaObjectDecoder(valueBuffer, bufferSize, context); LuaValue value = decoder.readObject() as LuaValue; if (_exportsProperties.ContainsKey(classId) && _exportsProperties [classId].ContainsKey(fieldName)) { PropertyInfo propertyInfo = _exportsProperties [classId] [fieldName]; if (instance != null && propertyInfo != null && propertyInfo.CanWrite) { propertyInfo.SetValue(instance, getNativeValueForLuaValue(propertyInfo.PropertyType, value), null); } } else if (_exportsFields.ContainsKey(classId) && _exportsFields [classId].ContainsKey(fieldName)) { FieldInfo fieldInfo = _exportsFields [classId] [fieldName]; if (instance != null && fieldInfo != null) { fieldInfo.SetValue(instance, getNativeValueForLuaValue(fieldInfo.FieldType, value)); } } } }
/// <summary> /// 解码对象 /// </summary> /// <returns>对象</returns> /// <param name="objectPtr">表示C中的二进制数据缓冲区指针</param> /// <param name="size">缓冲区大小</param> public static object DecodeObject(IntPtr objectPtr, int size) { if (size > 0) { LuaObjectDecoder decoder = new LuaObjectDecoder(objectPtr, size); return(decoder.readObject()); } return(null); }
/// <summary> /// 获取全局变量 /// </summary> /// <returns>变量值.</returns> /// <param name="name">变量名称.</param> public LuaValue getGlobal(string name) { IntPtr valuePtr = IntPtr.Zero; int size = NativeUtils.getGlobal(_nativeObjectId, name, out valuePtr); if (valuePtr != IntPtr.Zero && size > 0) { LuaObjectDecoder decoder = new LuaObjectDecoder(valuePtr, size, this); return(decoder.readObject() as LuaValue); } return(new LuaValue()); }
/// <summary> /// 初始化 /// </summary> /// <param name="decoder">对象解码器</param> public LuaTuple(LuaObjectDecoder decoder) : base(decoder) { int size = decoder.readInt32(); if (size > 0) { for (int i = 0; i < size; i++) { LuaValue item = decoder.readObject() as LuaValue; if (item != null) { _returnValues.Add(item); } } } }
/// <summary> /// 初始化LuaValue对象 /// </summary> /// <param name="decoder">对象解码器</param> public LuaValue(LuaObjectDecoder decoder) { _type = (LuaValueType)decoder.readInt16(); _value = null; switch (_type) { case LuaValueType.Integer: _value = decoder.readInt32(); break; case LuaValueType.Boolean: _value = decoder.readByte(); break; case LuaValueType.Number: _value = decoder.readDouble(); break; case LuaValueType.Data: _value = decoder.readBytes(); break; case LuaValueType.String: _value = decoder.readString(); break; case LuaValueType.Array: _value = readArrayList(decoder); break; case LuaValueType.Map: _value = readHashtable(decoder); break; case LuaValueType.Object: { _value = decoder.readObject(); break; } } }
/// <summary> /// 从原生编码对象中获取参数列表 /// </summary> /// <returns>参数列表.</returns> /// <param name="context">上下文</param> /// <param name="arguments">参数缓存.</param> /// <param name="size">缓存长度.</param> protected static List <LuaValue> getArgumentList(LuaContext context, IntPtr arguments, int size) { List <LuaValue> argumentsList = null; if (arguments != IntPtr.Zero) { //反序列化参数列表 LuaObjectDecoder decoder = new LuaObjectDecoder(arguments, size, context); int argSize = decoder.readInt32(); argumentsList = new List <LuaValue> (); for (int i = 0; i < argSize; i++) { LuaValue value = decoder.readObject() as LuaValue; argumentsList.Add(value); } } return(argumentsList); }
/// <summary> /// 解析方法的参数列表 /// </summary> /// <returns>参数列表</returns> /// <param name="context">上下文对象</param> /// <param name="m">方法信息</param> /// <param name="arguments">参数列表数据</param> /// <param name="size">参数列表数据长度</param> protected static ArrayList parseMethodParameters(LuaContext context, MethodInfo m, IntPtr arguments, int size) { List <LuaValue> argumentsList = null; if (arguments != IntPtr.Zero) { //反序列化参数列表 LuaObjectDecoder decoder = new LuaObjectDecoder(arguments, size, context); int argSize = decoder.readInt32(); argumentsList = new List <LuaValue> (); for (int i = 0; i < argSize; i++) { LuaValue value = decoder.readObject() as LuaValue; argumentsList.Add(value); } } ArrayList argsArr = null; ParameterInfo[] parameters = m.GetParameters(); if (parameters.Length > 0 && argumentsList != null) { int i = 0; argsArr = new ArrayList(); foreach (ParameterInfo p in parameters) { if (i >= argumentsList.Count) { break; } object value = getNativeValueForLuaValue(p.ParameterType, argumentsList[i]); argsArr.Add(value); i++; } } return(argsArr); }
/// <summary> /// 读取一个数组列表 /// </summary> /// <returns>数组列表</returns> /// <param name="decoder">对象解码器</param> private List <LuaValue> readArrayList(LuaObjectDecoder decoder) { int size = decoder.readInt32(); if (size > 0) { List <LuaValue> list = new List <LuaValue> (); for (int i = 0; i < size; i++) { LuaValue item = decoder.readObject() as LuaValue; if (item != null) { list.Add(item); } } return(list); } return(null); }
/// <summary> /// 读取一个字典 /// </summary> /// <returns>字典对象</returns> /// <param name="decoder">对象解码器</param> private Dictionary <string, LuaValue> readHashtable(LuaObjectDecoder decoder) { int size = decoder.readInt32(); if (size > 0) { Dictionary <string, LuaValue> table = new Dictionary <string, LuaValue> (); for (int i = 0; i < size; i++) { string key = decoder.readString(); LuaValue item = decoder.readObject() as LuaValue; if (key != null && item != null) { table.Add(key, item); } } return(table); } return(null); }
/// <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); }