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));
                    }
                }
            }
        }
Beispiel #2
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)
                {
                    object instance = ci.Invoke(null);
                    if (instance != null)
                    {
                        LuaObjectReference objRef = new LuaObjectReference(instance);
                        //添加引用避免被GC进行回收
                        _instances.Add(objRef);

                        refId = objRef.referenceId;
                    }
                }
            }

            return(refId);
        }
Beispiel #3
0
 public LuaPointer(object obj)
 {
     if (obj != null)
     {
         _objReference = new LuaObjectReference(obj);
     }
 }
Beispiel #4
0
        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);
        }
Beispiel #6
0
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaPointer(LuaObjectDecoder decoder)
            : base(decoder)
        {
            Int64 objRefId = decoder.readInt64();

            _objReference = LuaObjectReference.findObject(objRefId);
        }
Beispiel #7
0
        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();
        }
Beispiel #10
0
 private static void _destroyInstance(Int64 instancePtr)
 {
     if (instancePtr != 0)
     {
         LuaObjectReference instanceRef = LuaObjectReference.findObject(instancePtr);
         if (instanceRef != null)
         {
             _instances.Remove(instanceRef);
         }
     }
 }
Beispiel #11
0
        private static string _instanceDescription(Int64 instancePtr)
        {
            if (instancePtr != 0)
            {
                LuaObjectReference objRef = LuaObjectReference.findObject(instancePtr);
                if (objRef != null)
                {
                    return(objRef.target.ToString());
                }
            }

            return("");
        }
Beispiel #12
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;
         }
     }
 }
        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);
        }
Beispiel #14
0
        /// <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);
                }
            }
        }
Beispiel #15
0
        /// <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();
            }
        }
Beispiel #16
0
 /// <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());
 }
Beispiel #17
0
 /// <summary>
 /// 初始化
 /// </summary>
 /// <param name="obj">对象</param>
 public LuaObjectDescriptor(object obj)
 {
     _objRef      = new LuaObjectReference(obj);
     _luaObjectId = obj.GetHashCode().ToString("x8");
 }