public MetadataICodeElementAdapter(MetadataReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            this.Reader = reader;
        }
        public EventMetadataICodeElementAdapter(Event @event, TypeDefinition typeDefinition, IList<TypeDescriptor> genericTypes, MetadataReader reader)
            : base(typeDefinition, genericTypes, reader)
        {
            if (@event == null)
            {
                throw new ArgumentNullException("event");
            }

            this.Event = @event;
        }
        public PropertyMetadataICodeElementAdapter(Property property, TypeDefinition typeDefinition, IList<TypeDescriptor> genericTypes, MetadataReader reader)
            : base(typeDefinition, genericTypes, reader)
        {
            if (property == null)
            {
                throw new ArgumentNullException("property");
            }

            this.Property = property;
        }
        public MethodMetadataICodeElementAdapter(Method method, TypeDefinition typeDefinition, IList<TypeDescriptor> genericTypes, MetadataReader reader)
            : base(typeDefinition, genericTypes, reader)
        {
            if (method == null)
            {
                throw new ArgumentNullException("method");
            }

            this.Method = method;
        }
        public FieldMetadataICodeElementAdapter(Field field, TypeDefinition typeDefinition, IList<TypeDescriptor> genericTypes, MetadataReader reader)
            : base(typeDefinition, genericTypes, reader)
        {
            if (field == null)
            {
                throw new ArgumentNullException("field");
            }

            this.Field = field;
        }
        public TypeDefinitionMetadataICodeElementAdapterBase(TypeDefinition typeDefinition, IList<TypeDescriptor> genericTypes, MetadataReader reader)
            : base(reader)
        {
            if (typeDefinition == null)
            {
                throw new ArgumentNullException("typeDefinition");
            }

            this.TypeDefinition = typeDefinition;
            this.GenericTypes = genericTypes;
        }
        public static TypeDescriptor ReadSignatureBlobType(this byte[] signatureBlob, MetadataReader reader, ref int position)
        {
            var type = (CorElementType)signatureBlob.ReadCompressedUsigned(ref position);
            if (type == CorElementType.ELEMENT_TYPE_CMOD_OPT || type == CorElementType.ELEMENT_TYPE_CMOD_REQD)
            {
                // does not support
                throw new NotImplementedException();
            }

            return signatureBlob.DecodeTypeAndTypeDefOrRefOrSpecEncoded(type, ref position, reader);
        }
