メソッドを発行するために IL の解析を試しています。各文字列が IL 命令である string[] 内のメソッドの IL コードを取得しました。この配列をループして、ILGenerator を使用して OpCode を追加しています。
foreach (string ins in instructions) //string representations of IL
{
string opCode = ins.Split(':').ElementAt(1);
// other conditions omitted
if (opCode.Contains("br.s"))
{
Label targetInstruction = ilGenerator.DefineLabel();
ilGenerator.MarkLabel(targetInstruction);
ilGenerator.Emit(OpCodes.Br_S, targetInstruction);
}
再現する必要がある IL は次のとおりです。
Source IL:
IL_0000: nop
IL_0001: ldstr "Hello, World!"
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
そして、ここに私が出力として得ているものがあります:
Target IL:
IL_0000: nop
IL_0001: ldstr "Hello, World!"
IL_0006: stloc.0
IL_0007: br.s IL_0007 // this is wrong -- needs to point to IL_0009
IL_0009: ldloc.0
IL_000a: ret
ご覧のとおり、br.s 呼び出しはそれ自体を指しているため、もちろん無限ループが発生します。ソースのように次の命令を指すようにするにはどうすればよいですか? これは Reflection.Emit.Label の使用に関係していますが、どのように機能するかはわかりません。
編集ちなみに、上記のILはこの単純な方法のためのものであり、
public string HelloWorld()
{
return "Hello, World!";
}