Example #1
0
        public ModuleDefinition(MetadataHeader header, MetadataToken token, MetadataRow <ushort, uint, uint, uint, uint> row)
            : base(header, token, row)
        {
            var stringStream = header.GetStream <StringStream>();
            var guidStream   = header.GetStream <GuidStream>();

            Generation = row.Column1;
            _name      = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column2));
            _mvid      = new LazyValue <Guid>(() => guidStream.GetGuidByOffset(row.Column3));
            _encId     = new LazyValue <Guid>(() => guidStream.GetGuidByOffset(row.Column4));
            _encBaseId = new LazyValue <Guid>(() => guidStream.GetGuidByOffset(row.Column5));
        }
Example #2
0
        internal EventDefinition(MetadataHeader header, MetadataToken token, MetadataRow <ushort, uint, uint> row)
            : base(header, token, row)
        {
            Attributes = (EventAttributes)row.Column1;
            _name      = new LazyValue <string>(() => header.GetStream <StringStream>().GetStringByOffset(row.Column2));

            _eventType = new LazyValue <ITypeDefOrRef>(() =>
            {
                var tableStream    = header.GetStream <TableStream>();
                var eventTypeToken = tableStream.GetIndexEncoder(CodedIndex.TypeDefOrRef).DecodeIndex(row.Column3);
                return(eventTypeToken.Rid != 0 ? (ITypeDefOrRef)tableStream.ResolveMember(eventTypeToken) : null);
            });
        }
Example #3
0
        internal AssemblyReference(MetadataHeader header, MetadataToken token, MetadataRow <ushort, ushort, ushort, ushort, uint, uint, uint, uint, uint> row)
            : base(header, token, row)
        {
            var stringStream = header.GetStream <StringStream>();
            var blobStream   = header.GetStream <BlobStream>();

            Version    = new Version(row.Column1, row.Column2, row.Column3, row.Column4);
            Attributes = (AssemblyAttributes)row.Column5;
            _publicKey = new LazyValue <DataBlobSignature>(() => row.Column6 == 0 ? null : DataBlobSignature.FromReader(blobStream.CreateBlobReader(row.Column6)));
            _name      = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column7));
            _culture   = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column8));
            _hashValue = new LazyValue <DataBlobSignature>(() => row.Column9 == 0 ? null : DataBlobSignature.FromReader(blobStream.CreateBlobReader(row.Column9)));
        }
Example #4
0
        internal FieldMarshal(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();
            var blobStream  = header.GetStream <BlobStream>();

            _parent = new LazyValue <IHasFieldMarshal>(() =>
            {
                var parentToken = tableStream.GetIndexEncoder(CodedIndex.HasFieldMarshal).DecodeIndex(row.Column1);
                return(parentToken.Rid != 0 ? (IHasFieldMarshal)tableStream.ResolveMember(parentToken) : null);
            });

            _marshalDescriptor = new LazyValue <MarshalDescriptor>(() =>
                                                                   MarshalDescriptor.FromReader(blobStream.CreateBlobReader(row.Column2)));
        }
Example #5
0
        internal Constant(MetadataHeader header, MetadataToken token, MetadataRow <byte, byte, uint, uint> row)
            : base(header, token, row)
        {
            ConstantType = (ElementType)row.Column1;

            _parent = new LazyValue <IHasConstant>(() =>
            {
                var tableStream      = header.GetStream <TableStream>();
                var hasConstantToken = tableStream.GetIndexEncoder(CodedIndex.HasConstant).DecodeIndex(row.Column3);
                return(hasConstantToken.Rid != 0 ? (IHasConstant)tableStream.ResolveMember(hasConstantToken) : null);
            });

            _value = new LazyValue <DataBlobSignature>(() =>
                                                       DataBlobSignature.FromReader(header.GetStream <BlobStream>().CreateBlobReader(row.Column4)));
        }
Example #6
0
        internal PropertyMap(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();

            _parent = new LazyValue <TypeDefinition>(() => tableStream.GetTable <TypeDefinition>()[(int)row.Column1 - 1]);
        }
