示例#1
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;
            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;
            }
        }