Example #1
0
        // 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;
        }