次の 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 属性。