繁体   English   中英

如何在Reflection.Emit中使用条件

[英]How to use conditional in Reflection.Emit

您好,我正在使用Reflection.Emit生成一个类,我想知道您如何将brfalse命令用于conditionals brfalse

具体来说,我不知道如何为brfalse.s命令将IL 转换OPCODES

我的方法具有以下形式:

object MyMethod() { if(isTransaction) //isTransaction is a bool property return Method1(); else return Method2(); }

有条件的

        IL_0000: ldarg.0      // this
        IL_0001: call         instance bool RediusTests.DaemonBase::get_IsTransaction()
        IL_0006: brfalse.s    IL_0020    //how is this translated within opcodes?

第一分支

        IL_0008:ldarg_0
        IL_.......          ///INSTRUCTIONS
        IL_......
        IL_001f:ret

第二分公司

        IL_0020:ldarg_0     //How do i specify with OPCODES to jump here?????
        IL_.......          
        IL_......
        IL_001f:ret

对于第一个brfalse.sbrfalse.s的参数是brfalse.s

        ilgen.Emit(OpCodes.Ldarg_0);
        ilgen.Emit(OpCodes.Call, getIsTransaction);
        ilgen.Emit(OpCodes.Brfalse,);  //what do i put here in the overload?

如您在最后一个片段,最后一行中看到的,我应该把ilgen.Emit的重载放在什么ilgen.Emit 没有, 20还是还有其他一些代码可以转换为IL_0020

也不是在程序的每次运行存放在不同的内存地址的指令的地址?无法从改变IL0020IL00xx在今后的执行?

PS收到一些全面的答案后,这是我到目前为止的版本:

        ILGenerator ilgen = newMethod.GetILGenerator();
        Label falseLabel = ilgen.DefineLabel();
        Label continueLabel = ilgen.DefineLabel();

        ilgen.Emit(OpCodes.Ldarg_0);       
        ilgen.Emit(OpCodes.Call, getIsTransaction);
        ilgen.Emit(OpCodes.Brtrue,continueLabel);   //branching

        ilgen.MarkLabel(continueLabel);    //true branch
        ----instructions------
        ilgen.Emit(OpCodes.Ret);
        ilgen.Emit(OpCodes.Br,continueLabel);

        ilgen.MarkLabel(falseLabel);     //false branch
        --instructions----
        ilgen.Emit(OpCodes.Ret);

您不必显式地处理代码地址。 为了跳转,您需要定义标签:

Label falseLabel = ilgen.DefineLabel();
Label continueLabel = ilgen.DefineLabel();

ilgen.Emit(OpCodes.Call, getIsTransaction);
ilgen.Emit(OpCodes.Brfalse, continueLabel);

// getIsTransaction returned true
...

ilgen.Emit(OpCodes.Br, continueLabel);

ilgen.MarkLabel(falseLabel);
// getIsTransaction returned false
...

ilgen.MarkLabel(continueLabel);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM