【问题标题】:Creating an IL instruction with an inline argument using Mono.Cecil使用 Mono.Cecil 创建带有内联参数的 IL 指令
【发布时间】:2012-05-01 03:56:34
【问题描述】:

我现在正在玩突变测试。我正在研究的其中一个突变涉及交换参数,我可能需要为此交换参数,例如 Ldarg.0Ldarg_S 与指示索引的操作数。

它的操作数类型是一个内联 arg,我相信在 Mono.Cecil 中需要我创建一个正确实例化的 ParameterDefinition 来存储 32 位 int 索引。有没有人对 Cecil 有足够的经验,可以为我指出正确的方向,即创建一个 OpCodeLdarg_S 和适当类型的 OperandInstruction 实例?

【问题讨论】:

    标签: .net mono.cecil mutation-testing


    【解决方案1】:

    这里有两种操作码,ldarg.0ldarg(及其 _s)变体。

    第一个是“宏”操作码,这意味着它用于减小代码的大小以获取常用值。

    如果您需要修改方法的参数,我建议您首先将所有宏操作码转换为完整的形式,这是使用帮助库 Mono.Cecil.Rocks 中 MethodBody 上的 SimplifyMacros() 扩展方法完成的:

    using Mono.Cecil;
    using Mono.Cecil.Cil;
    using Mono.Cecil.Rocks;
    
    // ..
    
    method.Body.SimplifyMacros();
    

    完成此操作后,现有的 ldarg.0 指令现在将是带有正确操作数的 ldarg,正如您所猜测的那样,ParameterDefinition

    有了这些,您可以重新排序参数,并创建新指令:

    var il = method.Body.GetILProcessor();
    var instruction = il.Create(OpCodes.Ldarg, aParameterDefinition);
    il.InsertBefore(xxx, instruction);
    

    完成后,您可以调用SimplifyMacros()OptimizeMacros() 的逆函数,如果可能,它将尝试将操作码优化为宏形式。

    您必须注意的一件事是,实例方法的第一个参数,即隐含的“this”,由您在 .Parameters 集合中找不到的 method.Body.ThisParameter 特殊参数表示方法。

    【讨论】:

    • 啊,我什至没有意识到您在 SO Jb 上闲逛 - 非常感谢您的回复。我已经处理了实例方法的“this”参数,这很好。我目前有一个解决方法,我只是不喜欢它的外观。我会试一试,然后告诉你进展如何 - 现在 +1,预计这会在早上成为一大亮点。
    • SimplifyMacros 使我的项目变得更加容易。非常好 - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多