代码之家  ›  专栏  ›  技术社区  ›  Wei Lin

如何在运行时删除emit il的最后几段

  •  1
  • Wei Lin  · 技术社区  · 6 年前

    如何在运行时删除emit il的最后几段

    我试图在一千行代码中修改一些逻辑,我想用rollback-il方式添加新的逻辑,避免更改以前的代码。

    简单的,例如:

    我希望删除emit il的最后几段,然后在 isSomeLogic 是真的。

    void Main()
    {
        DynamicMethod methodbuilder = new DynamicMethod("Deserialize" + Guid.NewGuid().ToString(), typeof(void), null);
        var il = methodbuilder.GetILGenerator();
        il.Emit(OpCodes.Ldstr, "Hello World");
        Type[] types = new Type[1]{typeof(string)};
        MethodInfo method = typeof(Console).GetMethod("WriteLine", types);
        il.Emit(OpCodes.Call, method);
        il.Emit(OpCodes.Ret);
    
        // do some thing...
        var isSomeLogic = true;
        if( isSomeLogic ){
            //remove the il OpCodes.Ret and add new logic Emit
            il.Emit(OpCodes.Ret);
        }
    
        var func = (Action)methodbuilder.CreateDelegate(typeof(Action));
        func();
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Marc Gravell    6 年前

    ILGenerator 仅向前。你不能 去除 您添加的操作码。相反,只是…不加吗?或者,您可以使用 Label 以及跳跃式的操作; Ret 不需要在 结束 一种方法;只要栈在ret处处于正确的高度,并且栈的高度对于到达某个特定位置的所有路径都是相同的,那么下面的方法是完全有效的。

    • 做事
    • 跳转到X
    • 标签:Y
    • 做更多的事情
    • 雷特
    • 标签:X
    • 做更多的事情
    • 跳到Y