2

我正在尝试生成动态方法。假设我arg在堆栈中有布尔值。我想调用一个接受类型参数的方法,该参数将通过简单的规则int从该值转换。对于一些示例代码,生成的 IL 代码如下:boolarg ? 1 : 0

//bool value is already pushed into stack
IL_003d:  brtrue.s  IL_0042
IL_003f:  ldc.i4.0
IL_0040:  br.s      IL_0043
IL_0042:  ldc.i4.1
IL_0043:  callvirt --methodName--

发射时OpCodes.Brtrue_SOpCodes.Br_S如何正确识别要跳转到的偏移量?

4

1 回答 1

5

如果您真的只想转换trueto1falseto 0,您可以使用小于 4 字节的类型在堆栈上扩展为 4 字节的事实。这意味着您不必做任何事情,只需boolint.

如果你真的想要一个三元运算符,你可以使用这对方法DefineLabel()MarkLabel()

var trueLabel = il.DefineLabel();
var endLabel = il.DefineLabel();

il.Emit(OpCodes.Brtrue, trueLabel);

il.Emit(OpCodes.Ldc_I4_0);

il.Emit(OpCodes.Br, endLabel);

il.MarkLabel(trueLabel);

il.Emit(OpCodes.Ldc_I4_1);

il.MarkLabel(endLabel);
于 2013-07-03T16:58:57.877 回答