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