Example #7
0
        internal MetadataImage(MetadataHeader header)
        {
            if (header == null)
            {
                throw new ArgumentNullException("header");
            }
            Header = header;
            var tableStream = header.GetStream <TableStream>();

            var table = tableStream.GetTable(MetadataTokenType.Assembly);

            MetadataRow assemblyRow;

            if (table.TryGetRow(0, out assemblyRow))
            {
                Assembly = (AssemblyDefinition)table.GetMemberFromRow(this, assemblyRow);
            }
            else
            {
                Assembly = new AssemblyDefinition(null, new Version());
            }

            TypeSystem       = new TypeSystem(this, Assembly.Name == "mscorlib");
            MetadataResolver = new DefaultMetadataResolver(new DefaultNetAssemblyResolver());
        }
Example #8
0
        internal GenericParameter(MetadataHeader header, MetadataToken token, MetadataRow <ushort, ushort, uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();

            Index      = row.Column1;
            Attributes = (GenericParameterAttributes)row.Column2;

            _owner = new LazyValue <IGenericParameterProvider>(() =>
            {
                var ownerToken = tableStream.GetIndexEncoder(CodedIndex.TypeOrMethodDef).DecodeIndex(row.Column3);
                return(ownerToken.Rid != 0 ? (IGenericParameterProvider)tableStream.ResolveMember(ownerToken) : null);
            });

            _name = new LazyValue <string>(() => header.GetStream <StringStream>().GetStringByOffset(row.Column4));
        }
Example #9
0
        public static TypeSignature ParseType(MetadataHeader header, string name)
        {
            int position     = 0;
            var defaultScope = header == null ? null : header.GetStream <TableStream>().GetTable <ModuleDefinition>()[0];
            var type         = ReadTypeSignature(defaultScope, name, ref position);

            if (position >= name.Length)
            {
                return(type);
            }

            position++;
            SkipSpaces(name, ref position);

            var elementType = ((TypeReference)type.GetElementType());

            while (elementType.DeclaringType != null)
            {
                elementType = (TypeReference)elementType.DeclaringType;
            }

            if (position >= name.Length)
            {
                return(type);
            }

            elementType.ResolutionScope = ReadAssemblyReference(name, ref position);

            return(type);
        }
Example #10
0
 internal AssemblyRefProcessor(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint> row)
     : base(header, token, row)
 {
     Processor  = row.Column1;
     _reference = new LazyValue <AssemblyReference>(() =>
                                                    header.GetStream <TableStream>().GetTable <AssemblyReference>()[(int)(row.Column1 - 1)]);
 }
Example #11
0
        internal MemberReference(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();

            _parent = new LazyValue <IMemberRefParent>(() =>
            {
                var parentToken = tableStream.GetIndexEncoder(CodedIndex.MemberRefParent).DecodeIndex(row.Column1);
                return(parentToken.Rid != 0 ? (IMemberRefParent)tableStream.ResolveMember(parentToken) : null);
            });

            _name = new LazyValue <string>(() => header.GetStream <StringStream>().GetStringByOffset(row.Column2));

            _signature = new LazyValue <MemberSignature>(() =>
                                                         CallingConventionSignature.FromReader(header, header.GetStream <BlobStream>().CreateBlobReader(row.Column3)) as MemberSignature);
        }
 internal PropertyDefinition(MetadataHeader header, MetadataToken token, MetadataRow <ushort, uint, uint> row)
     : base(header, token, row)
 {
     Attributes = (PropertyAttributes)row.Column1;
     _name      = new LazyValue <string>(() => header.GetStream <StringStream>().GetStringByOffset(row.Column2));
     _signature = new LazyValue <PropertySignature>(() => PropertySignature.FromReader(header, header.GetStream <BlobStream>().CreateBlobReader(row.Column3)));
 }
Example #13
0
 internal FileDefinition(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint, uint> row)
     : base(header, token, row)
 {
     Attributes = (FileAttributes)row.Column1;
     _name      = new LazyValue <string>(() => header.GetStream <StringStream>().GetStringByOffset(row.Column2));
     _hashValue = new LazyValue <DataBlobSignature>(() =>
                                                    DataBlobSignature.FromReader(header.GetStream <BlobStream>().CreateBlobReader(row.Column3)));
 }
Example #14
0
        protected static void WriteTypeDefOrRef(MetadataHeader header, IBinaryStreamWriter writer, ITypeDefOrRef type)
        {
            var encoder =
                header.GetStream <TableStream>()
                .GetIndexEncoder(CodedIndex.TypeDefOrRef);

            writer.WriteCompressedUInt32(encoder.EncodeToken(type.MetadataToken));
        }
