C# 如何在Mono.Cecil中创建Ldarg_指令?

C# 如何在Mono.Cecil中创建Ldarg_指令?,c#,mono,C#,Mono,在Mono.Cecil中,当使用Ldarg_S创建指令时,简单的方法是: Instruction.Create(OpCodes.Ldarg_S, 4); 不工作,因为操作数类型为操作数类型.InlineI,而操作码.Ldarg_S的操作数类型为ShortInlineArg。相反,我需要使用重载 这需要初始化参数定义,而该定义又需要以下参数: 字符串名称 ParameterAttributes属性 TypeReference参数type 那些是什么东西?如何指定只需要第四个(或第五个或第六个

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

Instruction.Create(OpCodes.Ldarg_S, 4);
不工作,因为操作数类型为
操作数类型.InlineI
,而
操作码.Ldarg_S
的操作数类型为
ShortInlineArg
。相反,我需要使用重载

这需要初始化
参数定义
,而该定义又需要以下参数:

  • 字符串名称
  • ParameterAttributes属性
  • TypeReference参数type

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

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

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

最简单的方法是使用
MethodDefinition.Parameters
属性按索引检索相应的参数,并将其传递给
指令。创建
。这种方法的目标可能是通过指定一个给定的参数并让Mono.Cecil确定实际的索引,使调用者能够更安全地管理参数。实际上,调用方确定实际索引可能有点棘手,尤其是在实例方法中,
ldarg.0
引用的是
这个
,而不是实际的第一个参数