Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# 阅读DynamicMethod';s LocalSignature:非标准类型令牌?_C#_Cil_Reflection.emit - Fatal编程技术网

C# 阅读DynamicMethod';s LocalSignature:非标准类型令牌?

C# 阅读DynamicMethod';s LocalSignature:非标准类型令牌?,c#,cil,reflection.emit,C#,Cil,Reflection.emit,我最近开始在VS2010中使用ILVisualizer来检查IL中的动态方法。然而,它并没有从IL流中提取LocalVariable信息,所以我尝试一下(当然是为了好玩,因为这是一个很好的学习体验:) 对于静态编译的方法,这不是问题,因为我们可以通过GetMethodBody()访问方法体,并从中获取局部变量 但是,对于DynamicMethods,方法体不能通过GetMethodBody()使用。我找到了一个解决方法,它将本地签名作为字节数组获取,然后根据CIL规范,从那里我可以提取方法本地的

我最近开始在VS2010中使用ILVisualizer来检查IL中的动态方法。然而,它并没有从IL流中提取LocalVariable信息,所以我尝试一下(当然是为了好玩,因为这是一个很好的学习体验:)

对于静态编译的方法,这不是问题,因为我们可以通过GetMethodBody()访问方法体,并从中获取局部变量

但是,对于DynamicMethods,方法体不能通过GetMethodBody()使用。我找到了一个解决方法,它将本地签名作为字节数组获取,然后根据CIL规范,从那里我可以提取方法本地的计数、类型和索引。只要我们处理本地类型(短、字节、字符串…),一切都很好

但是,如果局部变量是类类型,则会使用元素类型内部(0x21)标志引用它,而不是使用局部签名中的元素类型类

不幸的是,我找不到任何关于如何读取存储为元素\类型\内部的类型的信息。 怎么回事?MS是否将非标准CIL用于动态方法?有人知道正确阅读这些签名的方法吗


Edit我偶然发现了mscorlib.dll的一些源文件,并从SignatureHelper的源代码中发现,当类是运行时类型时,可能会发生这种情况。我会调查的…

好吧,我想我知道了

事实证明,元素\类型\内部标志后的数据不是压缩数据,而是一个纯32位整数(或64位,取决于平台,但我必须确认),存储在4个字节上,这是指向引用类型的指针

尽管我找不到从IntPtr获取RuntimeTypeHandle的方法,但通过循环方法的DynamicScope对象中的标记并比较值可以获得类型句柄