private void SetStructLayoutPseudoCustomAttribute(CustomAttributeBuilder customBuilder) { object val = customBuilder.GetConstructorArgument(0); LayoutKind layout; if (val is short) { layout = (LayoutKind)(short)val; } else { layout = (LayoutKind)val; } int?pack = (int?)customBuilder.GetFieldValue("Pack"); int?size = (int?)customBuilder.GetFieldValue("Size"); if (pack.HasValue || size.HasValue) { ClassLayoutTable.Record rec = new ClassLayoutTable.Record(); rec.PackingSize = (short)(pack ?? 0); rec.ClassSize = size ?? 0; rec.Parent = token; this.ModuleBuilder.ClassLayout.AddRecord(rec); } attribs &= ~TypeAttributes.LayoutMask; switch (layout) { case LayoutKind.Auto: attribs |= TypeAttributes.AutoLayout; break; case LayoutKind.Explicit: attribs |= TypeAttributes.ExplicitLayout; break; case LayoutKind.Sequential: attribs |= TypeAttributes.SequentialLayout; break; } CharSet?charSet = customBuilder.GetFieldValue <CharSet>("CharSet"); attribs &= ~TypeAttributes.StringFormatMask; switch (charSet ?? CharSet.None) { case CharSet.None: case CharSet.Ansi: attribs |= TypeAttributes.AnsiClass; break; case CharSet.Auto: attribs |= TypeAttributes.AutoClass; break; case CharSet.Unicode: attribs |= TypeAttributes.UnicodeClass; break; } }
private void SetStructLayoutPseudoCustomAttribute(CustomAttributeBuilder customBuilder) { object val = customBuilder.GetConstructorArgument(0); LayoutKind layout; if (val is short) { layout = (LayoutKind)(short)val; } else { layout = (LayoutKind)val; } StructLayoutAttribute attr = new StructLayoutAttribute(layout); attr.Pack = (int?)customBuilder.GetFieldValue("Pack") ?? 0; attr.Size = (int?)customBuilder.GetFieldValue("Size") ?? 0; attr.CharSet = customBuilder.GetFieldValue <CharSet>("CharSet") ?? CharSet.None; attribs &= ~TypeAttributes.LayoutMask; switch (attr.Value) { case LayoutKind.Auto: attribs |= TypeAttributes.AutoLayout; break; case LayoutKind.Explicit: attribs |= TypeAttributes.ExplicitLayout; break; case LayoutKind.Sequential: attribs |= TypeAttributes.SequentialLayout; break; } attribs &= ~TypeAttributes.StringFormatMask; switch (attr.CharSet) { case CharSet.None: case CharSet.Ansi: attribs |= TypeAttributes.AnsiClass; break; case CharSet.Auto: attribs |= TypeAttributes.AutoClass; break; case CharSet.Unicode: attribs |= TypeAttributes.UnicodeClass; break; } pack = (short)attr.Pack; size = attr.Size; hasLayout = pack != 0 || size != 0; }
private void SetMethodImplAttribute(CustomAttributeBuilder customBuilder) { MethodImplOptions opt; switch (customBuilder.Constructor.ParameterCount) { case 0: opt = 0; break; case 1: { object val = customBuilder.GetConstructorArgument(0); if (val is short) { opt = (MethodImplOptions)(short)val; } else if (val is int) { opt = (MethodImplOptions)(int)val; } else { opt = (MethodImplOptions)val; } break; } default: throw new NotSupportedException(); } implFlags = (MethodImplAttributes)opt; #if NETSTANDARD object type = customBuilder.GetFieldValue("MethodCodeType"); if (type != null) { implFlags |= (MethodImplAttributes)(int)type; } #else MethodCodeType?type = customBuilder.GetFieldValue <MethodCodeType>("MethodCodeType"); if (type.HasValue) { implFlags |= (MethodImplAttributes)type; } #endif }
private void SetDllImportPseudoCustomAttribute(CustomAttributeBuilder customBuilder) { CallingConvention?callingConvention = customBuilder.GetFieldValue <CallingConvention>("CallingConvention"); CharSet? charSet = customBuilder.GetFieldValue <CharSet>("CharSet"); SetDllImportPseudoCustomAttribute((string)customBuilder.GetConstructorArgument(0), (string)customBuilder.GetFieldValue("EntryPoint"), callingConvention, charSet, (bool?)customBuilder.GetFieldValue("BestFitMapping"), (bool?)customBuilder.GetFieldValue("ThrowOnUnmappableChar"), (bool?)customBuilder.GetFieldValue("SetLastError"), (bool?)customBuilder.GetFieldValue("PreserveSig"), (bool?)customBuilder.GetFieldValue("ExactSpelling")); }
private void SetStructLayoutPseudoCustomAttribute(CustomAttributeBuilder customBuilder) { object val = customBuilder.GetConstructorArgument(0); LayoutKind layout; if (val is short) { layout = (LayoutKind)(short)val; } else { layout = (LayoutKind)val; } pack = (short)((int?)customBuilder.GetFieldValue("Pack") ?? 0); size = (int?)customBuilder.GetFieldValue("Size") ?? 0; #if NETSTANDARD CharSet charSet = customBuilder.GetFieldValue <CharSet>("CharSet") ?? (CharSet)1; #else CharSet charSet = customBuilder.GetFieldValue <CharSet>("CharSet") ?? CharSet.None; #endif attribs &= ~TypeAttributes.LayoutMask; switch (layout) { case LayoutKind.Auto: attribs |= TypeAttributes.AutoLayout; break; case LayoutKind.Explicit: attribs |= TypeAttributes.ExplicitLayout; break; case LayoutKind.Sequential: attribs |= TypeAttributes.SequentialLayout; break; } attribs &= ~TypeAttributes.StringFormatMask; switch (charSet) { #if NETSTANDARD case (CharSet)1: #else case CharSet.None: #endif case CharSet.Ansi: attribs |= TypeAttributes.AnsiClass; break; #if NETSTANDARD case (CharSet)4: #else case CharSet.Auto: #endif attribs |= TypeAttributes.AutoClass; break; case CharSet.Unicode: attribs |= TypeAttributes.UnicodeClass; break; } hasLayout = pack != 0 || size != 0; }