Example #15
0
 internal AssemblyRefOs(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint, uint, uint> row)
     : base(header, token, row)
 {
     PlatformId   = row.Column1;
     MajorVersion = row.Column2;
     MinorVersion = row.Column3;
     Reference    = header.GetStream <TableStream>().GetTable <AssemblyReference>()[(int)(row.Column4 - 1)];
 }
Example #16
0
        internal FieldLayout(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint> row)
            : base(header, token, row)
        {
            Offset = row.Column1;

            var tableStream = header.GetStream <TableStream>();

            _field = new LazyValue <FieldDefinition>(() => tableStream.GetTable <FieldDefinition>()[(int)(row.Column2 - 1)]);
        }
Example #17
0
        internal MethodDefinition(MetadataHeader header, MetadataToken token, MetadataRow <uint, ushort, ushort, uint, uint, uint> row)
            : base(header, token, row)
        {
            var stringStream = header.GetStream <StringStream>();
            var blobStream   = header.GetStream <BlobStream>();

            Rva            = row.Column1;
            ImplAttributes = (MethodImplAttributes)row.Column2;
            Attributes     = (MethodAttributes)row.Column3;
            _name          = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column4));

            IBinaryStreamReader blobReader;

            if (blobStream.TryCreateBlobReader(row.Column5, out blobReader))
            {
                _signature = new LazyValue <MethodSignature>(() => MethodSignature.FromReader(header, blobReader));
            }
        }
        internal PInvokeImplementation(MetadataHeader header, MetadataToken token, MetadataRow <ushort, uint, uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();

            Attributes = (PInvokeImplementationAttributes)row.Column1;

            _memberForwarded = new LazyValue <IMemberForwarded>(() =>
            {
                var memberForwardedToken = tableStream.GetIndexEncoder(CodedIndex.MemberForwarded).DecodeIndex(row.Column2);
                return(memberForwardedToken.Rid != 0
                    ? (IMemberForwarded)tableStream.ResolveMember(memberForwardedToken)
                    : null);
            });

            _importName  = new LazyValue <string>(() => header.GetStream <StringStream>().GetStringByOffset(row.Column3));
            _importScope = new LazyValue <ModuleReference>(() => tableStream.GetTable <ModuleReference>()[(int)(row.Column4 - 1)]);
        }
Example #19
0
        internal ParameterDefinition(MetadataHeader header, MetadataToken token, MetadataRow <ushort, ushort, uint> row)
            : base(header, token, row)
        {
            var stringStream = header.GetStream <StringStream>();

            Attributes = (ParameterAttributes)row.Column1;
            Sequence   = row.Column2;
            _name      = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column3));
        }
Example #20
0
        public ClassLayout(MetadataHeader header, MetadataToken token, MetadataRow <ushort, uint, uint> row)
            : base(header, token, row)
        {
            PackingSize = row.Column1;
            ClassSize   = row.Column2;

            var tableStream = header.GetStream <TableStream>();

            _parent = new LazyValue <TypeDefinition>(() => tableStream.GetTable <TypeDefinition>()[(int)(row.Column3 - 1)]);
        }
Example #21
0
        internal ExportedType(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint, uint, uint, uint> row)
            : base(header, token, row)
        {
            var tableStream  = header.GetStream <TableStream>();
            var stringStream = header.GetStream <StringStream>();

            Attributes      = (TypeAttributes)row.Column1;
            TypeDefId       = row.Column2;
            _typeName       = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column3));
            _typeNamespace  = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column4));
            _implementation = new LazyValue <IImplementation>(() =>
            {
                var implementationToken = tableStream.GetIndexEncoder(CodedIndex.Implementation)
                                          .DecodeIndex(row.Column5);
                return(implementationToken.Rid != 0
                    ? Implementation = (IImplementation)tableStream.ResolveMember(implementationToken)
                    : null);
            });
        }
Example #22
0
        internal FieldDefinition(MetadataHeader header, MetadataToken token, MetadataRow <ushort, uint, uint> row)
            : base(header, token, row)
        {
            var stringStream = header.GetStream <StringStream>();

            Attributes = (FieldAttributes)row.Column1;
            _name      = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column2));
            _signature = new LazyValue <FieldSignature>(() =>
                                                        FieldSignature.FromReader(header, header.GetStream <BlobStream>().CreateBlobReader(row.Column3)));
        }
