示例#1
0
        /// <summary>
        /// Register the screens in the application database
        /// </summary>
        /// <param name="assembly">Current Assembly</param>
        /// <returns>Void</returns>
        public static void RegisterScreens(Assembly assembly)
        {
            List <ScreenRoute> existingScreenRoute = userRepository.GetAvailableScreens();

            List <ScreenRoute> controllerActions = assembly.GetTypes().Where(types => typeof(Controller).IsAssignableFrom(types))
                                                   .SelectMany(type => type.GetMethods())
                                                   .Where(method => method.IsPublic && !method.IsDefined(typeof(NonActionAttribute)) && method.IsDefined(typeof(LinkFilter)) && !method.DeclaringType.Name.Equals("Controller") && method.DeclaringType.Name.EndsWith("Controller")).Select(
                screenRoutes => new ScreenRoute
            {
                ActionName     = screenRoutes.GetType().IsDefined(typeof(ActionNameAttribute)) ? AttributeExtensions.GetCustomAttribute <ActionNameAttribute>(screenRoutes).Name : screenRoutes.Name,
                ControllerName = screenRoutes.DeclaringType.Name,
                AreaName       = GetAreaName(screenRoutes.DeclaringType.FullName, screenRoutes.DeclaringType.Name),
                LinkText       = AttributeExtensions.GetCustomAttribute <LinkFilter>(screenRoutes).LinkText,
                Read           = AttributeExtensions.GetCustomAttribute <LinkFilter>(screenRoutes).Read,
                Delete         = AttributeExtensions.GetCustomAttribute <LinkFilter>(screenRoutes).Delete,
                Write          = AttributeExtensions.GetCustomAttribute <LinkFilter>(screenRoutes).Write,
                GroupMenuTitle = AttributeExtensions.GetCustomAttribute <GroupMenuTitle>(screenRoutes.DeclaringType).Title,
            }).ToList();

            List <ScreenRoute> missingScreens = controllerActions.Except(existingScreenRoute).ToList();

            foreach (ScreenRoute screens in missingScreens)
            {
                userRepository.AddApplicationScreens(screens);
            }
        }
示例#2
0
        static System.Collections.Generic.List <BindItem> TryGetBind(System.Type entityType)
        {
            string key  = entityType.AssemblyQualifiedName;
            var    list = _list_key.GetOrAdd(key, (p) => {
                if (entityType.IsValueType || entityType == typeof(string) || entityType == typeof(object) || TypeExtensions.IsNullableType(entityType))
                {
                    return(null);
                }
                var cache = new System.Collections.Generic.List <BindItem>();
                foreach (System.Reflection.PropertyInfo propertyInfo in entityType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.SetProperty))
                {
                    var binder = AttributeExtensions.GetCustomAttribute <DataBinderAttribute>(propertyInfo);
                    if (binder == null)
                    {
                        continue;
                    }
                    BindItem bindItem = new BindItem()
                    {
                        propertyInfo = propertyInfo,
                        binder       = binder,
                        bindAction   = binder.Bind,
                    };
                    cache.Add(bindItem);
                }
                return(cache);
            });

            return(list);
        }
示例#3
0
        static System.Collections.Generic.List <BindItem> TryGetBind(System.Type entityType)
        {
            string key = entityType.AssemblyQualifiedName;

            System.Collections.Generic.List <BindItem> list;
            if (!_list_key.TryGetValue(key, out list))
            {
                ThreadHelper.Block(_list_key, () => {
                    if (!_list_key.TryGetValue(key, out list))
                    {
                        if (entityType.IsValueType || entityType == typeof(string) || entityType == typeof(object) || TypeExtensions.IsNullableType(entityType))
                        {
                            _list_key.TryAdd(key, null);
                            return;
                        }

                        list = new System.Collections.Generic.List <BindItem>();
                        foreach (System.Reflection.PropertyInfo propertyInfo in entityType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.SetProperty))
                        {
                            var binder = AttributeExtensions.GetCustomAttribute <DataBinderAttribute>(propertyInfo);
                            if (binder == null)
                            {
                                continue;
                            }
                            BindItem bindItem = new BindItem()
                            {
                                propertyInfo = propertyInfo,
                                binder       = binder,
                                bindAction   = binder.Bind,
                            };
                            list.Add(bindItem);
                        }
                        _list_key.TryAdd(key, list.Count == 0 ? null : list);
                    }
                });
            }
            return(list);
        }
