如何在 Mono.Cecil 中创建Ldarg_S指令

本文关键字:Ldarg 指令 创建 Mono Cecil | 更新日期: 2023-09-27 18:16:20

在 Mono.Cecil 中,当使用 Ldarg_S 创建指令时,简单的方法:

Instruction.Create(OpCodes.Ldarg_S, 4);

不起作用,因为 Mono.Cecil 期望操作数类型OperandType.InlineI,而OpCodes.Ldarg_S的操作数类型是 ShortInlineArg 。相反,我需要使用Create (OpCode opcode, ParameterDefinition parameter) : Instruction重载。

这需要初始化ParameterDefinition而又需要以下参数:

  • string name
  • ParameterAttributes attributes
  • TypeReference parameterType

这些东西是什么?如何指定我只需要第四个(或第五个或第六个(参数?

如何在 Mono.Cecil 中创建Ldarg_S指令

在深入

检查了 Mono.Cecil 的源代码后,似乎没有办法生成像 ldarg.s 4 这样简单的指令。

相反,Mono.Cecil 所做的是它需要您指定ParameterDefinition然后与方法的参数列表匹配,以便找到实际索引。

最简单的方法是使用 MethodDefinition.Parameters 属性按索引检索相应的属性并将其传递给 Instruction.Create 。这种方法的目标可能是通过指定给定参数并使调用方更安全地管理参数,并让 Mono.Cecil 确定实际索引。对于调用方来说,确定实际索引确实有点棘手,尤其是在实例方法的情况下,ldarg.0引用this,而不是实际的第一个参数。