use*_*443 3 c# reflection if-statement reflection.emit system.reflection
我有问题.这是我的代码:
var method = new DynamicMethod("dummy", null, Type.EmptyTypes);
var g = method.GetILGenerator();
g.DeclareLocal(typeof(int));
Label inequality = g.DefineLabel();
Label equality = g.DefineLabel();
Label end = g.DefineLabel();
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Call, typeof(String).GetMethod("op_Equality", new Type[]{typeof(string), typeof(string)}));
g.Emit(OpCodes.Stloc_0);
g.Emit(OpCodes.Ldloc_0);
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{typeof(int)}));
g.Emit(OpCodes.Ldloc_0);
g.Emit(OpCodes.Ldc_I4_1);
g.Emit(OpCodes.Ceq);
g.Emit(OpCodes.Brtrue_S, equality);
g.Emit(OpCodes.Brfalse_S, inequality);
g.MarkLabel(inequality);
g.Emit(OpCodes.Ldstr, "Specified strings are different.");
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{typeof(string)}));
g.Emit(OpCodes.Br_S, end);
g.MarkLabel(equality);
g.Emit(OpCodes.Ldstr, "Specified strings are same.");
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
g.Emit(OpCodes.Br_S, end);
g.MarkLabel(end);
g.Emit(OpCodes.Ret);
var action = (Action)method.CreateDelegate(typeof(Action));
action();
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
1
Specified strings are different.
Run Code Online (Sandbox Code Playgroud)
但为什么输出错了?Ceq指令比较op_Equation的结果为1,堆栈的顶部为0.1 不等于 0.那么为什么呢?错误在哪里?请帮我.
之后g.Emit(OpCodes.Brtrue_S, inequality);,您需要手动跳转到"相等"语句.否则它无论如何都会执行下一条指令.所以你需要在它之后插入以下行:
g.Emit(OpCodes.Br_S, equality);
Run Code Online (Sandbox Code Playgroud)
此外,equality无论如何,当它被声明为下一条指令时跳转到标签是没有意义的.所以删除它.
所以该部分将如下所示:
g.Emit(OpCodes.Ceq);
g.Emit(OpCodes.Brtrue_S, inequality); // if true goto inequality
g.Emit(OpCodes.Br_S, equality); // else goto equality
g.MarkLabel(inequality);
g.Emit(OpCodes.Ldstr, "Specified strings are different.");
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{typeof(string)}));
g.Emit(OpCodes.Br_S, end); // goto end
g.MarkLabel(equality);
g.Emit(OpCodes.Ldstr, "Specified strings are same.");
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
g.MarkLabel(end);
g.Emit(OpCodes.Ret);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
682 次 |
| 最近记录: |