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

标签 c# mono

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

Instruction.Create(OpCodes.Ldarg_S, 4);

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

这需要初始化 ParameterDefinition反过来,它需要以下参数:

  • string name
  • ParameterAttributes attributes
  • TypeReference parameterType

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

最佳答案

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

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

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

关于c# - 如何在 Mono.Cecil 中创建 Ldarg_S 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32989681/

相关文章:

mysql - 如何在 ubuntu 服务器上安装 Mono mysql 连接器

linux - mono 忽略 app.config 文件中的 dllmaps

c# - 使用单声道和 nunit 测试的代码覆盖率

c# - 警告 1 可能有意想不到的引用比较;要进行值比较,请在左侧输入 'string'

c# - Azure 应用服务中的 System.BadImageFormatException : Bad binary signature.

c# - 使用c#创建一个弹出网页

mono - 我正在使用 monodevelop,当我尝试构建时出现 "framework mono/.NET 4.0 not installed"错误

c# 将文本文件添加到二维数组

c# - 如何按只能在排序过程中获得的值对列表进行排序?

c# - 扩展 Mono C# 编译器 : is there any documentation or precedent?