private static IntPtr _instanceMethodHandler(int classId, Int64 instancePtr, string methodName, IntPtr argumentsBuffer, int bufferSize) { if (instancePtr != 0 && _exportsInstanceMethods.ContainsKey(classId) && _exportsInstanceMethods[classId].ContainsKey(methodName)) { LuaObjectReference objRef = LuaObjectReference.findObject(instancePtr); LuaObjectClass instance = objRef.target as LuaObjectClass; MethodInfo m = _exportsInstanceMethods[classId][methodName]; if (instance != null && m != null) { ArrayList argsArr = parseMethodParameters(m, argumentsBuffer, bufferSize); object ret = m.Invoke(instance, argsArr != null ? argsArr.ToArray() : null); LuaValue retValue = new LuaValue(ret); 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); }
private static IntPtr _fieldGetter(int classId, Int64 instancePtr, string fieldName) { IntPtr retValuePtr = IntPtr.Zero; if (instancePtr != 0 && _exportsFields.ContainsKey(classId) && _exportsFields[classId].ContainsKey(fieldName)) { LuaObjectReference objRef = LuaObjectReference.findObject(instancePtr); LuaObjectClass instance = objRef.target as LuaObjectClass; 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(); encoder.writeObject(value); byte[] bytes = encoder.bytes; retValuePtr = Marshal.AllocHGlobal(bytes.Length); Marshal.Copy(bytes, 0, retValuePtr, bytes.Length); } } return(retValuePtr); }
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) { LuaObjectClass instance = ci.Invoke(null) as LuaObjectClass; if (instance != null) { LuaObjectReference objRef = new LuaObjectReference(instance); //添加引用避免被GC进行回收 _instances.Add(objRef); refId = objRef.referenceId; } } } return(refId); }
private static void _destroyInstance(IntPtr instancePtr) { if (instancePtr != IntPtr.Zero) { LuaObjectClass instance = Marshal.GetObjectForIUnknown(instancePtr) as LuaObjectClass; if (instance != null) { _instances.Remove(instance); } } }
private static string _instanceDescription(IntPtr instancePtr) { if (instancePtr != IntPtr.Zero) { LuaObjectClass instance = Marshal.GetObjectForIUnknown(instancePtr) as LuaObjectClass; if (instance != null) { return(instance.ToString()); } } return(""); }
private static void _fieldSetter(int classId, IntPtr instancePtr, string fieldName, IntPtr valueBuffer, int bufferSize) { if (instancePtr != IntPtr.Zero && _exportsFields.ContainsKey(classId) && _exportsFields[classId].ContainsKey(fieldName)) { LuaObjectClass instance = Marshal.GetObjectForIUnknown(instancePtr) as LuaObjectClass; PropertyInfo propertyInfo = _exportsFields[classId][fieldName]; if (instance != null && propertyInfo != null && propertyInfo.CanWrite) { LuaObjectDecoder decoder = new LuaObjectDecoder(valueBuffer, bufferSize); LuaValue value = decoder.readObject() as LuaValue; propertyInfo.SetValue(instance, getNativeValueForLuaValue(propertyInfo.PropertyType, value), null); } } }
private static void _fieldSetter(int classId, Int64 instancePtr, string fieldName, IntPtr valueBuffer, int bufferSize) { if (instancePtr != 0 && _exportsFields.ContainsKey(classId) && _exportsFields[classId].ContainsKey(fieldName)) { LuaObjectReference objRef = LuaObjectReference.findObject(instancePtr); LuaObjectClass instance = objRef.target as LuaObjectClass; PropertyInfo propertyInfo = _exportsFields[classId][fieldName]; if (instance != null && propertyInfo != null && propertyInfo.CanWrite) { LuaObjectDecoder decoder = new LuaObjectDecoder(valueBuffer, bufferSize); LuaValue value = decoder.readObject() as LuaValue; propertyInfo.SetValue(instance, getNativeValueForLuaValue(propertyInfo.PropertyType, value), null); } } }
private static IntPtr _createInstance(int nativeClassId) { IntPtr instancePtr = IntPtr.Zero; Type t = _exportsClass [nativeClassId]; if (t != null) { //调用默认构造方法 ConstructorInfo ci = t.GetConstructor(Type.EmptyTypes); if (ci != null) { LuaObjectClass instance = ci.Invoke(null) as LuaObjectClass; if (instance != null) { instancePtr = Marshal.GetIUnknownForObject(instance); //添加引用避免被GC进行回收 _instances.Add(instance); } } } return(instancePtr); }