public MetadataResolverTest() { _fwResolver = new DefaultMetadataResolver(new NetFrameworkAssemblyResolver() { SearchDirectories = { Path.GetDirectoryName(typeof(MetadataResolverTest).Assembly.Location) } }); _coreResolver = new DefaultMetadataResolver(new NetCoreAssemblyResolver() { SearchDirectories = { Path.GetDirectoryName(typeof(MetadataResolverTest).Assembly.Location) } }); _comparer = new SignatureComparer(); }
/// <summary> /// Interprets a PE image as a .NET module. /// </summary> /// <param name="peImage">The image to interpret as a .NET module.</param> /// <param name="readerParameters">The parameters to use while reading the module.</param> public SerializedModuleDefinition(IPEImage peImage, ModuleReaderParameters readerParameters) : base(new MetadataToken(TableIndex.Module, 1)) { if (peImage is null) { throw new ArgumentNullException(nameof(peImage)); } if (readerParameters is null) { throw new ArgumentNullException(nameof(readerParameters)); } var metadata = peImage.DotNetDirectory?.Metadata; if (metadata is null) { throw new BadImageFormatException("Input PE image does not contain a .NET metadata directory."); } var tablesStream = metadata.GetStream <TablesStream>(); if (tablesStream is null) { throw new BadImageFormatException(".NET metadata directory does not define a tables stream."); } var moduleTable = tablesStream.GetTable <ModuleDefinitionRow>(TableIndex.Module); if (!moduleTable.TryGetByRid(1, out _row)) { throw new BadImageFormatException("Module definition table does not contain any rows."); } // Store parameters in fields. ReaderContext = new ModuleReaderContext(peImage, this, readerParameters); // Copy over PE header fields. FilePath = peImage.FilePath; MachineType = peImage.MachineType; FileCharacteristics = peImage.Characteristics; PEKind = peImage.PEKind; SubSystem = peImage.SubSystem; DllCharacteristics = peImage.DllCharacteristics; TimeDateStamp = peImage.TimeDateStamp; // Copy over "simple" columns. Generation = _row.Generation; Attributes = peImage.DotNetDirectory.Flags; // Initialize member factory. _memberFactory = new CachedSerializedMemberFactory(ReaderContext); // Find assembly definition and corlib assembly. Assembly = FindParentAssembly(); CorLibTypeFactory = CreateCorLibTypeFactory(); OriginalTargetRuntime = DetectTargetRuntime(); MetadataResolver = new DefaultMetadataResolver(CreateAssemblyResolver( readerParameters.PEReaderParameters.FileService)); // Prepare lazy RID lists. _fieldLists = new LazyRidListRelation <TypeDefinitionRow>(metadata, TableIndex.TypeDef, (rid, _) => rid, tablesStream.GetFieldRange); _methodLists = new LazyRidListRelation <TypeDefinitionRow>(metadata, TableIndex.TypeDef, (rid, _) => rid, tablesStream.GetMethodRange); _paramLists = new LazyRidListRelation <MethodDefinitionRow>(metadata, TableIndex.Method, (rid, _) => rid, tablesStream.GetParameterRange); _propertyLists = new LazyRidListRelation <PropertyMapRow>(metadata, TableIndex.PropertyMap, (_, map) => map.Parent, tablesStream.GetPropertyRange); _eventLists = new LazyRidListRelation <EventMapRow>(metadata, TableIndex.EventMap, (_, map) => map.Parent, tablesStream.GetEventRange); }