Example #23
0
 internal StandAloneSignature(MetadataHeader header, MetadataToken token, MetadataRow <uint> row)
     : base(header, token, row)
 {
     _signature = new LazyValue <CallingConventionSignature>(() =>
     {
         IBinaryStreamReader reader;
         return(header.GetStream <BlobStream>().TryCreateBlobReader(row.Column1, out reader)
             ? CallingConventionSignature.FromReader(header, reader)
             : null);
     });
 }
Example #24
0
        internal TypeReference(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint, uint> row)
            : base(header, token, row)
        {
            var stringStream = header.GetStream <StringStream>();
            var tableStream  = header.GetStream <TableStream>();

            var resolutionScopeToken = tableStream.GetIndexEncoder(CodedIndex.ResolutionScope).DecodeIndex(row.Column1);

            if (resolutionScopeToken.Rid != 0)
            {
                MetadataMember resolutionScope;
                if (tableStream.TryResolveMember(resolutionScopeToken, out resolutionScope))
                {
                    ResolutionScope = resolutionScope as IResolutionScope;
                }
            }

            _name      = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column2));
            _namespace = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column3));
        }
Example #25
0
        internal ManifestResource(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint, uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();

            Offset     = row.Column1;
            Attributes = (ManifestResourceAttributes)row.Column2;

            _name           = new LazyValue <string>(() => header.GetStream <StringStream>().GetStringByOffset(row.Column3));
            _implementation = new LazyValue <IImplementation>(() =>
            {
                var implementationToken = tableStream.GetIndexEncoder(CodedIndex.Implementation)
                                          .DecodeIndex(row.Column4);
                return(implementationToken.Rid != 0
                    ? (IImplementation)tableStream.ResolveMember(implementationToken)
                    : null);
            });
            _data = new LazyValue <byte[]>(() => Implementation == null && Header != null
                ? Header.NetDirectory.GetResourceData(Offset)
                : null);
        }
Example #26
0
        internal GenericParameterConstraint(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();

            _owner = new LazyValue <GenericParameter>(() => tableStream.GetTable <GenericParameter>()[(int)(row.Column1 - 1)]);

            _constraint = new LazyValue <ITypeDefOrRef>(() =>
            {
                var constraintToken = tableStream.GetIndexEncoder(CodedIndex.TypeDefOrRef).DecodeIndex(row.Column2);
                return(constraintToken.Rid != 0 ? (ITypeDefOrRef)tableStream.ResolveMember(constraintToken) : null);
            });
        }
        public InterfaceImplementation(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();

            Class = tableStream.GetTable <TypeDefinition>()[(int)(row.Column1 - 1)];

            var interfaceToken = tableStream.GetIndexEncoder(CodedIndex.TypeDefOrRef).DecodeIndex(row.Column2);

            if (interfaceToken.Rid != 0)
            {
                Interface = (ITypeDefOrRef)tableStream.ResolveMember(interfaceToken);
            }
        }
Example #28
0
        internal MethodSpecification(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();

            _method = new LazyValue <IMethodDefOrRef>(() =>
            {
                var methodToken = tableStream.GetIndexEncoder(CodedIndex.MethodDefOrRef).DecodeIndex(row.Column1);
                return(methodToken.Rid != 0 ? (IMethodDefOrRef)tableStream.ResolveMember(methodToken) : null);
            });

            _signature = new LazyValue <GenericInstanceMethodSignature>(() =>
                                                                        GenericInstanceMethodSignature.FromReader(header, header.GetStream <BlobStream>().CreateBlobReader(row.Column2)));
        }
Example #29
0
        internal TypeDefinition(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint, uint, uint, uint, uint> row)
            : base(header, token, row)
        {
            var stringStream = header.GetStream <StringStream>();
            var tableStream  = header.GetStream <TableStream>();

            Attributes = (TypeAttributes)row.Column1;

            _name      = _namespace = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column2));
            _namespace = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column3));
            _baseType  = new LazyValue <ITypeDefOrRef>(() =>
            {
                var baseTypeToken = tableStream.GetIndexEncoder(CodedIndex.TypeDefOrRef).DecodeIndex(row.Column4);
                if (baseTypeToken.Rid != 0)
                {
                    MetadataMember baseType;
                    if (tableStream.TryResolveMember(baseTypeToken, out baseType))
                    {
                        return(baseType as ITypeDefOrRef);
                    }
                }
                return(null);
            });
        }
