我正在尝试查看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/