C# 如何从TypeSpec获取TypeDef
我正在尝试实现托管调试器,查看MDBG示例。 目前,我一直在尝试使用IMetaDataImport获取基类层次结构方法 ,枚举表示指定类型的方法的MethodDef标记。但是我想列举类层次结构中的所有方法。为此,我使用GetTypeDefProps,它返回ptkExtends,这是表示基类的令牌。问题是基类可以用TypeDef、TypeRef或TypeSpec表示 如何从相对TypeSpec获取基类TypeDef 我已经阅读了ECMA第二部分的规范,但对我帮助不大 以下是我到目前为止得到的信息:C# 如何从TypeSpec获取TypeDef,c#,.net,metadata,clr,cil,C#,.net,Metadata,Clr,Cil,我正在尝试实现托管调试器,查看MDBG示例。 目前,我一直在尝试使用IMetaDataImport获取基类层次结构方法 ,枚举表示指定类型的方法的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?!
如前所述,TypeSpec格式在第二部分第23.2.14节中定义,其表达方式类似于EBNF,终端在第23.1.16节中定义 TypeSpec可以表示一系列不同类型的类型,但对于基类来说唯一有意义的类型是
GENERICINST
(一种封闭的泛型类型)
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.)
谢谢,我现在明白了!这是我感兴趣的第三个参数!您要查找的元数据标记是第一个(与类型参数相对的开放泛型类型)。您可以将整个过程简化为“验证第一个字节是0x15,第二个字节是0x11或0x12”,然后读取TypeDefOrRefEncoded以获取元数据令牌。好的,我理解这个想法,可以将dipper挖掘到规范中以检查所有情况,但可能会分解为您提到的检查。还有一件事,令牌是经过编码的,有没有标准的解码方法?我的意思是使用一些框架类库?我不知道框架会为您提供什么。如果Mono有什么东西,我不会感到惊讶,但我从不费心检查,我总是自己做的(其实没那么复杂——我读取压缩uint的方法不到40行,带有错误检查)。
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.)