AccessViolationException が .NET4.0 でキャッチできない理由 質問する

AccessViolationException が .NET4.0 でキャッチできない理由 質問する

次の C# コードは .NET4.0 ではクラッシュしますが、.NET2.0 では正常に動作するのは非常に興味深いことです。

C# コード

class Program
{
    static void Main(string[] args)
    {
        try
        {
            ExceptionTest();
            Console.WriteLine("Done!");
        }
        catch (Exception e)
        {
            Console.WriteLine("Error !!!");
            Console.WriteLine(e.Message);
        }
    }

    [DllImport("badapp")]
    private static extern int ExceptionTest();
}

C++ コード

extern "C" __declspec(dllexport) int ExceptionTest()
{
    IUnknown* pUnk = NULL;
    pUnk->AddRef();
    return 0;
}

上記の C# コードを .NET2.0 に対してコンパイルすると、すべて正常に動作します。.NET4.0 に対してのみコンパイルすると、実行時にクラッシュします。

.NET4.0 以降、システム例外キャッチ メカニズムが変更されたのではないかと考えています。何かアイデアはありますか?

ベストアンサー1

はい、.NET 4 では変更されました。破損状態を示す例外をキャッチすることはできません。これは、破損状態の例外がスローされたときに何もできる保証がほとんどないためです。破損状態のプロセスを実行し続ける理由は実質的にありません。

古いコードとの互換性を保つために、この動作を変更するには、legacyCorruptedStateExceptionsPolicy要素を app.config に追加します。

例外をキャッチしたいメソッドをマークすることで、ケースバイケースでこれを行うこともできます。HandleProcessCorruptedStateExceptions 属性

おすすめ記事