Я экспериментирую с разбором IL для создания метода. Я получил код IL метода в строке [], где каждая строка является инструкцией IL. Я перебираю этот массив и добавляю коды операций с помощью 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);
}
Вот 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!";
}