如何从TypeSpec获取TypeDef

时间:2016-07-27 13:58:50

标签: c# .net metadata clr cil

我正在尝试实现管理调试器,查看MDBG示例。 目前,我一直试图使用IMetaDataImport获取基类层次结构方法。

我正在使用的

EnumMethods枚举表示指定类型方法的MethodDef标记。但我想枚举类层次结构中的所有方法。为此,我使用GetTypeDefProps,返回ptkExtends,它是表示基类的标记。问题是基类可以用TypeDef,TypeRef或TypeSpec表示。

如何从相对TypeSpec获取基类TypeDef?

我已经阅读了ECMA第二部分规范,但它对我帮助不大......

这是我到目前为止所得到的:

      int size;                    
      TypeAttributes pdwTypeDefFlags;
      m_importer.GetTypeDefProps(m_typeToken,
                    null,
                    0,
                    out size,
                    out pdwTypeDefFlags,
                    out ptkExtends
                    );

      //ptkExtends is correct TypeSpec token
      IntPtr ppvSig;
      uint pcbSig;
      m_importer.GetTypeSpecFromToken(ptkExtends, out ppvSig, out pcbSig);
      //I'm getting the TypeSpec Blob signature in ppvSig, how to use it to get TypeDef?!

1 个答案:

答案 0 :(得分:3)

如前所述,TypeSpec格式在Partition II Section 23.2.14中定义,其表达方式类似于EBNF,其终端在第23.1.16节中定义。

TypeSpec可以表示一系列不同类型的类型,但唯一对基类有意义的类型是GENERICINST(封闭的泛型类型)。

TypeSpecBlob ::= GENERICINST (CLASS | VALUETYPE) TypeDefOrRefEncoded GenArgCount Type Type*
             | ...

TypeDefOrRefEncoded在第23.2.8节中定义,压缩整数在第23.2节开头定义,Type在第23.2.12节中定义。

Type ::= CLASS TypeDefOrRefEncoded
     | VALUETYPE TypeDefOrRefEncoded
     | ...

考虑到前一个示例中的字节数(15 12 3C 01 12 36),我的餐巾背面是'抓挠了以下内容:

15 // GENERICINST
12 //   CLASS
3C //     TypeDefOrRefEncoded = 0200000F (The TypeDef of the open generic type.)
01 //   GenArgCount = 1
12 //   CLASS
36 //     TypeDefOrRefEncoded = 0100000D (The TypeRef of the single type argument.)