예제 #8
0
        // todo: finish reading parameters types from Signature
        public void ReadSignature(MetadataReader reader)
        {
            if (this.SignatureBlob == null || this.SignatureBlob.Length == 0)
            {
                throw new ArgumentException("SignatureBlob is empty");
            }

            this.CallingConvention = (CorCallingConvention)(this.SignatureBlob[0] & 0x0f);

            int position = 1;
            this.ParamCount = (int)this.SignatureBlob.ReadCompressedUsigned(ref position);

            this.ReturnTypeDescriptor = this.SignatureBlob.ReadSignatureBlobType(reader, ref position);
        }
        public void Load_Platform_Winmd_Test()
        {
            var metadataReader = new MetadataReader(@"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\Microsoft.VCLibs\11.0\References\CommonConfiguration\neutral\Platform.winmd");
            foreach (var typeDef in metadataReader.EnumerateTypeDefinitions())
            {
                Assert.IsNotNull(typeDef);
            }

            foreach (var typeRef in metadataReader.EnumerateTypeReferences())
            {
                Assert.IsNotNull(typeRef);
            }

            foreach (var moduleRef in metadataReader.EnumerateModuleReferences())
            {
                Assert.IsNotNull(moduleRef);
            }
        }
        public void Load_Windows_Winmd_Test()
        {
            var metadataReader = new MetadataReader(@"C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\Windows.winmd");
            foreach (var typeDef in metadataReader.EnumerateTypeDefinitions())
            {
                Assert.IsNotNull(typeDef);
            }

            foreach (var typeRef in metadataReader.EnumerateTypeReferences())
            {
                Assert.IsNotNull(typeRef);
            }

            foreach (var moduleRef in metadataReader.EnumerateModuleReferences())
            {
                Assert.IsNotNull(moduleRef);
            }

            Assert.IsTrue(
                metadataReader.EnumerateTypeDefinitions().Any(x => x.FullName.Equals("Windows.Foundation.Collections.IMap`2")));
            Assert.IsTrue(
                metadataReader.EnumerateTypeDefinitions().Any(x => x.FullName.Equals("Windows.Foundation.Collections.IObservableMap`2")));
        }
 public void LoadNamesFrom(string winmdFilePath)
 {
     var metadataReader = new MetadataReader(winmdFilePath);
     foreach (var typeDefinition in metadataReader.EnumerateTypeDefinitions())
     {
         this.Add(new TypeDefinitionMetadataICodeElementAdapter(typeDefinition, null, metadataReader));
     }
 }
 public TypeDefinitionMetadataICodeElementAdapter(TypeDefinition typeDefinition, IList<TypeDescriptor> genericTypes, MetadataReader reader)
     : base(typeDefinition, genericTypes, reader)
 {
 }
 public TypeDefinitionMetadataICodeElementAdapter(TypeDescriptor typeDescriptor, MetadataReader reader)
     : base(typeDescriptor.TypeDefinition, typeDescriptor.GenericTypes, reader)
 {
     this.TypeDescriptor = typeDescriptor;
 }
 public void ReadSignature(MetadataReader reader)
 {
     var position = 0;
     this.TypeDescriptor = this.SignatureBlob.ReadSignatureBlobType(reader, ref position);
 }
        private static TypeDescriptor DecodeTypeAndTypeDefOrRefOrSpecEncoded(this byte[] signatureBlob, CorElementType type, ref int position, MetadataReader reader)
        {
            var typeDescriptor = new Dtos.TypeDescriptor { ElementType = type, GenericParamNumber = 0, GenericParametersCount = 0 };

            if (type == CorElementType.ELEMENT_TYPE_CLASS)
            {
                // read Token ReturnElementType Def / ReturnElementType Ref / ReturnElementType Spec
                typeDescriptor.TypeDefinition = ReadDecodeTypeDefOrRefOrSpecEncoded(signatureBlob, reader, ref position);
            }
            else if (type == CorElementType.ELEMENT_TYPE_VALUETYPE)
            {
                // read Token ReturnElementType Def / ReturnElementType Ref / ReturnElementType Spec
                typeDescriptor.TypeDefinition = ReadDecodeTypeDefOrRefOrSpecEncoded(signatureBlob, reader, ref position);
            }
            else if (type == CorElementType.ELEMENT_TYPE_GENERICINST)
            {
                var baseGeneticType = (CorElementType)signatureBlob.ReadCompressedUsigned(ref position);
                typeDescriptor = signatureBlob.DecodeTypeAndTypeDefOrRefOrSpecEncoded(baseGeneticType, ref position, reader);
                typeDescriptor.GenericParametersCount = signatureBlob.ReadCompressedUsigned(ref position);

                var genericTypes = new List<TypeDescriptor>();
                for (var i = 0; i < (int) typeDescriptor.GenericParametersCount; i++)
                {
                    var elementType = (CorElementType)signatureBlob.ReadCompressedUsigned(ref position);
                    var genericTypeDescriptor = signatureBlob.DecodeTypeAndTypeDefOrRefOrSpecEncoded(elementType, ref position, reader);
                    genericTypes.Add(genericTypeDescriptor);
                }

                typeDescriptor.GenericTypes = genericTypes;
            }
            else if (type == CorElementType.ELEMENT_TYPE_I
                || type == CorElementType.ELEMENT_TYPE_I1
                || type == CorElementType.ELEMENT_TYPE_I2
                || type == CorElementType.ELEMENT_TYPE_I4
                || type == CorElementType.ELEMENT_TYPE_I8
                || type == CorElementType.ELEMENT_TYPE_U
                || type == CorElementType.ELEMENT_TYPE_U1
                || type == CorElementType.ELEMENT_TYPE_U2
                || type == CorElementType.ELEMENT_TYPE_U4
                || type == CorElementType.ELEMENT_TYPE_U8
                || type == CorElementType.ELEMENT_TYPE_R4
                || type == CorElementType.ELEMENT_TYPE_R8
                || type == CorElementType.ELEMENT_TYPE_BOOLEAN
                || type == CorElementType.ELEMENT_TYPE_OBJECT
                || type == CorElementType.ELEMENT_TYPE_STRING
                || type == CorElementType.ELEMENT_TYPE_VOID)
            {
                // ignore it is value type
                // todo: do I need to read it from Plaform.winmd?
                // todo: what is ELEMENT_TYPE_VAR <number>?
            }
            else if (type == CorElementType.ELEMENT_TYPE_VAR ||
                type == CorElementType.ELEMENT_TYPE_MVAR)
            {
                typeDescriptor.GenericParamNumber = signatureBlob.ReadCompressedUsigned(ref position);
            }
            else
            {
                throw new NotImplementedException();
            }

            return typeDescriptor;
        }
        private static TypeDefinition ReadDecodeTypeDefOrRefOrSpecEncoded(
            this byte[] signatureBlob, MetadataReader reader, ref int position)
        {
            var encoded = (int)signatureBlob.ReadCompressedUsigned(ref position);
            var tokenTable = encoded.TypeDefOrRefOrSpec();
            var classTokenType = encoded.DecodeTypeDefOrRefOrSpecLowTokenOnly();

            switch (tokenTable)
            {
                case 0:
                    return reader.GetTypeDefinitionProperties(classTokenType | (int)CorTokenType.TypeDef);
                case 1:
                    return reader.GetTypeDefByTypeRef(reader.GetTypeReferenceProperties(classTokenType | (int)CorTokenType.TypeRef));
                case 2:
                    throw new NotImplementedException();
            }

            throw new IndexOutOfRangeException("tokenTable");
        }