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; CharSet charSet = customBuilder.GetFieldValue <CharSet>("CharSet") ?? (CharSet)1; // CharSet.None 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) { case (CharSet)1: // CharSet.None case CharSet.Ansi: attribs |= TypeAttributes.AnsiClass; break; case (CharSet)4: // CharSet.Auto attribs |= TypeAttributes.AutoClass; break; case CharSet.Unicode: attribs |= TypeAttributes.UnicodeClass; break; } hasLayout = pack != 0 || size != 0; }
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 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; object type = customBuilder.GetFieldValue("MethodCodeType"); if (type != null) { implFlags |= (MethodImplAttributes)(int)type; } }