internal static Attribute GetCustomAttribute(RuntimeType type) { if (!StructLayoutAttribute.IsDefined(type)) { return(null); } int num = 0; int size = 0; LayoutKind layoutKind = LayoutKind.Auto; TypeAttributes typeAttributes = type.Attributes & TypeAttributes.LayoutMask; if (typeAttributes != TypeAttributes.NotPublic) { if (typeAttributes != TypeAttributes.SequentialLayout) { if (typeAttributes == TypeAttributes.ExplicitLayout) { layoutKind = LayoutKind.Explicit; } } else { layoutKind = LayoutKind.Sequential; } } else { layoutKind = LayoutKind.Auto; } CharSet charSet = CharSet.None; typeAttributes = (type.Attributes & TypeAttributes.StringFormatMask); if (typeAttributes != TypeAttributes.NotPublic) { if (typeAttributes != TypeAttributes.UnicodeClass) { if (typeAttributes == TypeAttributes.AutoClass) { charSet = CharSet.Auto; } } else { charSet = CharSet.Unicode; } } else { charSet = CharSet.Ansi; } type.GetRuntimeModule().MetadataImport.GetClassLayout(type.MetadataToken, out num, out size); if (num == 0) { num = 8; } return(new StructLayoutAttribute(layoutKind, num, size, charSet)); }
internal static Attribute GetCustomAttribute(RuntimeType type) { if (!StructLayoutAttribute.IsDefined(type)) { return((Attribute)null); } int packSize = 0; int classSize = 0; LayoutKind layoutKind = LayoutKind.Auto; switch (type.Attributes & TypeAttributes.LayoutMask) { case TypeAttributes.NotPublic: layoutKind = LayoutKind.Auto; break; case TypeAttributes.SequentialLayout: layoutKind = LayoutKind.Sequential; break; case TypeAttributes.ExplicitLayout: layoutKind = LayoutKind.Explicit; break; } CharSet charSet = CharSet.None; switch (type.Attributes & TypeAttributes.StringFormatMask) { case TypeAttributes.NotPublic: charSet = CharSet.Ansi; break; case TypeAttributes.UnicodeClass: charSet = CharSet.Unicode; break; case TypeAttributes.AutoClass: charSet = CharSet.Auto; break; } type.GetRuntimeModule().MetadataImport.GetClassLayout(type.MetadataToken, out packSize, out classSize); if (packSize == 0) { packSize = 8; } return((Attribute) new StructLayoutAttribute(layoutKind, packSize, classSize, charSet)); }