4

現在、ミューテーションテストで遊んでいます。私が検討している変更の 1 つは、たとえば、インデックスを示すオペランドを使用してスワップする必要があるパラメーターのスワップLdarg.0Ldarg_S伴います。

このオペランドの型はインライン arg です。Mono.Cecil ではParameterDefinition、32 ビットの int インデックスを格納するために適切にインスタンス化された を作成する必要があると思います。適切なタイプのインスタンスInstructionを作成する簡単な方法の正しい方向に私を向けるのに十分なセシルの経験を持っている人はいますか?OpCodeLdarg_SOperand

4

1 に答える 1

8

ここにはldarg.0、 とldarg(およびその _s) バリアントの 2 種類のオペコードがあります。

1 つ目は「マクロ」オペコードです。つまり、通常使用される値のコードのサイズを縮小するために使用されます。

メソッドのパラメーターを変更する必要がある場合は、最初にすべてのマクロ オペコードを完全な形式に変換することをお勧めします。これは、ヘルパー ライブラリ Mono.Cecil.RocksのSimplifyMacros()拡張メソッドを使用して行われます。MethodBody

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()これは、可能であればオペコードをマクロ形式に最適化しようとします。

注意しなければならないことの 1 つは、インスタンス メソッドの最初の引数である暗黙の「this」method.Body.ThisParameterが、メソッドの .Parameters コレクションにはない特別なパラメーターで表されることです。

于 2012-04-19T15:37:44.473 に答える