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

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

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

我已经阅读了ECMA第II部分规范,但是对我没有太大帮助。

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

      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可以表示一系列不同类型的类型,但是对基类有意义的唯一类型是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.)

关于c# - 如何从TypeSpec获取TypeDef,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38615100/

10-11 23:05