为什么这个修改后的程序集不运行?(JIT编译器遇到内部限制.)

Ign*_*cia 2 il bytecode .net-assembly

我修改了程序集的字节码以摆脱错误,现在当我尝试使用它时,我得到一个InvalidProgramException.我所做的就是用NOPS代替这个代码:

catch (Exception exception1)
{
    Exception exception = exception1;
    if (exception as InvalidValueException == null)
    {
        throw new InvalidGenerationException(2);
    }
    else
    {
        throw exception;
    }
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

关于为什么这是错的任何想法?

谢谢!

Luk*_*keH 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
Run Code Online (Sandbox Code Playgroud)