如何从 TypeSpec 获取 TypeDef

How to get TypeDef from TypeSpec

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

我正在使用的

EnumMethods 枚举了代表 指定类型 方法的 MethodDef 标记。但是我想枚举 class 层次结构中的所有方法。为此,我使用了 GetTypeDefProps,即 returns ptkExtends,它是代表基础 class 的令牌。问题是 base class 可以用 TypeDef、TypeRef 或 TypeSpec 表示。

如何从相关 TypeSpec 中获取基础 class 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?!

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

TypeSpec 可以表示一系列不同类型的类型,但唯一对基础 class 有意义的类型是 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) 中的字节,我的 'back of the napkin' 抓取结果如下:

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.)