首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从TypeDef中获取TypeSpec

如何从TypeDef中获取TypeSpec
EN

Stack Overflow用户
提问于 2016-07-27 13:58:50
回答 1查看 402关注 0票数 2

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

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

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

我读过ECMA第二部分的说明书,但对我没有多大帮助.

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

代码语言:javascript
复制
      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?!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-27 14:41:41

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

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

代码语言:javascript
复制
TypeSpecBlob ::= GENERICINST (CLASS | VALUETYPE) TypeDefOrRefEncoded GenArgCount Type Type*
             | ...

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

代码语言:javascript
复制
Type ::= CLASS TypeDefOrRefEncoded
     | VALUETYPE TypeDefOrRefEncoded
     | ...

考虑到前面示例(15 12 3C 01 12 36)中的字节,我的“餐巾纸背面”抓取的结果如下:

代码语言:javascript
复制
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.)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38615100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档