我正在尝试实现管理调试器,查看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?!
答案 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.)