/// <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); }
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 }