使用Mono.Cecil创建带有内联参数的IL指令

Dav*_*d M 4 .net mutation-testing mono.cecil

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

这个操作数类型是一个内联arg,在Mono.Cecil中我认为需要我创建一个正确实例化ParameterDefinition来存储32位int索引.有没有人有丝丝足够的经验,指出我的一个简单的方法正确的方向,以创建一个Instruction与实例OpCodeLdarg_SOperand适当的类型?

Jb *_*ain 8

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

第一个是"宏"操作码,这意味着它用于减少通常使用的值的代码大小.

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

using Mono.Cecil;
using Mono.Cecil.Cil;
using Mono.Cecil.Rocks;

// ..

method.Body.SimplifyMacros();
Run Code Online (Sandbox Code Playgroud)

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

有了这些,您可以重新排序参数,并创建新的说明:

var il = method.Body.GetILProcessor();
var instruction = il.Create(OpCodes.Ldarg, aParameterDefinition);
il.InsertBefore(xxx, instruction);
Run Code Online (Sandbox Code Playgroud)

当你做,你可以调用的倒数SimplifyMacros(),OptimizeMacros(),这将尝试,好了,如果可能的优化操作码转换成他们的宏观形式.

你必须要注意的一件事是,实例方法的第一个参数,隐含的"this",用method.Body.ThisParameter特殊的参数表示,你不会在方法的.Parameters集合中找到它.