public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
        {
            Universe u = this.Module.universe;

            if (customBuilder.Constructor.DeclaringType == u.System_Runtime_InteropServices_FieldOffsetAttribute)
            {
                customBuilder = customBuilder.DecodeBlob(this.Module.Assembly);
                SetOffset((int)customBuilder.GetConstructorArgument(0));
            }
            else if (customBuilder.Constructor.DeclaringType == u.System_Runtime_InteropServices_MarshalAsAttribute)
            {
                MarshalSpec.SetMarshalAsAttribute(typeBuilder.ModuleBuilder, pseudoToken, customBuilder);
                attribs |= FieldAttributes.HasFieldMarshal;
            }
            else if (customBuilder.Constructor.DeclaringType == u.System_NonSerializedAttribute)
            {
                attribs |= FieldAttributes.NotSerialized;
            }
            else if (customBuilder.Constructor.DeclaringType == u.System_Runtime_CompilerServices_SpecialNameAttribute)
            {
                attribs |= FieldAttributes.SpecialName;
            }
            else
            {
                typeBuilder.ModuleBuilder.SetCustomAttribute(pseudoToken, customBuilder);
            }
        }
        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;
            }
        }
Exemple #3
0
        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;
        }
Exemple #4
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"));
        }
Exemple #5
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
        }
Exemple #6
0
        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;
        }