示例#1
0
        /// <summary>
        /// Gets type size in unmanaged memory (directly in SOH/LOH) by type
        /// </summary>
        public static unsafe int SizeOf(EntityInfo *entity)
        {
            var flags  = (uint)entity->MethodTable->Flags;
            var flags2 = (uint)entity->MethodTable->AdditionalFlags;

            // if boxed elementary type
            if (flags == 0x00270000)
            {
                return(entity->MethodTable->Size);
            }

            // Array
            if ((flags & 0xffff0000) == 0x800a0000)
            {
                var arrayinfo = (ArrayInfo *)entity;
                return(arrayinfo->SizeOf());
            }

            // ???
            if ((flags & 0xffff0000) == 0x01400200)
            {
                return(entity->MethodTable->Size);
            }

            // COM interface: have no size and have no .Net class
            if ((flags & 0xffff0000) == 0x000c0000)
            {
                return(SizeOf <object>());
            }

            // String
            if ((entity->MethodTable) == StringTypeHandle.ToPointer())
            {
                // TODO: on 4th nedds to be tested
                if (MajorNetVersion >= 4)
                {
                    var length = *(int *)((int)entity + 8);
                    return(4 * ((14 + 2 * length + 3) / 4));
                }
                else
                {
                    // on 1.0 -> 3.5 string have additional RealLength field
                    var length = *(int *)((int)entity + 12);
                    return(4 * ((16 + 2 * length + 3) / 4));
                }
            }
            else if ((flags2 & (int)MethodTableFlags2.IsInterface) != 0 ||
                     ((flags & (int)MethodTableFlags.InternalCorElementTypeExtraInfoMask) == (int)MethodTableFlags.InternalCorElementTypeExtraInfo_IfNotArrayThenClass))
            {
                return(entity->MethodTable->Size);
            }
            else if ((flags & (int)MethodTableFlags.InternalCorElementTypeExtraInfoMask) == (int)MethodTableFlags.InternalCorElementTypeExtraInfo_IfNotArrayThenValueType)
            {
                return(entity->MethodTable->Size);
            }


            return(entity->MethodTable->Size);
        }
示例#2
0
        private static unsafe int SizeOf(EntityInfo *entity)
        {
            var flags = (uint)entity->MethodTable->Flags;

            // if boxed elementary type
            if (flags == 0x00270000)
            {
                return(entity->MethodTable->Size);
            }

            // Array
            if ((flags & 0xffff0000) == 0x800a0000)
            {
                return(((ArrayInfo *)entity)->SizeOf());
            }

            // ???
            if ((flags & 0xffff0000) == 0x01400200)
            {
                return(entity->MethodTable->Size);
            }

            // COM interface: have no size and have no .Net class
            if ((flags & 0xffff0000) == 0x000c0000)
            {
                return(SizeOf <object>());
            }

            // String
            if (entity->MethodTable != typeof(string).TypeHandle.Value.ToPointer())
            {
                return(entity->MethodTable->Size);
            }
            return(Environment.Version.Major >= 4
                ? 4 * ((14 + 2 * *(int *)((int)entity + 8) + 3) / 4)
                : 4 * ((16 + 2 * *(int *)((int)entity + 12) + 3) / 4));
            // on 1.0 -> 3.5 string have additional RealLength field
        }