2

C#.Net プログラムで次の例外が発生します。

タイプ 'System.Data.SqlClient.SqlException' の初回例外が System.Data.dll で発生しました myapp.exe の 0x000007feff75121b で初回例外が発生しました: 0xC0000005: 場所 0x0000000000000000 を読み取るアクセス違反。タイプ 'System.AccessViolationException' の初回例外が CustomMarshalers.dll で発生しました タイプ 'System.AccessViolationException' のハンドルされない例外が CustomMarshalers.dll で発生しました 追加情報: 保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。

try/catch(Exception) ブロック内で取得しますが、キャッチされることはありません。

なぜそれが起こっているのかを確認するためにデバッグしようとしていますが、キャッチせずにそれを行うのは困難です。

C#.Net で 0xC0000005 例外をキャッチすることは可能ですか? (Windows 2008 R2 のフレームワーク 4.0)。

ヒントをありがとう。

4

1 に答える 1

10

AccessViolationException は、保護されたメモリの読み取りまたは書き込みの試みを示しているため、デフォルトではキャッチできません。[HandleProcessCorruptedStateExceptions]ただし、属性が発生するメソッドに属性を追加できます。

既定では、共通言語ランタイム (CLR) はこれらの例外をマネージ コードに配信せず、try /* catch * ブロック (およびその他の例外処理句) は呼び出されません。これらの例外の処理を確実に維持したい場合は、実行する例外処理句を持つメソッドにHandleProcessCorruptedStateExceptionsAttribute属性を適用する必要があります。CLR は、 HandleProcessCorruptedStateExceptionsAttribute属性とSecurityCriticalAttribute属性の両方を持つメソッドでのみ、破損したプロセス状態の例外を該当する例外句に配信します。

于 2012-06-15T18:19:42.040 に答える