コード例 #1
0
            public TypeDefBuilder(BuildReferences references, TypeDefMetadataTableRow fromRow)
            {
                _references = references;

                _assembly       = references.Assembly;
                _fromRow        = fromRow;
                _metadata       = references.Metadata;
                _map            = references.Map;
                _metadataStream = _metadata.GetMetadataStream();
            }
コード例 #2
0
            public MethodDefBuilder(BuildReferences references, TypeDef container, MethodMetadataTableRow fromRow)
            {
                _metadata       = references.Metadata;
                _map            = references.Map;
                _assembly       = references.Assembly;
                _container      = container;
                _fromRow        = fromRow;
                _metadataStream = _metadata.Streams[Streams.MetadataStream] as MetadataStream;
                _blobStream     = _metadata.Streams[Streams.BlobStream] as BlobStream;

                _references = references;
            }
コード例 #3
0
        /// <include file='code-documentation\reflection.xml' path='docs/assemblydef/member[@name="resolvemetadatatoken"]/*'/>
        public ReflectedMember ResolveMetadataToken(uint metadataToken)
        {
            MetadataToDefinitionMap map            = _peCoffFile.Map;
            MetadataStream          metadataStream = _peCoffFile.GetMetadataDirectory().GetMetadataStream();

            // Get the details in the token
            ILMetadataToken token = (ILMetadataToken)(metadataToken & 0xff000000);
            uint            index = metadataToken & 0x00ffffff;

            ReflectedMember returnItem = null;

            //
            switch (token)
            {
            // Method related tokens
            case ILMetadataToken.MethodDef:
                returnItem = map.GetDefinition(MetadataTables.MethodDef, metadataStream.GetEntryFor(MetadataTables.MethodDef, index));
                break;

            case ILMetadataToken.MemberRef:
                returnItem = map.GetDefinition(MetadataTables.MemberRef, metadataStream.GetEntryFor(MetadataTables.MemberRef, index));
                break;

            case ILMetadataToken.MethodSpec:
                returnItem = map.GetDefinition(MetadataTables.MethodSpec, metadataStream.GetEntryFor(MetadataTables.MethodSpec, index));
                break;

            // Type related tokens
            case ILMetadataToken.TypeDef:
                returnItem = map.GetDefinition(MetadataTables.TypeDef, metadataStream.GetEntryFor(MetadataTables.TypeDef, index));
                break;

            case ILMetadataToken.TypeRef:
                returnItem = map.GetDefinition(MetadataTables.TypeRef, metadataStream.GetEntryFor(MetadataTables.TypeRef, index));
                break;

            case ILMetadataToken.TypeSpec:
                returnItem = map.GetDefinition(MetadataTables.TypeSpec, metadataStream.GetEntryFor(MetadataTables.TypeSpec, index));
                break;

            case ILMetadataToken.FieldDef:
                returnItem = map.GetDefinition(MetadataTables.Field, metadataStream.GetEntryFor(MetadataTables.Field, index));
                break;
            }

            return(returnItem);
        }
コード例 #4
0
        public AssemblyDefBuilder(PeCoffFile peCoffFile)
        {
            if (peCoffFile == null)
            {
                throw new ArgumentNullException(nameof(peCoffFile));
            }
            if (!peCoffFile.Directories.ContainsKey(DataDirectories.CommonLanguageRuntimeHeader))
            {
                throw new NotAManagedLibraryException($"The file '{peCoffFile.FileName}' is not a managed library.");
            }

            _peCoffFile = peCoffFile;
            _map        = _peCoffFile.Map;

            _references            = new BuildReferences();
            _references.Map        = _map;
            _references.PeCoffFile = _peCoffFile;
            _references.Metadata   = _peCoffFile.GetMetadataDirectory();
        }
コード例 #5
0
        public AssemblyDef Build()
        {
            if (_assembly != null)
            {
                return(_assembly);                  // we have already built it return previous
            }
            _assembly            = new AssemblyDef(_peCoffFile);
            _references.Assembly = _assembly;
            _map.Assembly        = _assembly;

            // Read the metadata from the file and populate the entries
            _metadata = _peCoffFile.GetMetadataDirectory();
            _stream   = _metadata.Streams[Streams.MetadataStream] as MetadataStream;

            _assembly.StringStream = _metadata.Streams[Streams.StringStream] as IStringStream; // needs to be populated first

            LoadAssemblyMetadata();
            LoadAssemblyRefMetadata();
            LoadModuleMetadata();
            LoadTypeRefMetadata();
            LoadTypeDefMetadata();
            LoadMemberRefMetadata();
            LoadTypeSpecMetadata();
            LoadNestedClassMetadata();
            LoadInterfaceImplMetadata();
            LoadConstantMetadata();
            LoadCustomAttributeMetadata();

            // assign the built assembly locally and clear up the unused references
            _peCoffFile = null;
            _map        = null;
            _metadata   = null;
            _stream     = null;

            return(_assembly);
        }