System.AccessViolationException-Klasse

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Eine Zugriffsverletzung tritt auf, wenn nicht verwalteter bzw. unsicherer Code versucht, auf Arbeitsspeicher zuzugreifen, der nicht zugewiesen wurde oder zu dem keine Zugangsberechtigung besteht. Dies ist in der Regel der Fall, weil ein Zeiger einen ungültigen Wert aufweist. Nicht alle Lese- und Schreibvorgänge, die aufgrund ungültiger Zeiger aufgetreten sind, führen zu Zugriffsverletzungen. Eine Zugriffsverletzung gibt somit an, dass mehrere Lese- und Schreibvorgänge aufgrund ungültiger Zeiger aufgetreten sind und dass der Arbeitsspeicher u. U. beschädigt sein kann. Daher deuten Zugriffsverletzungen fast immer auf schwerwiegende Programmierfehler hin. Eine AccessViolationException-Ausnahme identifiziert eindeutig diese schwerwiegenden Fehler.

In Programmen, die vollständig aus überprüfbarem verwaltetem Code bestehen, sind alle Verweise entweder gültig oder NULL, und Zugriffsverletzungen sind unmöglich. Wenn ein Vorgang versucht, in überprüfbarem Code einen Nullverweis herzustellen, wird eine NullReferenceException-Ausnahme ausgelöst. Eine AccessViolationException-Ausnahme tritt nur auf, wenn überprüfbarer verwalteter Code mit nicht verwaltetem Code oder mit unsicherem verwaltetem Code interagiert.

Behandeln von Problemen mit AccessViolationException-Ausnahmen

Eine AccessViolationException-Ausnahme kann nur in unsicherem verwaltetem Code oder bei der Interaktion von überprüfbarem verwaltetem Code mit nicht verwaltetem Code:

  • Eine Zugriffsverletzung, die in unsicherem verwaltetem Code auftritt, kann je nach Plattform entweder als NullReferenceException-Ausnahme oder als AccessViolationException-Ausnahme ausgedrückt werden.
  • Eine Zugriffsverletzung in nicht verwaltetem Code, der an verwalteten Code übergeben wird, ist immer mit einer AccessViolationException-Ausnahme umschlossen.

In beiden Fällen können Sie die Ursache der AccessViolationException-Ausnahme wie folgt identifizieren und korrigieren:

  • Stellen Sie sicher, dass der Arbeitsspeicher, auf den Sie zugreifen möchten, zugeordnet wurde. Eine AccessViolationException-Ausnahme wird immer ausgelöst, wenn versucht wird, auf geschützten Speicher zuzugreifen, d. h. auf Speicher, der nicht zugeordnet ist oder nicht zu einem Prozess gehört.

    Bei der automatischen Speicherverwaltung handelt es sich um einen Dienst, der von der .NET-Runtime zur Verfügung gestellt wird. Wenn verwalteter Code die gleiche Funktionalität wie Ihr nicht verwalteter Code bereitstellt, können Sie zu verwaltetem Code wechseln, um diese Funktionalität nutzen zu können. Weitere Informationen finden Sie unter Automatic Memory Management.

  • Stellen Sie sicher, dass der Arbeitsspeicher, auf den Sie zugreifen möchten, nicht beschädigt wurde. Wenn mehrere Lese- und Schreibvorgänge über fehlerhafte Zeiger erfolgt sind, kann der Arbeitsspeicher beschädigt sein. Dies tritt in der Regel beim Lesen oder Schreiben in Adressen außerhalb eines vordefinierten Puffers auf.

AccessViolationException und Try/Catch-Blöcke

AccessViolationException-Ausnahmen, die von der .NET-Runtime ausgelöst werden, werden nicht von der catch-Anweisung in einem strukturierten Ausnahmehandler behandelt, wenn die Ausnahme außerhalb des von der Runtime reservierten Arbeitsspeichers auftritt. Um eine solche AccessViolationException-Ausnahme zu behandeln, wenden Sie das HandleProcessCorruptedStateExceptionsAttribute-Attribut auf die Methode an, in der die Ausnahme ausgelöst wird. Diese Änderung wirkt sich nicht auf AccessViolationException-Ausnahmen aus, die von Benutzercode ausgelöst werden und die weiterhin von einer catch-Anweisung abgefangen werden können.