【发布时间】:2018-06-17 15:26:00
【问题描述】:
AFAIK,Cecil 不支持DefineLabel 和MarkLabel。在使用 if-else 和 while 分支时,可以使用哪些替代方法(例如生成 Nop 操作码)来替换标签?
例如:
public void Run(bool someParam)
{
int someInt = 0;
while (someParam)
{
someInt = someInt + 1;
if (someInt == 10) someParam = false;
System.Console.WriteLine(someInt);
}
}
会有以下反编译的 Reflection.Emit 代码:
Label whileLabel = gen.DefineLabel();
Label label1 = gen.DefineLabel();
Label label2 = gen.DefineLabel();
gen.Emit(OpCodes.Ldc_I4_0);
gen.Emit(OpCodes.Stloc_0);
gen.Emit(OpCodes.Br_S,label1);
gen.MarkLabel(whileLabel);
gen.Emit(OpCodes.Ldloc_0);
gen.Emit(OpCodes.Ldc_I4_1);
gen.Emit(OpCodes.Add);
gen.Emit(OpCodes.Stloc_0);
gen.Emit(OpCodes.Ldloc_0);
gen.Emit(OpCodes.Ldc_I4_S,10);
gen.Emit(OpCodes.Ceq);
gen.Emit(OpCodes.Stloc_1);
gen.Emit(OpCodes.Ldloc_1);
gen.Emit(OpCodes.Brfalse_S,label2);
gen.Emit(OpCodes.Ldc_I4_0);
gen.Emit(OpCodes.Starg_S,1);
gen.MarkLabel(label2);
gen.Emit(OpCodes.Ldloc_0);
gen.Emit(OpCodes.Call,writeLineMethod);
gen.MarkLabel(label1);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Stloc_2);
gen.Emit(OpCodes.Ldloc_2);
gen.Emit(OpCodes.Brtrue_S,whileLabel);
gen.Emit(OpCodes.Ret);
如何在 Cecil 中“标记”标签?
【问题讨论】:
-
IIRC an branch
Instructionin mono.cecil 将分支的目标直接保存为对应Instruction对象形式的操作数..
标签: c# .net code-generation reflection.emit mono.cecil