2012-04-19 18 views
4

私は現時点で突然変異検査をしています。私が見ている突然変異の1つに、スワップする必要のあるパラメータを交換することが含まれます。例えば、Ldarg.0Ldarg_Sのように、インデックスを示すオペランドがあります。Mono.Cecilを使用してインライン引数を持つIL命令を作成する

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

答えて

8

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

最初のマクロは、通常は使用される値のコードのサイズを減らすために使用される「マクロ」オペコードです。あなたがメソッドのパラメータを変更する必要がある場合は

は、私はあなたもみこれはヘルパーライブラリMono.Cecil.RocksからMethodBodySimplifyMacros()拡張メソッドを使用して行われ、完全な形にすべてのマクロオペコード変換勧め:

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コレクションにはありません。メソッド。

+0

ああ、私はあなたがSO Jbにハングアウトしたことも気付かなかった。私は既にインスタンスメソッドの "this"パラメータを扱っています。それは問題ありません。そして、私は現時点で回避策を持っています、私はちょうどそれの外観が好きではありません。私はそれを試して、あなたはそれがどのように行くのかを知らせます - 今は+1、それは朝に大きなダニになると期待しています。 –

+0

'SimplifyMacros'はプロジェクトをもっと簡単にしました。非常に良い - ありがとう。 –

関連する問題