Usando o Br_S OpCode para apontar para a próxima instrução usando Reflection.Emit.Label
Estou experimentando analisar a IL para emitir um método. Eu recebi o código IL de um método em uma string [] onde cada string é uma instrução IL. Estou fazendo um loop sobre essa matriz e adicionando OpCodes usando um ILGenerator:
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);
}
Aqui está o IL que eu preciso reproduzir:
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
E aqui está o que estou obtendo como saída:
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
Como você pode ver, a chamada br.s está apontando para si mesma, o que obviamente causa um loop infinito. Como faço para apontar para a seguinte instrução como na fonte? Isso tem a ver com o uso de Reflection.Emit.Label, mas não tenho certeza de como funcion
EDITA A propósito, a IL vista acima é para esse método simples,
public string HelloWorld()
{
return "Hello, World!";
}