コード例 #1
0
        internal static void Decode(ref DecodeWellKnownAttributeArguments <TAttributeSyntax, TAttributeData, TAttributeLocation> arguments, AttributeTargets target, CommonMessageProvider messageProvider)
        {
            Debug.Assert((object)arguments.AttributeSyntaxOpt != null);

            UnmanagedType unmanagedType = DecodeMarshalAsType(arguments.Attribute);

            switch (unmanagedType)
            {
            case Cci.Constants.UnmanagedType_CustomMarshaler:
                DecodeMarshalAsCustom(ref arguments, messageProvider);
                break;

            case UnmanagedType.Interface:
            case Cci.Constants.UnmanagedType_IDispatch:
            case UnmanagedType.IUnknown:
                DecodeMarshalAsComInterface(ref arguments, unmanagedType, messageProvider);
                break;

            case UnmanagedType.LPArray:
                DecodeMarshalAsArray(ref arguments, messageProvider, isFixed: false);
                break;

            case UnmanagedType.ByValArray:
                if (target != AttributeTargets.Field)
                {
                    messageProvider.ReportMarshalUnmanagedTypeOnlyValidForFields(arguments.Diagnostics, arguments.AttributeSyntaxOpt, 0, "ByValArray", arguments.Attribute);
                }
                else
                {
                    DecodeMarshalAsArray(ref arguments, messageProvider, isFixed: true);
                }

                break;

            case Cci.Constants.UnmanagedType_SafeArray:
                DecodeMarshalAsSafeArray(ref arguments, messageProvider);
                break;

            case UnmanagedType.ByValTStr:
                if (target != AttributeTargets.Field)
                {
                    messageProvider.ReportMarshalUnmanagedTypeOnlyValidForFields(arguments.Diagnostics, arguments.AttributeSyntaxOpt, 0, "ByValTStr", arguments.Attribute);
                }
                else
                {
                    DecodeMarshalAsFixedString(ref arguments, messageProvider);
                }

                break;

            case Cci.Constants.UnmanagedType_VBByRefStr:
                if (target == AttributeTargets.Field)
                {
                    messageProvider.ReportMarshalUnmanagedTypeNotValidForFields(arguments.Diagnostics, arguments.AttributeSyntaxOpt, 0, "VBByRefStr", arguments.Attribute);
                }
                else
                {
                    // named parameters ignored with no error
                    arguments.GetOrCreateData <TWellKnownAttributeData>().GetOrCreateData().SetMarshalAsSimpleType(unmanagedType);
                }

                break;

            default:
                if ((int)unmanagedType < 0 || (int)unmanagedType > MarshalPseudoCustomAttributeData.MaxMarshalInteger)
                {
                    // Dev10 reports CS0647: "Error emitting attribute ..."
                    messageProvider.ReportInvalidAttributeArgument(arguments.Diagnostics, arguments.AttributeSyntaxOpt, 0, arguments.Attribute);
                }
                else
                {
                    // named parameters ignored with no error
                    arguments.GetOrCreateData <TWellKnownAttributeData>().GetOrCreateData().SetMarshalAsSimpleType(unmanagedType);
                }

                break;
            }
        }