Example #30
0
        internal FieldRva(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint> row)
            : base(header, token, row)
        {
            Rva = row.Column1;

            _field = new LazyValue <FieldDefinition>(() =>
                                                     header.GetStream <TableStream>().GetTable <FieldDefinition>()[(int)(row.Column2 - 1)]);

            _data = new LazyValue <byte[]>(() =>
            {
                var assembly = Header.NetDirectory.Assembly;
                var reader   = assembly.ReadingContext.Reader.CreateSubReader(assembly.RvaToFileOffset(Rva), GetDataSize());
                return(reader.ReadBytes((int)reader.Length));
            });
        }
Example #31
0
        public TypeSystem(MetadataHeader header, bool isMsCorLib)
        {
            _header = header;
            _isMsCorLib = isMsCorLib;

            if (!isMsCorLib)
            {
                MsCorLibReference = header.GetStream<TableStream>().GetTable<AssemblyReference>().FirstOrDefault(x => x.Name == "mscorlib");
                if (MsCorLibReference == null)
                {
                    MsCorLibReference = new AssemblyReference(new ReflectionAssemblyNameWrapper(typeof(object).Assembly.GetName()))
                    {
                        Header = header,
                        Culture = "neutral",
                        Version = new Version(header.VersionString[1] - 48, 0, 0, 0)
                    };
                }
            }

            Boolean = CreateSignature(ElementType.Boolean, "Boolean", true);
            SByte = CreateSignature(ElementType.I1, "SByte", true);
            Int16 = CreateSignature(ElementType.I2, "Int16", true);
            Int32 = CreateSignature(ElementType.I4, "Int32", true);
            Int64 = CreateSignature(ElementType.I8, "Int64", true);
            IntPtr = CreateSignature(ElementType.I, "IntPtr", true);
            Byte = CreateSignature(ElementType.U1, "Byte", true);
            UInt16 = CreateSignature(ElementType.U2, "UInt16", true);
            UInt32 = CreateSignature(ElementType.U4, "UInt32", true);
            UInt64 = CreateSignature(ElementType.U8, "UInt64", true);
            UIntPtr = CreateSignature(ElementType.U, "UIntPtr", true);
            Single = CreateSignature(ElementType.R4, "Single", true);
            Double = CreateSignature(ElementType.R8, "Double", true);
            Object = CreateSignature(ElementType.Object, "Object", false);
            Char = CreateSignature(ElementType.Char, "Char", true);
            String = CreateSignature(ElementType.String, "String", false);
            Type = CreateSignature(ElementType.Type, "Type", false);
            TypedReference = CreateSignature(ElementType.TypedByRef, "TypedReference", true);
            Void = CreateSignature(ElementType.Void, "Void", true);
        }
Example #32
0
        public static TypeSignature ParseType(MetadataHeader header, string name)
        {
            int position = 0;
            var defaultScope = header == null ? null : header.GetStream<TableStream>().GetTable<ModuleDefinition>()[0];
            var type = ReadTypeSignature(defaultScope, name, ref position);

            if (position >= name.Length)
                return type;

            position++;
            SkipSpaces(name, ref position);

            var elementType = ((TypeReference)type.GetElementType());
            while (elementType.DeclaringType != null)
                elementType = (TypeReference)elementType.DeclaringType;

            if (position >= name.Length)
                return type;

            elementType.ResolutionScope = ReadAssemblyReference(name, ref position);

            return type;
        }
Example #33
0
 protected static void WriteTypeDefOrRef(MetadataHeader header, IBinaryStreamWriter writer, ITypeDefOrRef type)
 {
     var encoder =
         header.GetStream<TableStream>()
             .GetIndexEncoder(CodedIndex.TypeDefOrRef);
     writer.WriteCompressedUInt32(encoder.EncodeToken(type.MetadataToken));
 }
Example #34
0
        protected static ITypeDefOrRef ReadTypeDefOrRef(MetadataHeader header, IBinaryStreamReader reader)
        {
            var tableStream = header.GetStream<TableStream>();

            uint codedIndex;
            if (!reader.TryReadCompressedUInt32(out codedIndex))
                return null;

            MetadataMember type;
            tableStream.TryResolveMember(tableStream.GetIndexEncoder(CodedIndex.TypeDefOrRef)
                .DecodeIndex(codedIndex), out type);

            return type as ITypeDefOrRef;
        }