我已经修改了程序集的字节码以摆脱错误,现在当我尝试使用它时,我得到一个InvalidProgramException。 我所做的就是用NOPS替换这段代码:
catch (Exception exception1)
{
Exception exception = exception1;
if (exception as InvalidValueException == null)
{
throw new InvalidGenerationException(2);
}
else
{
throw exception;
}
}
IL之前:
catch [mscorlib]System.Exception
{
IL_022f: stloc.s exception
IL_0231: ldloc.s exception
IL_0233: isinst Custom.InvalidValueException
IL_0238: brfalse.s IL_023d
IL_023a: ldloc.s exception
IL_023c: throw
IL_023d: ldc.i4.1
IL_023e: newobj instance void Custom.InvalidGenerationException ...
IL_0243: throw
}
IL之后:
catch [mscorlib]System.Exception
{
IL_022f: nop
IL_0230: nop
IL_0231: nop
IL_0232: nop
IL_0233: nop
IL_0234: nop
IL_0235: nop
IL_0236: nop
IL_0237: nop
IL_0238: nop
IL_0239: nop
IL_023a: nop
IL_023b: nop
IL_023c: nop
IL_023d: nop
IL_023e: nop
IL_023f: nop
IL_0240: nop
IL_0241: nop
IL_0242: nop
IL_0243: nop
}
关于为什么这是错误的任何想法?
谢谢!
答案 0 :(得分:5)
您的原始catch
块将始终抛出。也就是说,没有办法“正常”退出该区块。
您修改的catch
块不会抛出,因此您需要正常退出块。您需要使用leave
或leave.s
来执行此操作。
(你可能还需要pop
从堆栈中捕获的异常以保持整洁。但我不确定那个,你必须亲自尝试一下。)
catch [mscorlib]System.Exception
{
IL_022f: pop // not certain if pop is necessary
IL_0230: leave.s IL_0244
IL_0232: nop
IL_0233: nop
IL_0234: nop
IL_0235: nop
IL_0236: nop
IL_0237: nop
IL_0238: nop
IL_0239: nop
IL_023a: nop
IL_023b: nop
IL_023c: nop
IL_023d: nop
IL_023e: nop
IL_023f: nop
IL_0240: nop
IL_0241: nop
IL_0242: nop
IL_0243: nop
}
IL_0244: ret // or whatever