Beispiel #1
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);
        }
Beispiel #2
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);
        }
Beispiel #3
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);
        }
        private static IntPtr _filedGetterInvoke(int contextId, string className, Int64 instance, string fieldName)
        {
            IntPtr retValuePtr = IntPtr.Zero;

            LuaContext context = LuaContext.getContext(contextId);

            if (context != null)
            {
                Type t = _exportsClasses [contextId] [className];
                if (t != null &&
                    instance != 0 &&
                    _exportsFieldGetters.ContainsKey(className) &&
                    _exportsFieldGetters [className].ContainsKey(fieldName))
                {
                    LuaObjectReference objRef       = LuaObjectReference.findObject(instance);
                    PropertyInfo       propertyInfo = _exportsFieldGetters [className] [fieldName];
                    if (objRef.target != null && propertyInfo != null && propertyInfo.CanRead)
                    {
                        object   retValue = propertyInfo.GetValue(objRef.target, 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 contextId, string className)
        {
            Int64 refId = 0;

            LuaContext context = LuaContext.getContext(contextId);

            if (context != null)
            {
                Type t = _exportsClasses [contextId] [className];
                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);
        }
Beispiel #6
0
 private static void _destroyInstance(Int64 instancePtr)
 {
     if (instancePtr != 0)
     {
         LuaObjectReference instanceRef = LuaObjectReference.findObject(instancePtr);
         if (instanceRef != null)
         {
             _instances.Remove(instanceRef);
         }
     }
 }
Beispiel #7
0
 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;
         }
     }
 }
Beispiel #8
0
        private static string _instanceDescription(Int64 instancePtr)
        {
            if (instancePtr != 0)
            {
                LuaObjectReference objRef = LuaObjectReference.findObject(instancePtr);
                if (objRef != null)
                {
                    return(objRef.target.ToString());
                }
            }

            return("");
        }
Beispiel #9
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);
                }
            }
        }
        private static void _fieldSetterInvoke(int contextId, string className, Int64 instance, string fieldName, IntPtr valueBuffer, int bufferSize)
        {
            Type t = _exportsClasses [contextId][className];

            if (t != null &&
                instance != 0 &&
                _exportsFieldSetters.ContainsKey(className) &&
                _exportsFieldSetters[className].ContainsKey(fieldName))
            {
                LuaObjectReference objRef       = LuaObjectReference.findObject(instance);
                PropertyInfo       propertyInfo = _exportsFieldSetters[className][fieldName];
                if (objRef.target != null && propertyInfo != null && propertyInfo.CanWrite)
                {
                    LuaObjectDecoder decoder = new LuaObjectDecoder(valueBuffer, bufferSize);
                    LuaValue         value   = decoder.readObject() as LuaValue;

                    propertyInfo.SetValue(objRef.target, getNativeValueForLuaValue(propertyInfo.PropertyType, value), null);
                }
            }
        }