この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
アンマネージド コードまたはアンセーフ コードで、割り当てられていないメモリまたはアクセス権を持たないメモリに対してコードが読み取りまたは書き込みを試みると、アクセス違反が発生します。 これは通常、ポインターの値が正しくないために発生します。 すべての読み取りまたは書き込みが不適切なポインターを通じてアクセス違反につながるわけではないため、通常、アクセス違反は、不適切なポインターを介して複数の読み取りまたは書き込みが発生し、そのメモリが破損している可能性があることを示します。 したがって、アクセス違反は、ほとんどの場合、重大なプログラミング エラーを示します。 AccessViolationExceptionは、これらの重大なエラーを明確に識別します。
完全に検証可能なマネージド コードで構成されるプログラムでは、すべての参照が有効または null であり、アクセス違反は不可能です。 検証可能なコードで null 参照を参照しようとすると、 NullReferenceException 例外がスローされます。 AccessViolationExceptionは、検証可能なマネージド コードがアンマネージ コードまたは安全でないマネージド コードと対話する場合にのみ発生します。
AccessViolationException 例外のトラブルシューティング
AccessViolationException例外は、安全でないマネージド コードでのみ、または検証可能なマネージド コードがアンマネージ コードと対話する場合にのみ発生します。
- 安全でないマネージド コードで発生するアクセス違反は、プラットフォームに応じて、 NullReferenceException 例外または AccessViolationException 例外として表すことができます。
- マネージド コードまで伝播するアンマネージド コードでのアクセス違反は、常にAccessViolationException例外でラップされます。
どちらの場合も、次のように AccessViolationException 例外の原因を特定して修正できます。
アクセスしようとしているメモリが割り当てられていることを確認します。 AccessViolationException例外は、保護されたメモリ (つまり、割り当てされていないメモリやプロセスによって所有されていないメモリにアクセスする) にアクセスしようとした場合に常にスローされます。
自動メモリ管理は、.NET ランタイムが提供するサービスの 1 つです。 マネージド コードでアンマネージド コードと同じ機能が提供される場合は、この機能を利用するためにマネージド コードに移行することを検討してください。 詳細については、「 自動メモリ管理」を参照してください。
アクセスしようとしているメモリが破損していないことを確認します。 不適切なポインターを介して複数の読み取りまたは書き込み操作が発生した場合、メモリが破損している可能性があります。 これは通常、定義済みのバッファーの外部にあるアドレスに対する読み取りまたは書き込み時に発生します。
AccessViolationException と try/catch ブロック
AccessViolationException .NET ランタイムによってスローされた例外は、ランタイムによって予約されたメモリの外部で例外が発生した場合、構造化例外ハンドラーの catch ステートメントでは処理されません。
.NET Framework のみ: このような AccessViolationException 例外を処理するには、例外がスローされるメソッドに HandleProcessCorruptedStateExceptionsAttribute 属性を適用します。 この変更は、ユーザーコードによってスローされるAccessViolationException例外に影響しません。これらの例外は、catchステートメントによって引き続きキャッチされます。
注意事項
HandleProcessCorruptedStateExceptions 属性は、現在の .NET バージョンでは廃止されています。 破損したプロセス状態からの復旧 -例外はサポートされておらず、属性 (存在する場合) は無視されます。
.NET