ここには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 コレクションにはない特別なパラメーターで表されることです。