コード例 #1
0
ファイル: TableStream.cs プロジェクト: Kinect123/ex360e
 public Row(TableCell[] cells, Table table)
 {
     _cells = cells;
     _table = table;
 }
コード例 #2
0
ファイル: TableStream.cs プロジェクト: Kinect123/ex360e
 public Enumerator(Table table)
 {
     _table = table;
     Reset();
 }
コード例 #3
0
ファイル: TableStream.cs プロジェクト: Kinect123/ex360e
        /// <summary>
        /// .NET expects the consumer of the metadata to know the schema of the metadata database.
        /// that schema is represented here as an array of 'table' objs which will be filled with actual
        /// rows elsewhere.
        /// </summary>
        /// <param name="reader"></param>
        private void SetupSchema(BinaryReader reader)
        {
            //number of bits in coded token tag for a coded token that refers to n tables.
            //values 5-17 are not used :I
            _codedTokenBits = new[] {0, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5};

            //Hash telling us what tables a given coded token type can refer to
            _ctok = new Hashtable();
            _ctok[Types.TypeDefOrRef] = new[] {Types.TypeDef, Types.TypeRef, Types.TypeSpec};
            _ctok[Types.HasConstant] = new[] {Types.Field, Types.Param, Types.Property};
            _ctok[Types.CustomAttributeType] = new[] {Types.TypeRef, Types.TypeDef, Types.Method, Types.MemberRef, Types.UserString};
            _ctok[Types.HasSemantic] = new[] {Types.Event, Types.Property};
            _ctok[Types.ResolutionScope] = new[] {Types.Module, Types.ModuleRef, Types.AssemblyRef, Types.TypeRef};
            _ctok[Types.HasFieldMarshal] = new[] {Types.Field, Types.Param};
            _ctok[Types.HasDeclSecurity] = new[] {Types.TypeDef, Types.Method, Types.Assembly};
            _ctok[Types.MemberRefParent] = new[] {Types.TypeDef, Types.TypeRef, Types.ModuleRef, Types.Method, Types.TypeSpec};
            _ctok[Types.MethodDefOrRef] = new[] {Types.Method, Types.MemberRef};
            _ctok[Types.MemberForwarded] = new[] {Types.Field, Types.Method};
            _ctok[Types.Implementation] = new[] {Types.File, Types.AssemblyRef, Types.ExportedType};
            _ctok[Types.HasCustomAttribute] = new[]
                                              {
                                                  Types.Method, Types.Field, Types.TypeRef, Types.TypeDef, Types.Param, Types.InterfaceImpl,
                                                  Types.MemberRef, Types.Module, Types.Permission, Types.Property, Types.Event, Types.StandAloneSig,
                                                  Types.ModuleRef, Types.TypeSpec, Types.Assembly, Types.AssemblyRef, Types.File, Types.ExportedType,
                                                  Types.ManifestResource
                                              };

            //md db schema is represented in the arguments to table constructors...
            _td = new Table[0x2C];
            _td[0x00] = new Table(Types.Module, new[] {Types.UInt16, Types.String, Types.Guid, Types.Guid, Types.Guid},
                                  new[] {"Generation", "Name", "Mvid", "EncId", "EncBaseId"}, this, reader);
            _td[0x01] = new Table(Types.TypeRef, new[] {Types.ResolutionScope, Types.String, Types.String},
                                  new[] {"ResolutionScope", "Name", "Namespace"}, this, reader);
            _td[0x02] = new Table(Types.TypeDef, new[] {Types.UInt32, Types.String, Types.String, Types.TypeDefOrRef, Types.Field, Types.Method},
                                  new[] {"Flags", "Name", "Namespace", "Extends", "FieldList", "MethodList"}, this, reader);
            _td[0x03] = new Table(Types.FieldPtr, new[] {Types.Field}, new[] {"Field"}, this, reader);
            _td[0x04] = new Table(Types.Field, new[] {Types.UInt16, Types.String, Types.Blob}, new[] {"Flags", "Name", "Signature"}, this, reader);
            _td[0x05] = new Table(Types.MethodPtr, new[] {Types.Method}, new[] {"Method"}, this, reader);
            _td[0x06] = new Table(Types.Method, new[] {Types.UInt32, Types.UInt16, Types.UInt16, Types.String, Types.Blob, Types.Param},
                                  new[] {"RVA", "ImplFlags", "Flags", "Name", "Signature", "ParamList"}, this, reader);
            _td[0x07] = new Table(Types.ParamPtr, new[] {Types.Param}, new[] {"Param"}, this, reader);
            _td[0x08] = new Table(Types.Param, new[] {Types.UInt16, Types.UInt16, Types.String}, new[] {"Flags", "Sequence", "Name"}, this, reader);
            _td[0x09] = new Table(Types.InterfaceImpl, new[] {Types.TypeDef, Types.TypeDefOrRef}, new[] {"Class", "Interface"}, this, reader);
            _td[0x0A] = new Table(Types.MemberRef, new[] {Types.MemberRefParent, Types.String, Types.Blob}, new[] {"Class", "Name", "Signature"}, this,
                                  reader);
            _td[0x0B] = new Table(Types.Constant, new[] {Types.UInt16, Types.HasConstant, Types.Blob}, new[] {"Type", "Parent", "Value"}, this, reader);
            _td[0x0C] = new Table(Types.CustomAttribute, new[] {Types.HasCustomAttribute, Types.CustomAttributeType, Types.Blob},
                                  new[] {"Type", "Parent", "Value"}, this, reader);
            _td[0x0D] = new Table(Types.FieldMarshal, new[] {Types.HasFieldMarshal, Types.Blob}, new[] {"Parent", "Native"}, this, reader);
            _td[0x0E] = new Table(Types.Permission, new[] {Types.UInt16, Types.HasDeclSecurity, Types.Blob},
                                  new[] {"Action", "Parent", "PermissionSet"}, this, reader);
            _td[0x0F] = new Table(Types.ClassLayout, new[] {Types.UInt16, Types.UInt32, Types.TypeDef}, new[] {"PackingSize", "ClassSize", "Parent"},
                                  this, reader);
            _td[0x10] = new Table(Types.FieldLayout, new[] {Types.UInt32, Types.Field}, new[] {"Offset", "Field"}, this, reader);
            _td[0x11] = new Table(Types.StandAloneSig, new[] {Types.Blob}, new[] {"Signature"}, this, reader);
            _td[0x12] = new Table(Types.EventMap, new[] {Types.TypeDef, Types.Event}, new[] {"Parent", "EventList"}, this, reader);
            _td[0x13] = new Table(Types.EventPtr, new[] {Types.Event}, new[] {"Event"}, this, reader);
            _td[0x14] = new Table(Types.Event, new[] {Types.UInt16, Types.String, Types.TypeDefOrRef}, new[] {"EventFlags", "Name", "EventType"}, this,
                                  reader);
            _td[0x15] = new Table(Types.PropertyMap, new[] {Types.TypeDef, Types.Property}, new[] {"Parent", "PropertyList"}, this, reader);
            _td[0x16] = new Table(Types.PropertyPtr, new[] {Types.Property}, new[] {"Property"}, this, reader);
            _td[0x17] = new Table(Types.Property, new[] {Types.UInt16, Types.String, Types.Blob}, new[] {"PropFlags", "Name", "Type"}, this, reader);
            _td[0x18] = new Table(Types.MethodSemantics, new[] {Types.UInt16, Types.Method, Types.HasSemantic},
                                  new[] {"Semantic", "Method", "Association"}, this, reader);
            _td[0x19] = new Table(Types.MethodImpl, new[] {Types.TypeDef, Types.MethodDefOrRef, Types.MethodDefOrRef},
                                  new[] {"Class", "MethodBody", "MethodDeclaration"}, this, reader);
            _td[0x1A] = new Table(Types.ModuleRef, new[] {Types.String}, new[] {"Name"}, this, reader);
            _td[0x1B] = new Table(Types.TypeSpec, new[] {Types.Blob}, new[] {"Signature"}, this, reader);
            _td[0x1C] = new Table(Types.ImplMap, new[] {Types.UInt16, Types.MemberForwarded, Types.String, Types.ModuleRef},
                                  new[] {"MappingFlags", "MemberForwarded", "ImportName", "ImportScope"}, this, reader);
            _td[0x1D] = new Table(Types.FieldRVA, new[] {Types.UInt32, Types.Field}, new[] {"RVA", "Field"}, this, reader);
            _td[0x1E] = new Table(Types.ENCLog, new[] {Types.UInt32, Types.UInt32}, new[] {"Token", "FuncCode"}, this, reader);
            _td[0x1F] = new Table(Types.ENCMap, new[] {Types.UInt32}, new[] {"Token"}, this, reader);
            _td[0x20] = new Table(Types.Assembly,
                                  new[]
                                  {
                                      Types.UInt32, Types.UInt16, Types.UInt16, Types.UInt16, Types.UInt16, Types.UInt32, Types.Blob, Types.String,
                                      Types.String
                                  },
                                  new[]
                                  {
                                      "HashAlgId", "MajorVersion", "MinorVersion", "BuildNumber", "RevisionNumber", "Flags", "PublicKey", "Name",
                                      "Locale"
                                  }, this, reader);
            _td[0x21] = new Table(Types.AssemblyProcessor, new[] {Types.UInt32}, new[] {"Processor"}, this, reader);
            _td[0x22] = new Table(Types.AssemblyOS, new[] {Types.UInt32, Types.UInt32, Types.UInt32},
                                  new[] {"OSPlatformId", "OSMajorVersion", "OSMinorVersion"}, this, reader);
            _td[0x23] = new Table(Types.AssemblyRef,
                                  new[]
                                  {
                                      Types.UInt16, Types.UInt16, Types.UInt16, Types.UInt16, Types.UInt32, Types.Blob, Types.String, Types.String,
                                      Types.Blob
                                  },
                                  new[]
                                  {
                                      "MajorVersion", "MinorVersion", "BuildNumber", "RevisionNumber", "Flags", "PublicKeyOrToken", "Name", "Locale",
                                      "HashValue"
                                  }, this, reader);
            _td[0x24] = new Table(Types.AssemblyRefProcessor, new[] {Types.UInt32, Types.AssemblyRef}, new[] {"Processor", "AssemblyRef"}, this,
                                  reader);
            _td[0x25] = new Table(Types.AssemblyRefOS, new[] {Types.UInt32, Types.UInt32, Types.UInt32, Types.AssemblyRef},
                                  new[] {"OSPlatformId", "OSMajorVersion", "OSMinorVersion", "AssemblyRef"}, this, reader);
            _td[0x26] = new Table(Types.File, new[] {Types.UInt32, Types.String, Types.Blob}, new[] {"Flags", "Name", "HashValue"}, this, reader);
            _td[0x27] = new Table(Types.ExportedType, new[] {Types.UInt32, Types.UInt32, Types.String, Types.String, Types.Implementation},
                                  new[] {"Flags", "TypeDefId", "TypeName", "TypeNamespace", "TypeImplementation"}, this, reader);
            _td[0x28] = new Table(Types.ManifestResource, new[] {Types.UInt32, Types.UInt32, Types.String, Types.Implementation},
                                  new[] {"Offset", "Flags", "Name", "Implementation"}, this, reader);
            _td[0x29] = new Table(Types.NestedClass, new[] {Types.TypeDef, Types.TypeDef}, new[] {"NestedClass", "EnclosingClass"}, this, reader);
            //unused TyPar tables taken from Roeder's reflector... are these documented anywhere?  Since they are always empty, does it matter
            _td[0x2A] = new Table(Types.TypeTyPar, new[] {Types.UInt16, Types.TypeDef, Types.TypeDefOrRef, Types.String},
                                  new[] {"Number", "Class", "Bound", "Name"}, this, reader);
            _td[0x2B] = new Table(Types.MethodTyPar, new[] {Types.UInt16, Types.Method, Types.TypeDefOrRef, Types.String},
                                  new[] {"Number", "Method", "Bound", "Name"}, this, reader);
        }