我正在使用 .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
}
这里,callvirt
offset 处的指令IL_0003
是 MemberRef 0x0a00000d
。我现在的目标是获取此方法唯一参数的类型标记。为此,我使用该IMetadataImport::GetMemberRefProps
函数查询方法签名,然后对其进行解析以获取方法参数的类型签名。但是,我得到了未实例化的方法签名:
blob 0000001B hasthis System.Void (!0)
至于我,这有点奇怪,因为 MethodRef0x0a00000d
对应的是实例化C<int>::A(int)
,类型变量!0
应该用 实例化int
。
问题:
有什么方法可以在 .NET profiler API 中获得专门的通用方法签名?特别是上面的例子如何获取int
结果中方法参数的类型?