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

时间:2015-10-07 10:19:46

标签: c# mono

在Mono.Cecil中,当使用Ldarg_S创建指令时,采用直截了当的方法:

Instruction.Create(OpCodes.Ldarg_S, 4);

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

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

  • ParameterAttributes attributes
  • TypeReference parameterType
  • installer_input.ini

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

1 个答案:

答案 0 :(得分:2)

在深入检查Mono.Cecil的源代码后,似乎无法生成像ldarg.s 4这样简单的指令。

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

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