/// <summary> /// Creates an <see cref="AssemblyDef"/> instance from a <see cref="MetaDataCreator"/> /// </summary> /// <param name="metaData">The metadata</param> /// <param name="context">Module context or <c>null</c></param> /// <returns>A new <see cref="AssemblyDef"/> instance that now owns <paramref name="metaData"/></returns> /// <exception cref="ArgumentNullException">If <paramref name="metaData"/> is <c>null</c></exception> /// <exception cref="BadImageFormatException">If it's not a .NET assembly (eg. not a .NET file or only a .NET module)</exception> internal static AssemblyDef Load(MD.MetaData metaData, ModuleContext context) { if (metaData == null) { throw new ArgumentNullException("metaData"); } ModuleDef module = null; try { module = ModuleDefMD.Load(metaData, context); var asm = module.Assembly; if (asm == null) { throw new BadImageFormatException(string.Format("{0} is only a .NET module, not a .NET assembly. Use ModuleDef.Load().", module.ToString())); } return(asm); } catch { if (module != null) { module.Dispose(); } throw; } }
/// <summary> /// Constructor /// </summary> /// <param name="writer">Symbol writer</param> /// <param name="pdbState">PDB state</param> /// <param name="metaData">Meta data</param> public PdbWriter(ISymbolWriter2 writer, PdbState pdbState, MetaData metaData) { if (writer == null) throw new ArgumentNullException("writer"); if (pdbState == null) throw new ArgumentNullException("pdbState"); if (metaData == null) throw new ArgumentNullException("metaData"); this.writer = writer; this.pdbState = pdbState; this.metaData = metaData; this.module = metaData.Module; writer.Initialize(metaData); }
/// <summary> /// Constructor /// </summary> /// <param name="metaData">Metadata</param> public MDEmitter(MetaData metaData) { this.metaData = metaData; // We could get these from the metadata tables but it's just easier to get name, // declaring type etc using TypeDef and MethodDef. tokenToTypeDef = new Dictionary<uint, TypeDef>(metaData.TablesHeap.TypeDefTable.Rows); tokenToMethodDef = new Dictionary<uint, MethodDef>(metaData.TablesHeap.MethodTable.Rows); foreach (var type in metaData.Module.GetTypes()) { if (type == null) continue; tokenToTypeDef.Add(new MDToken(MD.Table.TypeDef, metaData.GetRid(type)).Raw, type); foreach (var method in type.Methods) { if (method == null) continue; tokenToMethodDef.Add(new MDToken(MD.Table.Method, metaData.GetRid(method)).Raw, method); } } }
/// <inheritdoc/> void IMetaDataListener.OnMetaDataEvent(MetaData metaData, MetaDataEvent evt) { switch (evt) { case MetaDataEvent.BeginCreateTables: Listener.OnWriterEvent(this, ModuleWriterEvent.MDBeginCreateTables); break; case MetaDataEvent.MemberDefRidsAllocated: Listener.OnWriterEvent(this, ModuleWriterEvent.MDMemberDefRidsAllocated); break; case MetaDataEvent.MemberDefsInitialized: Listener.OnWriterEvent(this, ModuleWriterEvent.MDMemberDefsInitialized); break; case MetaDataEvent.MostTablesSorted: Listener.OnWriterEvent(this, ModuleWriterEvent.MDMostTablesSorted); break; case MetaDataEvent.MemberDefCustomAttributesWritten: Listener.OnWriterEvent(this, ModuleWriterEvent.MDMemberDefCustomAttributesWritten); break; case MetaDataEvent.BeginWriteMethodBodies: Listener.OnWriterEvent(this, ModuleWriterEvent.MDBeginWriteMethodBodies); break; case MetaDataEvent.EndWriteMethodBodies: Listener.OnWriterEvent(this, ModuleWriterEvent.MDEndWriteMethodBodies); break; case MetaDataEvent.BeginAddResources: Listener.OnWriterEvent(this, ModuleWriterEvent.MDBeginAddResources); break; case MetaDataEvent.EndAddResources: Listener.OnWriterEvent(this, ModuleWriterEvent.MDEndAddResources); break; case MetaDataEvent.OnAllTablesSorted: Listener.OnWriterEvent(this, ModuleWriterEvent.MDOnAllTablesSorted); break; case MetaDataEvent.EndCreateTables: Listener.OnWriterEvent(this, ModuleWriterEvent.MDEndCreateTables); break; default: break; } }
/// <summary> /// Creates the .NET metadata chunks (constants, method bodies, .NET resources, /// the metadata, and Win32 resources) /// </summary> /// <param name="module"></param> protected void CreateMetaDataChunks(ModuleDef module) { constants = new UniqueChunkList<ByteArrayChunk>(); methodBodies = new MethodBodyChunks(TheOptions.ShareMethodBodies); netResources = new NetResources(DEFAULT_NETRESOURCES_ALIGNMENT); metaData = MetaData.Create(module, constants, methodBodies, netResources, TheOptions.MetaDataOptions); metaData.Logger = TheOptions.MetaDataLogger ?? this; metaData.Listener = this; // StrongNamePublicKey is used if the user wants to override the assembly's // public key or when enhanced strong naming the assembly. var pk = TheOptions.StrongNamePublicKey; if (pk != null) metaData.AssemblyPublicKey = pk.CreatePublicKey(); else if (TheOptions.StrongNameKey != null) metaData.AssemblyPublicKey = TheOptions.StrongNameKey.PublicKey; var w32Resources = GetWin32Resources(); if (w32Resources != null) win32Resources = new Win32ResourcesChunk(w32Resources); }
/// <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); }
/// <inheritdoc/> protected override void Dispose(bool disposing) { // Call base first since it will dispose of all the resources, which will // eventually use metaData that we will dispose base.Dispose(disposing); if (disposing) { var md = metaData; if (md != null) md.Dispose(); metaData = null; } }
/// <summary> /// Creates a <see cref="ModuleDefMD"/> instance from a <see cref="MetaData"/> /// </summary> /// <param name="metaData">The metadata</param> /// <param name="options">Module creation options or <c>null</c></param> /// <returns>A new <see cref="ModuleDefMD"/> instance that now owns <paramref name="metaData"/></returns> internal static ModuleDefMD Load(MetaData metaData, ModuleCreationOptions options) { return new ModuleDefMD(metaData, options); }
/// <inheritdoc/> void IMetaDataListener.OnMetaDataEvent(MetaData metaData, MetaDataEvent evt) { switch (evt) { case MetaDataEvent.BeginCreateTables: Listener.OnWriterEvent(this, ModuleWriterEvent.MDBeginCreateTables); break; case MetaDataEvent.AllocateTypeDefRids: Listener.OnWriterEvent(this, ModuleWriterEvent.MDAllocateTypeDefRids); break; case MetaDataEvent.AllocateMemberDefRids: Listener.OnWriterEvent(this, ModuleWriterEvent.MDAllocateMemberDefRids); break; case MetaDataEvent.AllocateMemberDefRids0: Listener.OnWriterEvent(this, ModuleWriterEvent.MDAllocateMemberDefRids0); break; case MetaDataEvent.AllocateMemberDefRids1: Listener.OnWriterEvent(this, ModuleWriterEvent.MDAllocateMemberDefRids1); break; case MetaDataEvent.AllocateMemberDefRids2: Listener.OnWriterEvent(this, ModuleWriterEvent.MDAllocateMemberDefRids2); break; case MetaDataEvent.AllocateMemberDefRids3: Listener.OnWriterEvent(this, ModuleWriterEvent.MDAllocateMemberDefRids3); break; case MetaDataEvent.AllocateMemberDefRids4: Listener.OnWriterEvent(this, ModuleWriterEvent.MDAllocateMemberDefRids4); break; case MetaDataEvent.MemberDefRidsAllocated: Listener.OnWriterEvent(this, ModuleWriterEvent.MDMemberDefRidsAllocated); break; case MetaDataEvent.InitializeTypeDefsAndMemberDefs0: Listener.OnWriterEvent(this, ModuleWriterEvent.MDInitializeTypeDefsAndMemberDefs0); break; case MetaDataEvent.InitializeTypeDefsAndMemberDefs1: Listener.OnWriterEvent(this, ModuleWriterEvent.MDInitializeTypeDefsAndMemberDefs1); break; case MetaDataEvent.InitializeTypeDefsAndMemberDefs2: Listener.OnWriterEvent(this, ModuleWriterEvent.MDInitializeTypeDefsAndMemberDefs2); break; case MetaDataEvent.InitializeTypeDefsAndMemberDefs3: Listener.OnWriterEvent(this, ModuleWriterEvent.MDInitializeTypeDefsAndMemberDefs3); break; case MetaDataEvent.InitializeTypeDefsAndMemberDefs4: Listener.OnWriterEvent(this, ModuleWriterEvent.MDInitializeTypeDefsAndMemberDefs4); break; case MetaDataEvent.MemberDefsInitialized: Listener.OnWriterEvent(this, ModuleWriterEvent.MDMemberDefsInitialized); break; case MetaDataEvent.BeforeSortTables: Listener.OnWriterEvent(this, ModuleWriterEvent.MDBeforeSortTables); break; case MetaDataEvent.MostTablesSorted: Listener.OnWriterEvent(this, ModuleWriterEvent.MDMostTablesSorted); break; case MetaDataEvent.WriteTypeDefAndMemberDefCustomAttributes0: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteTypeDefAndMemberDefCustomAttributes0); break; case MetaDataEvent.WriteTypeDefAndMemberDefCustomAttributes1: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteTypeDefAndMemberDefCustomAttributes1); break; case MetaDataEvent.WriteTypeDefAndMemberDefCustomAttributes2: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteTypeDefAndMemberDefCustomAttributes2); break; case MetaDataEvent.WriteTypeDefAndMemberDefCustomAttributes3: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteTypeDefAndMemberDefCustomAttributes3); break; case MetaDataEvent.WriteTypeDefAndMemberDefCustomAttributes4: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteTypeDefAndMemberDefCustomAttributes4); break; case MetaDataEvent.MemberDefCustomAttributesWritten: Listener.OnWriterEvent(this, ModuleWriterEvent.MDMemberDefCustomAttributesWritten); break; case MetaDataEvent.BeginAddResources: Listener.OnWriterEvent(this, ModuleWriterEvent.MDBeginAddResources); break; case MetaDataEvent.EndAddResources: Listener.OnWriterEvent(this, ModuleWriterEvent.MDEndAddResources); break; case MetaDataEvent.BeginWriteMethodBodies: Listener.OnWriterEvent(this, ModuleWriterEvent.MDBeginWriteMethodBodies); break; case MetaDataEvent.WriteMethodBodies0: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies0); break; case MetaDataEvent.WriteMethodBodies1: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies1); break; case MetaDataEvent.WriteMethodBodies2: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies2); break; case MetaDataEvent.WriteMethodBodies3: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies3); break; case MetaDataEvent.WriteMethodBodies4: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies4); break; case MetaDataEvent.WriteMethodBodies5: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies5); break; case MetaDataEvent.WriteMethodBodies6: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies6); break; case MetaDataEvent.WriteMethodBodies7: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies7); break; case MetaDataEvent.WriteMethodBodies8: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies8); break; case MetaDataEvent.WriteMethodBodies9: Listener.OnWriterEvent(this, ModuleWriterEvent.MDWriteMethodBodies9); break; case MetaDataEvent.EndWriteMethodBodies: Listener.OnWriterEvent(this, ModuleWriterEvent.MDEndWriteMethodBodies); break; case MetaDataEvent.OnAllTablesSorted: Listener.OnWriterEvent(this, ModuleWriterEvent.MDOnAllTablesSorted); break; case MetaDataEvent.EndCreateTables: Listener.OnWriterEvent(this, ModuleWriterEvent.MDEndCreateTables); break; default: break; } }
/// <summary> /// Creates an <see cref="AssemblyDef"/> instance from a <see cref="MetaDataCreator"/> /// </summary> /// <param name="metaData">The metadata</param> /// <returns>A new <see cref="AssemblyDef"/> instance that now owns <paramref name="metaData"/></returns> /// <exception cref="ArgumentNullException">If <paramref name="metaData"/> is <c>null</c></exception> /// <exception cref="BadImageFormatException">If it's not a .NET assembly (eg. not a .NET file or only a .NET module)</exception> internal static AssemblyDef Load(MD.MetaData metaData) { return(Load(metaData, null)); }