小编Eli*_*kel的帖子

如何找到泛型参数的TypeSpec

一些初步信息

给定以下C#函数:

public static void func<T>(T t)
{
    System.Console.WriteLine(t);
}
Run Code Online (Sandbox Code Playgroud)

它被编译为以下CIL:

.method public hidebysig static void  func<T>(!!T t) cil managed
{
    ldarg.0
    box        !!T
    call       void [mscorlib]System.Console::WriteLine(object)
    ret
}
Run Code Online (Sandbox Code Playgroud)

上述方法的签名位于10 01 01 01 1E 00

10-呼叫约定(IMAGE_CEE_CS_CALLCONV_GENERIC)
01-函数通用参数计数(为1)
01-函数参数计数(为1)
01-返回类型(ELEMENT_TYPE_VOID)
1E-第一个参数类型(ELEMENT_TYPE_MVAR)
00-高于MVAR的索引(为0)

另请参阅以下指令及其实际字节码:

盒!! T-8C 1B000001

1B000001指向TypeSpec表中的第一个条目,该条目指向blob 02 1E 00,其中:

02-斑点长度
1E-类型类型(ELEMENT_TYPE_MVAR)
00-高于MVAR的索引(为0)

如我们所见,方法签名以描述性方式包含泛型参数,其中我们具有实际的类型签名。
但是,当使用需要TypeDef / Ref / Spec的OpCode时,将提供TypeSpec,并且TypeSpec指向带有类型信息的签名。


所以我的问题是:
我正在编写一个执行IL重写的事件探查器,并给定了函数签名,我想向函数体中添加一些OpCode,以对参数进行操作。

使用该IMetaDataImport2接口,如何获得给定通用参数所需的TypeSpec令牌?

我可以看到2个选项:

  1. 遍历EnumTypeSpecs直到找到匹配的签名
  2. 使用IMetaDataEmit界面创建新的TypeSpec

但是,出于明显的原因,我想避免这两个选择,而选择一个更明智的选择。

.net generics instrumentation profiling cil

5
推荐指数
1
解决办法
80
查看次数

标签 统计

.net ×1

cil ×1

generics ×1

instrumentation ×1

profiling ×1