示例#4
0
        public static string Decrypt <T>(Expression <Func <T> > property)
        {
            var value      = property.Compile()();
            var cipherText = value.ToString();

            try
            {
                var passPhrase = AttributeExtensions.GetCustomAttribute <T, EncryptAttribute>(property).Key;

                var cipherTextBytes = Convert.FromBase64String(cipherText);

                using (var password = new PasswordDeriveBytes(passPhrase, null))
                {
                    var keyBytes = password.GetBytes(keysize / 8);
                    using (var symmetricKey = new RijndaelManaged())
                    {
                        symmetricKey.Mode = CipherMode.CBC;
                        using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes))
                        {
                            using (var memoryStream = new MemoryStream(cipherTextBytes))
                            {
                                using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                                {
                                    var plainTextBytes     = new byte[cipherTextBytes.Length];
                                    var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
                                    return(Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount));
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
                return(cipherText);
            }
        }
        unsafe static TreePackage()
        {
            #region typecode map ValueType
            _typeCodes = new Dictionary <TypeCode, PackageValueTypes>();
            _typeCodes.Add(TypeCode.Boolean, PackageValueTypes.Boolean);
            _typeCodes.Add(TypeCode.Byte, PackageValueTypes.Byte);
            _typeCodes.Add(TypeCode.Char, PackageValueTypes.Char);
            _typeCodes.Add(TypeCode.Int16, PackageValueTypes.Int16);
            _typeCodes.Add(TypeCode.Int32, PackageValueTypes.Int32);
            _typeCodes.Add(TypeCode.Int64, PackageValueTypes.Int64);
            _typeCodes.Add(TypeCode.Single, PackageValueTypes.Single);
            _typeCodes.Add(TypeCode.Double, PackageValueTypes.Double);
            _typeCodes.Add(TypeCode.SByte, PackageValueTypes.SByte);
            _typeCodes.Add(TypeCode.Decimal, PackageValueTypes.Decimal);
            _typeCodes.Add(TypeCode.UInt16, PackageValueTypes.UInt16);
            _typeCodes.Add(TypeCode.UInt32, PackageValueTypes.UInt32);
            _typeCodes.Add(TypeCode.UInt64, PackageValueTypes.UInt64);
            _typeCodes.Add(TypeCode.DateTime, PackageValueTypes.DateTime);
            _typeCodes.Add(TypeCode.String, PackageValueTypes.String);
            _typeCodes.Add(TypeCode.Object, PackageValueTypes.Object);
            _typeCodes.Add(TypeCode.DBNull, PackageValueTypes.Object);
            _typeCodes.Add(TypeCode.Empty, PackageValueTypes.Object);
            #endregion

            #region type map ValueType
            _typeValueTypes = new Dictionary <Type, PackageValueTypes>();
            _typeValueTypes.Add(typeof(string), PackageValueTypes.String);
            _typeValueTypes.Add(typeof(IntPtr), PackageValueTypes.IntPtr);
            _typeValueTypes.Add(typeof(UIntPtr), PackageValueTypes.UIntPtr);
            _typeValueTypes.Add(typeof(TimeSpan), PackageValueTypes.TimeSpan);
            _typeValueTypes.Add(typeof(Guid), PackageValueTypes.Guid);
            _typeValueTypes.Add(typeof(System.Drawing.Icon), PackageValueTypes.Icon);
            _typeValueTypes.Add(typeof(System.Drawing.Color), PackageValueTypes.Color);
            _typeValueTypes.Add(typeof(System.Drawing.Image), PackageValueTypes.Image);
            _typeValueTypes.Add(typeof(TreePackage), PackageValueTypes.NestedPackage);
            _typeValueTypes.Add(typeof(Stream), PackageValueTypes.Stream);
            #endregion

            #region valueType map Type
            _valueTypes = new Dictionary <PackageValueTypes, Type>();
            _valueTypes.Add(PackageValueTypes.Boolean, typeof(bool));
            _valueTypes.Add(PackageValueTypes.Byte, typeof(byte));
            _valueTypes.Add(PackageValueTypes.Char, typeof(char));
            _valueTypes.Add(PackageValueTypes.Int16, typeof(short));
            _valueTypes.Add(PackageValueTypes.Int32, typeof(int));
            _valueTypes.Add(PackageValueTypes.Int64, typeof(long));
            _valueTypes.Add(PackageValueTypes.Single, typeof(float));
            _valueTypes.Add(PackageValueTypes.Double, typeof(double));
            _valueTypes.Add(PackageValueTypes.SByte, typeof(sbyte));
            _valueTypes.Add(PackageValueTypes.Decimal, typeof(decimal));
            _valueTypes.Add(PackageValueTypes.UInt16, typeof(ushort));
            _valueTypes.Add(PackageValueTypes.UInt32, typeof(uint));
            _valueTypes.Add(PackageValueTypes.UInt64, typeof(ulong));
            _valueTypes.Add(PackageValueTypes.IntPtr, typeof(IntPtr));
            _valueTypes.Add(PackageValueTypes.UIntPtr, typeof(UIntPtr));
            _valueTypes.Add(PackageValueTypes.DateTime, typeof(DateTime));
            _valueTypes.Add(PackageValueTypes.TimeSpan, typeof(TimeSpan));
            _valueTypes.Add(PackageValueTypes.String, typeof(string));
            _valueTypes.Add(PackageValueTypes.Stream, typeof(Stream));
            _valueTypes.Add(PackageValueTypes.Icon, typeof(System.Drawing.Icon));
            _valueTypes.Add(PackageValueTypes.Image, typeof(System.Drawing.Image));
            _valueTypes.Add(PackageValueTypes.Color, typeof(System.Drawing.Color));
            _valueTypes.Add(PackageValueTypes.NestedPackage, typeof(TreePackage));
            _valueTypes.Add(PackageValueTypes.Object, typeof(object));
            #endregion

            #region compressor map handlers
            _compressors = new Dictionary <PackageCompressTypes, CompressorHandler>();
            _compressors.Add(PackageCompressTypes.QuickLZ, Compressor_QuickLZ);
            _compressors.Add(PackageCompressTypes.Gzip, Compressor_Gzip);
            _compressors.Add(PackageCompressTypes.Lzma7z, Compressor_Lzma);
            //_compressors.Add(PackageCompressTypes.Zlibwapi, (buffer, compress) => compress ? Symbol.IO.Compression.ZlibwapiHelper.Compress(buffer) : Symbol.IO.Compression.ZlibwapiHelper.Decompress(buffer));
            _compressors.Add(PackageCompressTypes.NonEncrypt_NonCompress, Compressor_Empty);
            #endregion

            #region valueType map package SingleData Handler
            _packageValueSingleDataHandlers = new Dictionary <PackageValueTypes, PackageValueSingleDataHandler>();
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Boolean, (keyEntry, entry) => {
                byte[] result = new byte[1];
                if ((bool)entry.Value)
                {
                    result[0] = 1;
                }
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Byte, (keyEntry, entry) => new byte[] { (byte)entry.Value });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Char, (keyEntry, entry) => {
                byte[] result = new byte[2];
                char tChar    = (char)entry.Value;
                Marshal.Copy((IntPtr)(&tChar), result, 0, 2);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Int16, (keyEntry, entry) => {
                short tShort  = TypeExtensions.Convert <short>(entry.Value, 0);
                byte[] result = new byte[2];
                Marshal.Copy((IntPtr)(&tShort), result, 0, 2);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Int32, (keyEntry, entry) => {
                int tInt32    = TypeExtensions.Convert <int>(entry.Value, 0);
                byte[] result = new byte[4];
                Marshal.Copy((IntPtr)(&tInt32), result, 0, 4);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Int64, (keyEntry, entry) => {
                long tInt64   = TypeExtensions.Convert <long>(entry.Value, 0L);
                byte[] result = new byte[8];
                Marshal.Copy((IntPtr)(&tInt64), result, 0, 8);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Single, (keyEntry, entry) => {
                float tSingle = TypeExtensions.Convert <float>(entry.Value, 0F);
                byte[] result = new byte[4];
                Marshal.Copy((IntPtr)(&tSingle), result, 0, 4);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Double, (keyEntry, entry) => {
                double tDouble = TypeExtensions.Convert <double>(entry.Value, 0D);
                byte[] result  = new byte[8];
                Marshal.Copy((IntPtr)(&tDouble), result, 0, 8);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.SByte, (keyEntry, entry) => {
                sbyte tSByte  = TypeExtensions.Convert <sbyte>(entry.Value, 0);
                byte[] result = new byte[1];
                Marshal.Copy((IntPtr)(&tSByte), result, 0, 1);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Decimal, (keyEntry, entry) => Encoding.ASCII.GetBytes(entry.Value.ToString()));
            _packageValueSingleDataHandlers.Add(PackageValueTypes.UInt16, (keyEntry, entry) => {
                ushort tUShort = TypeExtensions.Convert <ushort>(entry.Value, 0);
                byte[] result  = new byte[2];
                Marshal.Copy((IntPtr)(&tUShort), result, 0, 2);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.UInt32, (keyEntry, entry) => {
                uint tUInt32  = TypeExtensions.Convert <uint>(entry.Value, 0);
                byte[] result = new byte[4];
                Marshal.Copy((IntPtr)(&tUInt32), result, 0, 4);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.UInt64, (keyEntry, entry) => {
                ulong tUInt64 = TypeExtensions.Convert <ulong>(entry.Value, 0L);
                byte[] result = new byte[8];
                Marshal.Copy((IntPtr)(&tUInt64), result, 0, 8);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.IntPtr, (keyEntry, entry) => {
                IntPtr tIntPtr = (IntPtr)entry.Value;
                byte[] result  = new byte[IntPtr.Size];
                if (IntPtr.Size == 4)
                {
                    int tIntPtr2 = tIntPtr.ToInt32();
                    Marshal.Copy((IntPtr)(&tIntPtr2), result, 0, 4);
                }
                else
                {
                    long tIntPtr3 = tIntPtr.ToInt64();
                    Marshal.Copy((IntPtr)(&tIntPtr3), result, 0, 8);
                }
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.UIntPtr, (keyEntry, entry) => {
                UIntPtr tUIntPtr = (UIntPtr)entry.Value;
                byte[] result    = new byte[UIntPtr.Size];
                if (UIntPtr.Size == 4)
                {
                    uint tUIntPtr2 = tUIntPtr.ToUInt32();
                    Marshal.Copy((IntPtr)(&tUIntPtr2), result, 0, 4);
                }
                else
                {
                    ulong tUIntPtr3 = tUIntPtr.ToUInt64();
                    Marshal.Copy((IntPtr)(&tUIntPtr3), result, 0, 8);
                }
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.DateTime, (keyEntry, entry) => {
                return(Encoding.ASCII.GetBytes(((DateTime)entry.Value).ToString("yyyy-MM-dd HH:mm:ss")));
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.TimeSpan, (keyEntry, entry) => {
                double tTimeSpan = ((TimeSpan)entry.Value).TotalMilliseconds;
                byte[] result    = new byte[8];
                Marshal.Copy((IntPtr)(&tTimeSpan), result, 0, 8);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.String, (keyEntry, entry) => Encoding.UTF8.GetBytes((string)entry.Value));
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Stream, (keyEntry, entry) => {
                MemoryStream memoryStream = entry.Value as MemoryStream;
                if (memoryStream != null)
                {
                    return(memoryStream.ToArray());
                }
                FileStream fileStream = entry.Value as FileStream;
                if (fileStream != null)
                {
                    fileStream.Position = 0;
                    byte[] result       = new byte[fileStream.Length];
                    fileStream.Read(result, 0, result.Length);
                    return(result);
                }
                using (memoryStream = new MemoryStream()) {
                    StreamExtensions.CopyTo(((Stream)entry.Value), memoryStream, true);
                    return(memoryStream.ToArray());
                }
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Icon, (keyEntry, entry) => {
                using (MemoryStream memoryStream = new MemoryStream()) {
                    ((System.Drawing.Icon)entry.Value).Save(memoryStream);
                    return(memoryStream.ToArray());
                }
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Image, (keyEntry, entry) => {
                using (MemoryStream memoryStream = new MemoryStream()) {
                    System.Drawing.Image p = (System.Drawing.Image)entry.Value;
                    p.Save(memoryStream, p.RawFormat);
                    return(memoryStream.ToArray());
                }
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Color, (keyEntry, entry) => {
                int tColor    = ((System.Drawing.Color)entry.Value).ToArgb();
                byte[] result = new byte[4];
                Marshal.Copy((IntPtr)(&tColor), result, 0, 4);
                return(result);
            });
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Guid, (keyEntry, entry) => ((Guid)entry.Value).ToByteArray());
            _packageValueSingleDataHandlers.Add(PackageValueTypes.NestedPackage, (keyEntry, entry) => ((TreePackage)entry.Value).Save());
            _packageValueSingleDataHandlers.Add(PackageValueTypes.Object, (keyEntry, entry) => {
                Type type = entry.Value.GetType();
                if (AttributeExtensions.IsDefined <NonPackageAttribute>(type) || AttributeExtensions.IsDefined <Formatting.IgnoreAttribute>(type))
                {
                    return(new byte[0]);
                }
                ICustomPackage customPackage = null;
                byte flag;
                if (AttributeExtensions.IsDefined <PropertyPackageAttribute>(type))
                {
                    customPackage = PropertyPackage.Instance;
                    flag          = 0;
                }
                else if (AttributeExtensions.IsDefined <FieldPackageAttribute>(type))
                {
                    customPackage = FieldPackage.Instance;
                    flag          = 1;
                }
                else if (AttributeExtensions.IsDefined <CustomPackageAttribute>(type))
                {
                    var attribute = AttributeExtensions.GetCustomAttribute <CustomPackageAttribute>(type);
                    customPackage = FastWrapper.CreateInstance <ICustomPackage>(attribute.CustomPackageType);
                    //customPackage= CustomPackageAttribute.GetCustomPackageType(type);
                    flag = 255;
                }
                else
                {
                    customPackage = PropertyPackage.Instance;
                    flag          = 0;
                }
                using (MemoryStream stream = new MemoryStream(128)) {
                    stream.WriteByte(flag);
                    byte[] buffer = null;
                    if (flag == 255)
                    {
                        buffer         = Encoding.UTF8.GetBytes(customPackage.GetType().AssemblyQualifiedName);
                        short iShort   = (short)buffer.Length;
                        byte[] buffer2 = new byte[2];
                        Marshal.Copy((IntPtr)(&iShort), buffer2, 0, 2);
                        stream.Write(buffer2, 0, buffer2.Length);
                        stream.Write(buffer, 0, buffer.Length);
                    }
                    buffer = customPackage.Save(entry.Value);
                    stream.Write(buffer, 0, buffer.Length);
                    return(stream.ToArray());
                }
            });
            #endregion
            #region valueType map unpackage SingleData Handler
            _unPakcageValueSingleDataHandlers = new Dictionary <PackageValueTypes, UnPackageValueSingleDataHandler>();
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Boolean, (keyEntry, entry, buffer) => entry.Value = buffer[0] == 1);
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Byte, (keyEntry, entry, buffer) => entry.Value    = buffer[0]);
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Char, (keyEntry, entry, buffer) => {
                char tChar;;
                Marshal.Copy(buffer, 0, (IntPtr)(&tChar), 2);
                entry.Value = tChar;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Int16, (keyEntry, entry, buffer) => {
                short tShort;
                Marshal.Copy(buffer, 0, (IntPtr)(&tShort), 2);
                entry.Value = tShort;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Int32, (keyEntry, entry, buffer) => {
                int tInt32;
                Marshal.Copy(buffer, 0, (IntPtr)(&tInt32), 4);
                entry.Value = tInt32;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Int64, (keyEntry, entry, buffer) => {
                long tInt64;
                Marshal.Copy(buffer, 0, (IntPtr)(&tInt64), 8);
                entry.Value = tInt64;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Single, (keyEntry, entry, buffer) => {
                float tSingle;
                Marshal.Copy(buffer, 0, (IntPtr)(&tSingle), 4);
                entry.Value = tSingle;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Double, (keyEntry, entry, buffer) => {
                double tDouble;
                Marshal.Copy(buffer, 0, (IntPtr)(&tDouble), 8);
                entry.Value = tDouble;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.SByte, (keyEntry, entry, buffer) => {
                sbyte tSByte;
                Marshal.Copy(buffer, 0, (IntPtr)(&tSByte), 1);
                entry.Value = tSByte;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Decimal, (keyEntry, entry, buffer) => entry.Value = decimal.Parse(Encoding.ASCII.GetString(buffer)));
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.UInt16, (keyEntry, entry, buffer) => {
                ushort tUShort;
                Marshal.Copy(buffer, 0, (IntPtr)(&tUShort), 2);
                entry.Value = tUShort;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.UInt32, (keyEntry, entry, buffer) => {
                uint tUInt32;
                Marshal.Copy(buffer, 0, (IntPtr)(&tUInt32), 4);
                entry.Value = tUInt32;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.UInt64, (keyEntry, entry, buffer) => {
                ulong tUInt64;
                Marshal.Copy(buffer, 0, (IntPtr)(&tUInt64), 8);
                entry.Value = tUInt64;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.IntPtr, (keyEntry, entry, buffer) => {
                IntPtr tIntPtr;
                if (buffer.Length == 4)
                {
                    int tIntPtr2;
                    Marshal.Copy(buffer, 0, (IntPtr)(&tIntPtr2), 4);
                    tIntPtr = new IntPtr(tIntPtr2);
                }
                else
                {
                    long tIntPtr3;
                    Marshal.Copy(buffer, 0, (IntPtr)(&tIntPtr3), 8);
                    tIntPtr = new IntPtr(tIntPtr3);
                }
                entry.Value = tIntPtr;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.UIntPtr, (keyEntry, entry, buffer) => {
                UIntPtr tUIntPtr;
                if (buffer.Length == 4)
                {
                    uint tUIntPtr2;
                    Marshal.Copy(buffer, 0, (IntPtr)(&tUIntPtr2), 4);
                    tUIntPtr = new UIntPtr(tUIntPtr2);
                }
                else
                {
                    ulong tUIntPtr3;
                    Marshal.Copy(buffer, 0, (IntPtr)(&tUIntPtr3), 8);
                    tUIntPtr = new UIntPtr(tUIntPtr3);
                }
                entry.Value = tUIntPtr;
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.DateTime, (keyEntry, entry, buffer) => entry.Value = DateTime.Parse(Encoding.ASCII.GetString(buffer)));
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.TimeSpan, (keyEntry, entry, buffer) => {
                double tTimeSpan;
                Marshal.Copy(buffer, 0, (IntPtr)(&tTimeSpan), 8);
                entry.Value = TimeSpan.FromMilliseconds(tTimeSpan);
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.String, (keyEntry, entry, buffer) => entry.Value = Encoding.UTF8.GetString(buffer));
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Stream, (keyEntry, entry, buffer) => entry.Value = new MemoryStream(buffer));
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Icon, (keyEntry, entry, buffer) => {
                using (MemoryStream memoryStream = new MemoryStream(buffer)) {
                    entry.Value = new System.Drawing.Icon(memoryStream);
                }
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Image, (keyEntry, entry, buffer) => {
                using (MemoryStream memoryStream = new MemoryStream(buffer)) {
                    entry.Value = System.Drawing.Image.FromStream(memoryStream);
                }
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Color, (keyEntry, entry, buffer) => {
                int tColor;
                Marshal.Copy(buffer, 0, (IntPtr)(&tColor), 4);
                entry.Value = System.Drawing.Color.FromArgb(tColor);
            });
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Guid, (keyEntry, entry, buffer) => entry.Value          = new Guid(buffer));
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.NestedPackage, (keyEntry, entry, buffer) => entry.Value = Load(buffer));
            _unPakcageValueSingleDataHandlers.Add(PackageValueTypes.Object, (keyEntry, entry, buffer) => {
                if (buffer.Length == 0)//NonPackage
                {
                    return;
                }
                using (MemoryStream stream = new MemoryStream(buffer)) {
                    byte flag = (byte)stream.ReadByte();
                    ICustomPackage customPackage = null;
                    byte[] buffer2;
                    if (flag == 0)
                    {
                        customPackage = PropertyPackage.Instance;
                    }
                    else if (flag == 1)
                    {
                        customPackage = FieldPackage.Instance;
                    }
                    else if (flag == 255)
                    {
                        short iShort;
                        buffer2 = new byte[2];
                        stream.Read(buffer2, 0, 2);
                        Marshal.Copy(buffer2, 0, (IntPtr)(&iShort), 2);
                        buffer2 = new byte [iShort];
                        stream.Read(buffer2, 0, iShort);
                        string typeFullName = Encoding.UTF8.GetString(buffer2);
                        Type customType     = FastWrapper.GetWarpperType(typeFullName);
                        if (customType == null)
                        {
                            throw new TypeLoadException("未能找到类型“" + typeFullName + "”");
                        }
                        customPackage = (ICustomPackage)FastWrapper.CreateInstance(customType);
                    }
                    else
                    {
                        throw new NotSupportedException();
                    }
                    //read to end
                    buffer2 = new byte[stream.Length - stream.Position];
                    stream.Read(buffer2, 0, buffer2.Length);
                    entry.Value = customPackage.Load(buffer2);
                }
            });
            #endregion
        }
示例#6
0
        static System.Type GenerateFunctionType(System.Type functionType)
        {
            SQLiteFunctionAttribute attribute = AttributeExtensions.GetCustomAttribute <SQLiteFunctionAttribute>(functionType);

            if (attribute == null)
            {
                return(null);
            }
            bool        ex       = TypeExtensions.IsInheritFrom(functionType, typeof(SQLiteFunctionEx)) || attribute.Type == FunctionTypes.Collation;
            FastWrapper baseType = GetType(ex ? "System.Data.SQLite.SQLiteFunctionEx" : "System.Data.SQLite.SQLiteFunction");


            System.Reflection.AssemblyName assemblyName = new System.Reflection.AssemblyName(functionType.Namespace + ".DynamicClass_" + functionType.Name);
            System.Reflection.Emit.AssemblyBuilderAccess accemblyBuilderAccess =
#if netcore
                System.Reflection.Emit.AssemblyBuilderAccess.Run;
#else
                IsDebug
                    ? System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave
                    : System.Reflection.Emit.AssemblyBuilderAccess.Run;
#endif
            System.Reflection.Emit.AssemblyBuilder assembly =
#if netcore
                System.Reflection.Emit.AssemblyBuilder.DefineDynamicAssembly(assemblyName, accemblyBuilderAccess);
#else
                System.AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, accemblyBuilderAccess);
#endif
#if !netcore
            bool canSave = (accemblyBuilderAccess == System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave || accemblyBuilderAccess == System.Reflection.Emit.AssemblyBuilderAccess.Save);
#endif
            System.Reflection.Emit.ModuleBuilder module =
#if netcore
                assembly.DefineDynamicModule(assemblyName.Name);
#else
                canSave
                    ? assembly.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll")
                    : assembly.DefineDynamicModule(assemblyName.Name);//, n.Name + ".dll");
#endif
            System.Reflection.Emit.TypeBuilder type = module.DefineType(
                assemblyName.Name + ".DynamicClass",
                System.Reflection.TypeAttributes.Public | System.Reflection.TypeAttributes.Sealed | System.Reflection.TypeAttributes.AutoClass,
                baseType.Type,
                System.Type.EmptyTypes);

            {
                FastWrapper wrapper = GetType("System.Data.SQLite.SQLiteFunctionAttribute");
                System.Reflection.PropertyInfo[] properties = new System.Reflection.PropertyInfo[] {
                    wrapper.Type.GetProperty("Name"),
                    wrapper.Type.GetProperty("Arguments"),
                    wrapper.Type.GetProperty("FuncType"),
                };
                System.Reflection.Emit.CustomAttributeBuilder attributeBuilder = new System.Reflection.Emit.CustomAttributeBuilder(wrapper.Type.GetConstructor(System.Type.EmptyTypes), new object[0],
                                                                                                                                   properties, new object[] {
                    attribute.Name,
                    attribute.Arguments,
                    TypeExtensions.Convert(attribute.Type, GetType("System.Data.SQLite.FunctionType").Type),
                });
                type.SetCustomAttribute(attributeBuilder);
            }
            System.Reflection.Emit.FieldBuilder _o = type.DefineField("_o", functionType, FieldAttributes.Private);

            {
                System.Reflection.Emit.ConstructorBuilder ctor = type.DefineConstructor(
                    System.Reflection.MethodAttributes.Public | System.Reflection.MethodAttributes.HideBySig | System.Reflection.MethodAttributes.SpecialName | System.Reflection.MethodAttributes.RTSpecialName,
                    System.Reflection.CallingConventions.HasThis,
                    System.Type.EmptyTypes);
                System.Reflection.Emit.ILGenerator il = ctor.GetILGenerator();
                il.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
                il.Emit(System.Reflection.Emit.OpCodes.Call, baseType.Type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.CreateInstance | BindingFlags.Instance, null, System.Type.EmptyTypes, new System.Reflection.ParameterModifier[0]));
                il.Emit(System.Reflection.Emit.OpCodes.Nop);
                il.Emit(System.Reflection.Emit.OpCodes.Nop);
                il.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
                il.Emit(System.Reflection.Emit.OpCodes.Newobj, functionType.GetConstructor(System.Type.EmptyTypes));
                il.Emit(System.Reflection.Emit.OpCodes.Stfld, _o);
                il.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
                il.Emit(System.Reflection.Emit.OpCodes.Ldfld, _o);
                il.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
                if (attribute.Type == FunctionTypes.Collation)
                {
                    il.Emit(System.Reflection.Emit.OpCodes.Ldc_I4_1);
                }
                else
                {
                    il.Emit(System.Reflection.Emit.OpCodes.Ldc_I4_0);
                }
                il.Emit(System.Reflection.Emit.OpCodes.Callvirt, functionType.GetMethod("Init", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, new System.Type[] {
                    typeof(object), typeof(bool)
                }, null));
                il.Emit(System.Reflection.Emit.OpCodes.Nop);
                il.Emit(System.Reflection.Emit.OpCodes.Ret);
            }
            CreateMethodDelegate createMethod = (methodInfo, action) => {
                System.Reflection.ParameterInfo[] parameters = methodInfo.GetParameters();
                System.Type[] parameterTypes = new System.Type[parameters.Length];
                for (int i = 0; i < parameters.Length; i++)
                {
                    parameterTypes[i] = parameters[i].ParameterType;
                }
                System.Reflection.Emit.MethodBuilder method = type.DefineMethod(methodInfo.Name, (methodInfo.Attributes | MethodAttributes.NewSlot) ^ MethodAttributes.NewSlot, methodInfo.CallingConvention, methodInfo.ReturnType, parameterTypes);
                for (int i = 0; i < parameters.Length; i++)
                {
                    System.Reflection.Emit.ParameterBuilder parameter = method.DefineParameter(i + 1, parameters[i].Attributes, parameters[i].Name);
                    if (parameters[i].IsOptional)
                    {
                        if (parameters[i].ParameterType.IsValueType && parameters[i].DefaultValue == null)
                        {
                            continue;
                        }
                        parameter.SetConstant(parameters[i].DefaultValue);
                    }
                }
                System.Reflection.Emit.ILGenerator il = method.GetILGenerator();
                bool hasReturn = (methodInfo.ReturnType != typeof(void));
                System.Reflection.Emit.LocalBuilder @return = null;
                if (hasReturn)
                {
                    @return = il.DeclareLocal(methodInfo.ReturnType);
                }
                il.Emit(System.Reflection.Emit.OpCodes.Nop);
                il.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
                il.Emit(System.Reflection.Emit.OpCodes.Ldfld, _o);
                action(functionType.GetMethod(methodInfo.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance), method, il);
                il.Emit(System.Reflection.Emit.OpCodes.Ret);
            };
            if (attribute.Type == FunctionTypes.Scalar)
            {
                createMethod(baseType.Type.GetMethod("Invoke"), (methodInfo, method, il) => {
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_1);
                    il.Emit(System.Reflection.Emit.OpCodes.Callvirt, methodInfo);
                    il.Emit(System.Reflection.Emit.OpCodes.Stloc_0);
                    System.Reflection.Emit.Label label = il.DefineLabel();
                    il.Emit(System.Reflection.Emit.OpCodes.Br_S, label);
                    il.MarkLabel(label);
                    il.Emit(System.Reflection.Emit.OpCodes.Ldloc_0);
                });
            }
            else if (attribute.Type == FunctionTypes.Collation)
            {
                createMethod(baseType.Type.GetMethod("Compare"), (methodInfo, method, il) => {
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_1);
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_2);
                    il.Emit(System.Reflection.Emit.OpCodes.Callvirt, methodInfo);
                    il.Emit(System.Reflection.Emit.OpCodes.Stloc_0);
                    System.Reflection.Emit.Label label = il.DefineLabel();
                    il.Emit(System.Reflection.Emit.OpCodes.Br_S, label);
                    il.MarkLabel(label);
                    il.Emit(System.Reflection.Emit.OpCodes.Ldloc_0);
                });
            }
            else
            {
                createMethod(baseType.Type.GetMethod("Final"), (methodInfo, method, il) => {
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_1);
                    il.Emit(System.Reflection.Emit.OpCodes.Callvirt, methodInfo);
                    il.Emit(System.Reflection.Emit.OpCodes.Stloc_0);
                    System.Reflection.Emit.Label label = il.DefineLabel();
                    il.Emit(System.Reflection.Emit.OpCodes.Br_S, label);
                    il.MarkLabel(label);
                    il.Emit(System.Reflection.Emit.OpCodes.Ldloc_0);
                });
                createMethod(baseType.Type.GetMethod("Step"), (methodInfo, method, il) => {
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_1);
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_2);
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_3);
                    il.Emit(System.Reflection.Emit.OpCodes.Callvirt, methodInfo);
                    il.Emit(System.Reflection.Emit.OpCodes.Nop);
                });
            }
            {
                System.Reflection.MethodInfo methodInfo_base = baseType.Type.GetMethod("Dispose", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, new System.Type[] { typeof(bool) }, null);
                createMethod(methodInfo_base, (methodInfo, method, il) => {
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_1);
                    il.Emit(System.Reflection.Emit.OpCodes.Callvirt, methodInfo);
                    il.Emit(System.Reflection.Emit.OpCodes.Nop);
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
                    il.Emit(System.Reflection.Emit.OpCodes.Ldarg_1);
                    il.Emit(System.Reflection.Emit.OpCodes.Call, methodInfo_base);
                    il.Emit(System.Reflection.Emit.OpCodes.Nop);
                });
            }

#if netcore20
            var result = type.CreateTypeInfo();
#else
            var result = type.CreateType();
#endif
#if !netcore
            if (canSave)
            {
                assembly.Save(assemblyName.Name + ".dll");
            }
#endif
            return(result);
        }