Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Ein Zugriffsverstoß tritt in nicht verwalteten oder unsicheren Code auf, wenn der Code versucht, nicht zugewiesenen Speicher zu lesen oder in den Speicher zu schreiben, auf den er keinen Zugriff hat. Dies tritt in der Regel auf, da ein Zeiger einen ungültigen Wert aufweist. Nicht alle Lesevorgänge oder Schreibvorgänge durch fehlerhafte Zeiger führen zu Zugriffsverletzungen, daher weist eine Zugriffsverletzung in der Regel darauf hin, dass mehrere Lese- oder Schreibvorgänge durch fehlerhafte Zeiger aufgetreten sind und dass der Speicher beschädigt sein könnte. So deuten Zugriffsverletzungen fast immer auf schwerwiegende Programmierfehler hin. Eine AccessViolationException identifiziert diese schwerwiegenden Fehler eindeutig.
In Programmen, die vollständig aus überprüfbarem verwaltetem Code bestehen, sind alle Verweise entweder gültig oder null, und Zugriffsverletzungen sind unmöglich. Jeder Vorgang, der versucht, auf einen Nullverweis im nachweisbaren Code zu verweisen, löst eine NullReferenceException Ausnahme aus. Ein AccessViolationException Ereignis tritt nur auf, wenn überprüfbarer verwalteter Code mit nicht verwaltetem Code oder mit unsicherem verwaltetem Code interagiert wird.
Fehlerbehebung von AccessViolationException-Ausnahmen
Eine AccessViolationException Ausnahme kann nur in unsicherem verwaltetem Code auftreten oder wenn überprüfbarer verwalteter Code mit nicht verwaltetem Code interagiert wird:
- 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, die bis zu verwaltetem Code an die Oberfläche dringt, wird immer in eine AccessViolationException Ausnahme eingeschlossen.
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, zugewiesen wurde. Eine AccessViolationException Ausnahme wird immer ausgelöst, indem versucht wird, auf geschützten Speicher zuzugreifen, d. h. auf den nicht zugeordneten Speicher zuzugreifen oder der nicht im Besitz eines Prozesses ist.
Die automatische Speicherverwaltung ist einer der Dienste, die von der .NET-Laufzeit bereitgestellt werden. Wenn verwalteter Code die gleiche Funktionalität wie Ihr nicht verwalteter Code bietet, sollten Sie in Betracht ziehen, zu verwaltetem Code zu wechseln, um diese Funktionalität nutzen zu können. Weitere Informationen finden Sie unter "Automatische Speicherverwaltung".
Stellen Sie sicher, dass der Arbeitsspeicher, auf den Sie zugreifen möchten, nicht beschädigt wurde. Wenn mehrere Lese- oder Schreibvorgänge durch fehlerhafte Zeiger aufgetreten sind, ist der Arbeitsspeicher möglicherweise beschädigt. 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-Laufzeit ausgelöst werden, werden nicht von der catch Anweisung in einem strukturierten Ausnahmehandler behandelt, wenn die Ausnahme außerhalb des von der Laufzeit reservierten Arbeitsspeichers auftritt.
.NET Framework nur: Um eine AccessViolationException solche 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 weiterhin von einer catch Anweisung abgefangen werden können.
Vorsicht
Das HandleProcessCorruptedStateExceptions-Attribut ist in den aktuellen .NET-Versionen veraltet. Die Wiederherstellung von beschädigten Prozessstatus-Ausnahmen wird nicht unterstützt, und das Attribut, falls vorhanden, wird ignoriert.