オペコードには、ldarg.0
とldarg
(およびその_s)の2種類があります。
最初のマクロは、通常は使用される値のコードのサイズを減らすために使用される「マクロ」オペコードです。あなたがメソッドのパラメータを変更する必要がある場合は
は、私はあなたもみこれはヘルパーライブラリMono.Cecil.RocksからMethodBody
にSimplifyMacros()
拡張メソッドを使用して行われ、完全な形にすべてのマクロオペコード変換勧め:
using Mono.Cecil;
using Mono.Cecil.Cil;
using Mono.Cecil.Rocks;
// ..
method.Body.SimplifyMacros();
これが行われると、既存のldarg.0
命令は、今あなたが推測として、ParameterDefinition
で正しいオペランド、とldarg
になります。代わりにそれと
、あなたはパラメータの順序再、および作成することができます新しい命令:
var il = method.Body.GetILProcessor();
var instruction = il.Create(OpCodes.Ldarg, aParameterDefinition);
il.InsertBefore(xxx, instruction);
完了したら、あなたがしようとしますSimplifyMacros()
、OptimizeMacros()
の逆数を、呼び出すことができ、可能であればオペコードをマクロ形式に最適化してください。
あなたが気をつけなければならないことは、インスタンスメソッドの最初の引数である暗黙の「this」は、method.Body.ThisParameter
の特殊パラメータで表されます。これは、.Parametersコレクションにはありません。メソッド。
ああ、私はあなたがSO Jbにハングアウトしたことも気付かなかった。私は既にインスタンスメソッドの "this"パラメータを扱っています。それは問題ありません。そして、私は現時点で回避策を持っています、私はちょうどそれの外観が好きではありません。私はそれを試して、あなたはそれがどのように行くのかを知らせます - 今は+1、それは朝に大きなダニになると期待しています。 –
'SimplifyMacros'はプロジェクトをもっと簡単にしました。非常に良い - ありがとう。 –