public void Read(SignatureReader rdr) { m = rdr.ReadElementType(); if (m != ElementType.Modifier_Optional && m != ElementType.Modifier_Required) { throw new InvalidOperationException(); } TablesHeap h = rdr.BaseStream.Root[MetadataStreamType.Tables].Heap as TablesHeap; t = new TableToken(h); int len = Math.Max(h[TableType.TypeDef].Rows.Count, Math.Max(h[TableType.TypeRef].Rows.Count, h[TableType.TypeSpec].Rows.Count)); uint tkn; if (len > ushort.MaxValue) { tkn = rdr.ReadUInt32(); } else { tkn = rdr.ReadUInt16(); } switch (tkn & 0x3) { case 0: t.Token = new MetadataToken(MetadataTokenType.TypeDef, (uint)tkn >> 2); break; case 1: t.Token = new MetadataToken(MetadataTokenType.TypeRef, (uint)tkn >> 2); break; case 2: t.Token = new MetadataToken(MetadataTokenType.TypeSpec, (uint)tkn >> 2); break; } }
} //optional beginning, including public void Read(SignatureReader rdr, int c) { sen = -1; for (int i = 0; i < c; i++) { if ((byte)rdr.GetElementTypeAhead() == 0x41) { sen = i; rdr.ReadElementType(); } ParamElement p = new ParamElement(); p.Read(rdr); Items.Add(p); } }