【发布时间】:2019-09-25 08:27:32
【问题描述】:
如何在运行时移除 Emit IL 的最后几段
我尝试修改一千行代码中的一些逻辑,我想用回滚IL的方式添加新的逻辑,避免改变之前的代码。
简单例如:
我希望在isSomeLogic 为真时删除 Emit IL 的最后几段,然后发出新的 il。
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();
}
【问题讨论】:
-
既然这显然是在运行时发出的,为什么不推迟
OpCodes.Ret发出,直到你知道是否要在返回之前发出更多代码? -
谢谢,一千行代码尝试修改一些逻辑,想用回滚IL的方式添加新的逻辑,避免改动之前的代码。