コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 private static void _destroyInstance(IntPtr instancePtr)
 {
     if (instancePtr != IntPtr.Zero)
     {
         LuaObjectClass instance = Marshal.GetObjectForIUnknown(instancePtr) as LuaObjectClass;
         if (instance != null)
         {
             _instances.Remove(instance);
         }
     }
 }
コード例 #5
0
        private static string _instanceDescription(IntPtr instancePtr)
        {
            if (instancePtr != IntPtr.Zero)
            {
                LuaObjectClass instance = Marshal.GetObjectForIUnknown(instancePtr) as LuaObjectClass;
                if (instance != null)
                {
                    return(instance.ToString());
                }
            }

            return("");
        }
コード例 #6
0
        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);
                }
            }
        }
コード例 #7
0
        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);
                }
            }
        }
コード例 #8
0
        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);
        }