public Row(TableCell[] cells, Table table) { _cells = cells; _table = table; }
public Enumerator(Table table) { _table = table; Reset(); }
/// <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); }