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)); } } } }
private static Int64 _createInstance(int nativeClassId) { Int64 refId = 0; Type t = _exportsClass [nativeClassId]; if (t != null) { //调用默认构造方法 ConstructorInfo ci = t.GetConstructor(Type.EmptyTypes); if (ci != null) { object instance = ci.Invoke(null); if (instance != null) { LuaObjectReference objRef = new LuaObjectReference(instance); //添加引用避免被GC进行回收 _instances.Add(objRef); refId = objRef.referenceId; } } } return(refId); }
public LuaPointer(object obj) { if (obj != null) { _objReference = new LuaObjectReference(obj); } }
private static IntPtr _instanceMethodHandler(int contextId, int classId, Int64 instancePtr, string methodName, IntPtr argumentsBuffer, int bufferSize) { if (instancePtr != 0 && _exportsInstanceMethods.ContainsKey(classId) && _exportsInstanceMethods[classId].ContainsKey(methodName)) { LuaContext context = LuaContext.getContext(contextId); LuaObjectReference objRef = LuaObjectReference.findObject(instancePtr); object instance = objRef.target; MethodInfo m = _exportsInstanceMethods[classId][methodName]; if (instance != null && m != null) { ArrayList argsArr = parseMethodParameters(context, m, argumentsBuffer, bufferSize); object ret = m.Invoke(instance, argsArr != null ? argsArr.ToArray() : null); LuaValue retValue = new LuaValue(ret); LuaObjectEncoder encoder = new LuaObjectEncoder(context); 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); }
/// <summary> /// 读取一个对象类型 /// </summary> /// <returns>对象</returns> public object readObject() { if (_buffer [_offset] == 'L') { _offset++; string className = readString(); if (readByte() == ';') { //反射对象 Type t = Type.GetType(className); if (t != null) { object[] parameters = new object[1]; parameters [0] = this; ConstructorInfo ci = t.GetConstructor(new Type[] { typeof(LuaObjectDecoder) }); return(ci.Invoke(parameters)); } } } else { Int64 refId = readInt64(); return(LuaObjectReference.findObject(refId)); } return(null); }
/// <summary> /// 初始化 /// </summary> /// <param name="decoder">对象解码器</param> public LuaPointer(LuaObjectDecoder decoder) : base(decoder) { Int64 objRefId = decoder.readInt64(); _objReference = LuaObjectReference.findObject(objRefId); }
private static IntPtr _fieldGetter(int contextId, int classId, Int64 instancePtr, string fieldName) { IntPtr retValuePtr = IntPtr.Zero; if (instancePtr != 0 && _exportsFields.ContainsKey(classId) && _exportsFields[classId].ContainsKey(fieldName)) { LuaContext context = LuaContext.getContext(contextId); LuaObjectReference objRef = LuaObjectReference.findObject(instancePtr); object instance = objRef.target; PropertyInfo propertyInfo = _exportsFields[classId][fieldName]; if (instance != null && propertyInfo != null && propertyInfo.CanRead) { object retValue = propertyInfo.GetValue(instance, null); LuaValue value = new LuaValue(retValue); LuaObjectEncoder encoder = new LuaObjectEncoder(context); encoder.writeObject(value); byte[] bytes = encoder.bytes; retValuePtr = Marshal.AllocHGlobal(bytes.Length); Marshal.Copy(bytes, 0, retValuePtr, bytes.Length); } } return(retValuePtr); }
/// <summary> /// 初始化 /// </summary> /// <param name="obj">对象</param> public LuaObjectDescriptor(object obj) { _objRef = new LuaObjectReference(obj); if (obj is LuaBaseObject) { _luaObjectId = (obj as LuaBaseObject).luaObjectId; } }
/// <summary> /// 初始化 /// </summary> /// <param name="decoder">对象解码器</param> public LuaObjectDescriptor(LuaObjectDecoder decoder) : base(decoder) { Int64 objRefId = decoder.readInt64(); _objRef = LuaObjectReference.findObject(objRefId); luaObjectId = decoder.readString(); }
private static void _destroyInstance(Int64 instancePtr) { if (instancePtr != 0) { LuaObjectReference instanceRef = LuaObjectReference.findObject(instancePtr); if (instanceRef != null) { _instances.Remove(instanceRef); } } }
private static string _instanceDescription(Int64 instancePtr) { if (instancePtr != 0) { LuaObjectReference objRef = LuaObjectReference.findObject(instancePtr); if (objRef != null) { return(objRef.target.ToString()); } } return(""); }
private static void setNativeObjectId(Int64 instance, int nativeObjectId, string luaObjectId) { if (instance != 0) { LuaObjectReference objRef = LuaObjectReference.findObject(instance); LuaBaseObject luaObj = objRef.target as LuaBaseObject; if (luaObj != null) { luaObj.objectId = nativeObjectId; luaObj.luaObjectId = luaObjectId; } } }
private static Int64 _createInstance(int contextId, int nativeClassId, IntPtr argumentsBuffer, int bufferSize) { Int64 refId = -1; if (_exportsClass.ContainsKey(nativeClassId)) { Type t = _exportsClass [nativeClassId]; if (t != null) { LuaContext context = LuaContext.getContext(contextId); List <LuaValue> arguments = getArgumentList(context, argumentsBuffer, bufferSize); ConstructorInfo ci = getConstructor(t, t, arguments); if (ci != null) { ArrayList argsArr = new ArrayList(); ParameterInfo[] parameters = ci.GetParameters(); if (parameters.Length > 0 && arguments != null) { int i = 0; foreach (ParameterInfo p in parameters) { if (i >= arguments.Count) { break; } object value = getNativeValueForLuaValue(p.ParameterType, arguments[i]); argsArr.Add(value); i++; } } object instance = ci.Invoke(argsArr.ToArray()); if (instance != null) { LuaObjectReference objRef = new LuaObjectReference(instance); //添加引用避免被GC进行回收 _instances.Add(objRef); refId = objRef.referenceId; } } } } return(refId); }
/// <summary> /// 写入一个对象类型 /// </summary> /// <param name="value">对象</param> public void writeObject(object value) { if (value != null) { if (value is LuaBaseObject) { this.writeByte((byte)'L'); this.writeString(value.GetType().Name); this.writeByte((byte)';'); (value as LuaBaseObject).serialization(this); } else { LuaObjectReference objRef = new LuaObjectReference(value); writeInt64(objRef.referenceId); } } }
/// <summary> /// 初始化 /// </summary> /// <param name="decoder">对象解码器</param> public LuaObjectDescriptor(LuaObjectDecoder decoder) : base(decoder) { Int64 objRefId = decoder.readInt64(); _objRef = LuaObjectReference.findObject(objRefId); luaObjectId = decoder.readString(); //原生类型标识读取 decoder.readInt32(); //读取自定义数据 int userdataSize = decoder.readInt32(); for (int i = 0; i < userdataSize; i++) { decoder.readString(); decoder.readString(); } }
/// <summary> /// 初始化 /// </summary> /// <param name="obj">对象</param> public LuaObjectDescriptor(object obj) { _objRef = new LuaObjectReference(obj); _luaObjectId = obj.GetHashCode().ToString("x8"); _nativeTypeId = LuaExportsTypeManager.defaultManager.getNativeTypeId(obj.GetType()); }
/// <summary> /// 初始化 /// </summary> /// <param name="obj">对象</param> public LuaObjectDescriptor(object obj) { _objRef = new LuaObjectReference(obj); _luaObjectId = obj.GetHashCode().ToString("x8"); }