Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从TypeSpec获取TypeDef_C#_.net_Metadata_Clr_Cil - Fatal编程技术网

C# 如何从TypeSpec获取TypeDef

C# 如何从TypeSpec获取TypeDef,c#,.net,metadata,clr,cil,C#,.net,Metadata,Clr,Cil,我正在尝试实现托管调试器,查看MDBG示例。 目前,我一直在尝试使用IMetaDataImport获取基类层次结构方法 ,枚举表示指定类型的方法的MethodDef标记。但是我想列举类层次结构中的所有方法。为此,我使用GetTypeDefProps,它返回ptkExtends,这是表示基类的令牌。问题是基类可以用TypeDef、TypeRef或TypeSpec表示 如何从相对TypeSpec获取基类TypeDef 我已经阅读了ECMA第二部分的规范,但对我帮助不大 以下是我到目前为止得到的信息:

我正在尝试实现托管调试器,查看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.)