2

エラーを取り除くためにアセンブリのバイトコードを変更しましたが、それを使用しようとすると 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
}

なぜこれが間違っているのかについてのアイデアはありますか?

ありがとう!

4

1 に答える 1

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
于 2012-05-22T14:17:46.287 に答える