1

我正在使用 .NET profiler API 进行 IL 重写。我的目标之一是发出被调用方法参数的类型标记。但是,当涉及到泛型时,它会变得很棘手。例如,考虑以下代码段。

class C<T>
{
    public void A(T x) {}
}
class Program
{
    public void F(C<int> l)
    {
        l.A(5);
    }
}

方法F(C<int>)被编译成以下 IL:

.method public hidebysig (null) cil managed 
{
    // Code size 10 (0xa)
    .maxstack 8
    IL_0000:  nop 
    IL_0001:  ldarg.1 
    IL_0002:  ldc.i4.5 
    IL_0003:  callvirt instance void class C`1/*02000002(TypeDef)*/<int32>/*1b000001(TypeSpec)*/::A(!0)/*0a00000d(MemberRef)*/
    IL_0008:  nop 
    IL_0009:  ret 
}

这里,callvirtoffset 处的指令IL_0003是 MemberRef 0x0a00000d。我现在的目标是获取此方法唯一参数的类型标记。为此,我使用该IMetadataImport::GetMemberRefProps函数查询方法签名,然后对其进行解析以获取方法参数的类型签名。但是,我得到了未实例化的方法签名: blob 0000001B hasthis System.Void (!0)

至于我,这有点奇怪,因为 MethodRef0x0a00000d对应的是实例化C<int>::A(int),类型变量!0应该用 实例化int

问题: 有什么方法可以在 .NET profiler API 中获得专门的通用方法签名?特别是上面的例子如何获取int结果中方法参数的类型?

4

0 回答 0