Esempio n. 1
0
        protected sealed override Guid?ComputeGuidFromCustomAttributes()
        {
            //
            // Look for a [Guid] attribute. If found, return that.
            //
            foreach (CustomAttributeHandle cah in _typeDefinition.CustomAttributes)
            {
                // We can't reference the GuidAttribute class directly as we don't have an official dependency on System.Runtime.InteropServices.
                // Following age-old CLR tradition, we search for the custom attribute using a name-based search. Since this makes it harder
                // to be sure we won't run into custom attribute constructors that comply with the GuidAttribute(String) signature,
                // we'll check that it does and silently skip the CA if it doesn't match the expected pattern.
                if (cah.IsCustomAttributeOfType(_reader, "System.Runtime.InteropServices", "GuidAttribute"))
                {
                    CustomAttribute ca = cah.GetCustomAttribute(_reader);
                    FixedArgumentHandleCollection.Enumerator fahEnumerator = ca.FixedArguments.GetEnumerator();
                    if (!fahEnumerator.MoveNext())
                    {
                        continue;
                    }
                    FixedArgumentHandle guidStringArgumentHandle = fahEnumerator.Current;
                    if (fahEnumerator.MoveNext())
                    {
                        continue;
                    }
                    FixedArgument guidStringArgument = guidStringArgumentHandle.GetFixedArgument(_reader);
                    if (!(guidStringArgument.Value.ParseConstantValue(_reader) is string guidString))
                    {
                        continue;
                    }
                    return(new Guid(guidString));
                }
            }

            return(null);
        }
Esempio n. 2
0
        // Equals/GetHashCode no need to override (they just implement reference equality but desktop never unified these things.)

        //
        // Helper for parsing custom attribute arguments.
        //
        // If throwIfMissingMetadata is false, returns default(CustomAttributeTypedArgument) rather than throwing a MissingMetadataException.
        //
        private CustomAttributeTypedArgument ParseFixedArgument(MetadataReader reader, FixedArgumentHandle fixedArgumentHandle, bool throwIfMissingMetadata, Func <RuntimeTypeInfo> getTypeFromConstructor)
        {
            FixedArgument   fixedArgument = fixedArgumentHandle.GetFixedArgument(reader);
            RuntimeTypeInfo argumentType  = null;

            if (fixedArgument.Type.IsNull(reader))
            {
                argumentType = getTypeFromConstructor();
                if (argumentType == null)
                {
                    Debug.Assert(!throwIfMissingMetadata);
                    return(default(CustomAttributeTypedArgument));
                }
            }
            else
            {
                Exception exception = null;
                argumentType = fixedArgument.Type.TryResolve(reader, new TypeContext(null, null), ref exception);
                if (argumentType == null)
                {
                    if (throwIfMissingMetadata)
                    {
                        throw exception;
                    }
                    else
                    {
                        return(default(CustomAttributeTypedArgument));
                    }
                }
            }

            Object    value;
            Exception e = fixedArgument.Value.TryParseConstantValue(reader, out value);

            if (e != null)
            {
                if (throwIfMissingMetadata)
                {
                    throw e;
                }
                else
                {
                    return(default(CustomAttributeTypedArgument));
                }
            }
            return(WrapInCustomAttributeTypedArgument(value, argumentType));
        }
Esempio n. 3
0
        private CustomAttribute HandleCustomAttribute(Cts.MethodDesc constructor, Ecma.CustomAttributeValue <Cts.TypeDesc> decodedValue)
        {
            CustomAttribute result = new CustomAttribute
            {
                Constructor = HandleQualifiedMethod(constructor),
            };

            result.FixedArguments.Capacity = decodedValue.FixedArguments.Length;
            foreach (var decodedArgument in decodedValue.FixedArguments)
            {
                var fixedArgument = new FixedArgument
                {
                    Type  = HandleType(decodedArgument.Type),
                    Value = HandleCustomAttributeConstantValue(decodedArgument.Type, decodedArgument.Value),
                };
                result.FixedArguments.Add(fixedArgument);
            }

            result.NamedArguments.Capacity = decodedValue.NamedArguments.Length;
            foreach (var decodedArgument in decodedValue.NamedArguments)
            {
                var namedArgument = new NamedArgument
                {
                    Flags = decodedArgument.Kind == Ecma.CustomAttributeNamedArgumentKind.Field ?
                            NamedArgumentMemberKind.Field : NamedArgumentMemberKind.Property,
                    Name  = HandleString(decodedArgument.Name),
                    Value = new FixedArgument
                    {
                        Type  = HandleType(decodedArgument.Type),
                        Value = HandleCustomAttributeConstantValue(decodedArgument.Type, decodedArgument.Value)
                    }
                };
                result.NamedArguments.Add(namedArgument);
            }

            return(result);
        }