// See the comments in Equals - we're doing string comparisons here // to compare full type names. public static bool Equals(MiniAssembly assemblyA, PEFileReader peFileB, MetadataToken assemblyRefB) { System.Diagnostics.Contracts.Contract.Requires(assemblyA != null); System.Diagnostics.Contracts.Contract.Requires(peFileB != null); System.Diagnostics.Contracts.Contract.Requires(assemblyRefB.Table == MDTables.Tables.AssemblyRef); String nameA, nameRefB; if (assemblyA.IsReflectionAssembly) nameA = AppDomain.CurrentDomain.ApplyPolicy(assemblyA._reflectionAssembly.FullName); else { AssemblyInfo assemblyInfoA = new AssemblyInfo(); assemblyA._peFile.GetAssemblyInfo(ref assemblyInfoA); nameA = AppDomain.CurrentDomain.ApplyPolicy(assemblyInfoA.ToString()); } AssemblyInfo assemblyInfoB = ReadAssemblyRef(peFileB, assemblyRefB); nameRefB = AppDomain.CurrentDomain.ApplyPolicy(assemblyInfoB.ToString()); return Utils.AssemblyRefEqualsDef(nameRefB, nameA); }
public bool GetAssemblyInfo(ref AssemblyInfo result) { InitMetaData(); // Bunches of test code below here; may be out of date! /* UInt32 Flags; String Name; MDTables.MetadataToken Parent; MetaData.SeekToRowOfTable(MDTables.Tables.XModule, 0); UInt16 Generation = B.ReadUInt16(); Name = MetaData.ReadString(); UInt32 MvidIndex = MetaData.ReadGUIDIndex(); UInt32 EncIdIndex = MetaData.ReadGUIDIndex(); UInt32 EncBaseIdIndex = MetaData.ReadGUIDIndex(); MetaData.DumpStringHeap(Console.Out); for (UInt32 i = 0; i < MetaData.RowsInTable(MDTables.Tables.TypeRef); i++) { MetaData.SeekToRowOfTable(MDTables.Tables.TypeRef, i); MDTables.MetadataToken Scope = MetaData.ReadMetadataToken(MDTables.Encodings.ResolutionScope); Name = MetaData.ReadString(); String NameSpace = MetaData.ReadString(); Console.WriteLine("Type ref {0} to {1}, {2} in scope {3}", i, NameSpace, Name, Scope); } UInt32 NRows = MetaData.RowsInTable(MDTables.Tables.MethodDef); for (UInt32 i = 0; i < NRows; i++) { MetaData.SeekToRowOfTable(MDTables.Tables.MethodDef, i); UInt32 RVA = B.ReadUInt32(); UInt16 ImplFlags = B.ReadUInt16(); Flags = B.ReadUInt16(); Name = MetaData.ReadString(); UInt32 SigIndex = MetaData.ReadBlobIndex(); UInt32 ParamIndex = MetaData.ReadRowIndex(MDTables.Tables.ParamDef); Console.WriteLine("Method {0}: {1}", i, Name); } for (UInt32 i = 0; i < MetaData.RowsInTable(MDTables.Tables.ParamDef); i++) { MetaData.SeekToRowOfTable(MDTables.Tables.ParamDef, i); Flags = B.ReadUInt16(); UInt16 Sequence = B.ReadUInt16(); Name = MetaData.ReadString(); Console.WriteLine("Param {0} named {1}", i, Name); } MetaData.SeekToRowOfTable(MDTables.Tables.InterfaceImpl, 0U); UInt32 Class = MetaData.ReadRowIndex(MDTables.Tables.TypeDef); MDTables.MetadataToken Iface = MetaData.ReadMetadataToken(MDTables.Encodings.TypeDefOrRef); MetaData.SeekToRowOfTable(MDTables.Tables.MemberRef, 3); MDTables.MetadataToken MemberRefClass = MetaData.ReadMetadataToken(MDTables.Encodings.MemberRefParent); Name = MetaData.ReadString(); UInt32 Signature = MetaData.ReadBlobIndex(); MetaData.SeekToRowOfTable(MDTables.Tables.FieldMarshal, 0x10U); Parent = MetaData.ReadMetadataToken(MDTables.Encodings.HasFieldMarshall); UInt32 NativeType = MetaData.ReadBlobIndex(); MetaData.SeekToRowOfTable(MDTables.Tables.FieldMarshal, 3U); Parent = MetaData.ReadMetadataToken(MDTables.Encodings.HasFieldMarshall); NativeType = MetaData.ReadBlobIndex(); MetaData.SeekToRowOfTable(MDTables.Tables.XEvent, 0U); Flags = B.ReadUInt16(); Name = MetaData.ReadString(); MDTables.MetadataToken EventType = MetaData.ReadMetadataToken(MDTables.Encodings.TypeDefOrRef); */ MetaData.SeekToRowOfTable(MDTables.Tables.XAssembly, 0U); UInt32 HashAlgorithm = B.ReadUInt32(); UInt16 Major = B.ReadUInt16(); UInt16 Minor = B.ReadUInt16(); UInt16 Build = B.ReadUInt16(); UInt16 Revision = B.ReadUInt16(); Version V = new Version(Major, Minor, Build, Revision); UInt32 AssemblyFlags = B.ReadUInt32(); byte[] PublicKey = MetaData.ReadBlob(); String SimpleName = MetaData.ReadString(); String Culture = MetaData.ReadString(); if ((Culture != null) && (Culture.Length == 0)) Culture = null; result = new AssemblyInfo(V, AssemblyFlags, PublicKey, SimpleName, Culture); return true; }