void Initialize() { var ts = dnFile.MetaData.TablesStream; // FindCorLibAssemblyRef() needs this list initialized. Other code may need corLibTypes // so initialize these two first. listAssemblyRefMD = new SimpleLazyList<AssemblyRefMD>(ts.AssemblyRefTable.Rows, rid2 => new AssemblyRefMD(this, rid2)); corLibTypes = new CorLibTypes(this, FindCorLibAssemblyRef()); listModuleDefMD = new SimpleLazyList<ModuleDefMD2>(ts.ModuleTable.Rows, rid2 => rid2 == 1 ? this : new ModuleDefMD2(this, rid2)); listTypeRefMD = new SimpleLazyList<TypeRefMD>(ts.TypeRefTable.Rows, rid2 => new TypeRefMD(this, rid2)); listTypeDefMD = new SimpleLazyList<TypeDefMD>(ts.TypeDefTable.Rows, rid2 => new TypeDefMD(this, rid2)); listFieldDefMD = new SimpleLazyList<FieldDefMD>(ts.FieldTable.Rows, rid2 => new FieldDefMD(this, rid2)); listMethodDefMD = new SimpleLazyList<MethodDefMD>(ts.MethodTable.Rows, rid2 => new MethodDefMD(this, rid2)); listParamDefMD = new SimpleLazyList<ParamDefMD>(ts.ParamTable.Rows, rid2 => new ParamDefMD(this, rid2)); listInterfaceImplMD = new SimpleLazyList<InterfaceImplMD>(ts.InterfaceImplTable.Rows, rid2 => new InterfaceImplMD(this, rid2)); listMemberRefMD = new SimpleLazyList<MemberRefMD>(ts.MemberRefTable.Rows, rid2 => new MemberRefMD(this, rid2)); listConstantMD = new SimpleLazyList<ConstantMD>(ts.ConstantTable.Rows, rid2 => new ConstantMD(this, rid2)); listFieldMarshalMD = new SimpleLazyList<FieldMarshalMD>(ts.FieldMarshalTable.Rows, rid2 => new FieldMarshalMD(this, rid2)); listDeclSecurityMD = new SimpleLazyList<DeclSecurityMD>(ts.DeclSecurityTable.Rows, rid2 => new DeclSecurityMD(this, rid2)); listClassLayoutMD = new SimpleLazyList<ClassLayoutMD>(ts.ClassLayoutTable.Rows, rid2 => new ClassLayoutMD(this, rid2)); listStandAloneSigMD = new SimpleLazyList<StandAloneSigMD>(ts.StandAloneSigTable.Rows, rid2 => new StandAloneSigMD(this, rid2)); listEventDefMD = new SimpleLazyList<EventDefMD>(ts.EventTable.Rows, rid2 => new EventDefMD(this, rid2)); listPropertyDefMD = new SimpleLazyList<PropertyDefMD>(ts.PropertyTable.Rows, rid2 => new PropertyDefMD(this, rid2)); listModuleRefMD = new SimpleLazyList<ModuleRefMD>(ts.ModuleRefTable.Rows, rid2 => new ModuleRefMD(this, rid2)); listTypeSpecMD = new SimpleLazyList<TypeSpecMD>(ts.TypeSpecTable.Rows, rid2 => new TypeSpecMD(this, rid2)); listImplMapMD = new SimpleLazyList<ImplMapMD>(ts.ImplMapTable.Rows, rid2 => new ImplMapMD(this, rid2)); listAssemblyDefMD = new SimpleLazyList<AssemblyDefMD>(ts.AssemblyTable.Rows, rid2 => new AssemblyDefMD(this, rid2)); listFileDefMD = new SimpleLazyList<FileDefMD>(ts.FileTable.Rows, rid2 => new FileDefMD(this, rid2)); listExportedTypeMD = new SimpleLazyList<ExportedTypeMD>(ts.ExportedTypeTable.Rows, rid2 => new ExportedTypeMD(this, rid2)); listManifestResourceMD = new SimpleLazyList<ManifestResourceMD>(ts.ManifestResourceTable.Rows, rid2 => new ManifestResourceMD(this, rid2)); listGenericParamMD = new SimpleLazyList<GenericParamMD>(ts.GenericParamTable.Rows, rid2 => new GenericParamMD(this, rid2)); listMethodSpecMD = new SimpleLazyList<MethodSpecMD>(ts.MethodSpecTable.Rows, rid2 => new MethodSpecMD(this, rid2)); listGenericParamConstraintMD = new SimpleLazyList<GenericParamConstraintMD>(ts.GenericParamConstraintTable.Rows, rid2 => new GenericParamConstraintMD(this, rid2)); location.ReadOriginalValue = () => { return dnFile.MetaData.PEImage.FileName ?? string.Empty; }; win32Resources.ReadOriginalValue = () => { return dnFile.MetaData.PEImage.Win32Resources; }; vtableFixups.ReadOriginalValue = () => { var vtableFixupsInfo = dnFile.MetaData.ImageCor20Header.VTableFixups; if (vtableFixupsInfo.VirtualAddress == 0 || vtableFixupsInfo.Size == 0) return null; return new VTableFixups(this); }; #if THREAD_SAFE location.Lock = theLock; win32Resources.Lock = theLock; vtableFixups.Lock = theLock; #endif for (int i = 0; i < 64; i++) { var tbl = TablesStream.Get((Table)i); lastUsedRids[i] = tbl == null ? 0 : (int)tbl.Rows; } }
/// <summary> /// Constructor /// </summary> /// <param name="metaData">The metadata</param> /// <param name="options">Module creation options or <c>null</c></param> /// <exception cref="ArgumentNullException">If <paramref name="metaData"/> is <c>null</c></exception> ModuleDefMD(MetaData metaData, ModuleCreationOptions options) : base(null, 1) { #if DEBUG if (metaData == null) throw new ArgumentNullException("metaData"); #endif if (options == null) options = ModuleCreationOptions.Default; this.metaData = metaData; this.context = options.Context; Initialize(); InitializeFromRawRow(); location = metaData.PEImage.FileName ?? string.Empty; this.Kind = GetKind(); this.Characteristics = MetaData.PEImage.ImageNTHeaders.FileHeader.Characteristics; this.DllCharacteristics = MetaData.PEImage.ImageNTHeaders.OptionalHeader.DllCharacteristics; this.RuntimeVersion = MetaData.VersionString; this.Machine = MetaData.PEImage.ImageNTHeaders.FileHeader.Machine; this.Cor20HeaderFlags = MetaData.ImageCor20Header.Flags; this.Cor20HeaderRuntimeVersion = (uint)(MetaData.ImageCor20Header.MajorRuntimeVersion << 16) | MetaData.ImageCor20Header.MinorRuntimeVersion; this.TablesHeaderVersion = MetaData.TablesStream.Version; corLibTypes = new CorLibTypes(this, options.CorLibAssemblyRef ?? FindCorLibAssemblyRef() ?? CreateDefaultCorLibAssemblyRef()); InitializePdb(options); }
static DebugSignatureReader() { noOwnerModule = new ModuleDefUser(); corLibTypes = new CorLibTypes(noOwnerModule); }