Udostępnij za pośrednictwem


System.AccessViolationException, klasa

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

Naruszenie dostępu występuje w niezarządzanym lub niebezpiecznym kodzie, gdy kod próbuje odczytać lub zapisać w pamięci, która nie została przydzielona lub do której nie ma dostępu. Dzieje się tak zwykle, ponieważ wskaźnik ma złą wartość. Nie wszystkie operacje odczytu lub zapisu za pośrednictwem nieprawidłowych wskaźników prowadzą do naruszeń dostępu, dlatego naruszenie dostępu zwykle wskazuje, że wystąpiło kilka odczytów lub zapisów za pośrednictwem nieprawidłowych wskaźników i że pamięć może być uszkodzona. W związku z tym naruszenia dostępu prawie zawsze wskazują poważne błędy programowania. Wyraźnie AccessViolationException identyfikuje te poważne błędy.

W programach składających się całkowicie z weryfikowalnego kodu zarządzanego wszystkie odwołania są prawidłowe lub mają wartość null, a naruszenia dostępu są niemożliwe. Każda operacja, która próbuje odwołać się do odwołania do wartości null w weryfikowalnym kodzie, NullReferenceException zgłasza wyjątek. Występuje AccessViolationException tylko wtedy, gdy weryfikowalny kod zarządzany wchodzi w interakcję z niezarządzanym kodem lub niebezpiecznym kodem zarządzanym.

Rozwiązywanie problemów z wyjątkami AccessViolationException

Wyjątek AccessViolationException może wystąpić tylko w niebezpiecznym kodzie zarządzanym lub gdy kod zarządzany z możliwością zweryfikowania współdziała z kodem niezarządzanym:

W obu przypadkach można zidentyfikować i poprawić przyczynę wyjątku AccessViolationException w następujący sposób:

  • Upewnij się, że przydzielono pamięć, do której próbujesz uzyskać dostęp. Wyjątek AccessViolationException jest zawsze zgłaszany przez próbę uzyskania dostępu do chronionej pamięci — czyli w celu uzyskania dostępu do pamięci, która nie jest przydzielona lub nie jest własnością procesu.

    Automatyczne zarządzanie pamięcią jest jedną z usług zapewnianych przez środowisko uruchomieniowe platformy .NET. Jeśli kod zarządzany udostępnia te same funkcje co niezarządzany kod, możesz przejść do kodu zarządzanego, aby korzystać z tej funkcji. Aby uzyskać więcej informacji, zobacz Automatyczne zarządzanie pamięcią.

  • Upewnij się, że pamięć, do której próbujesz uzyskać dostęp, nie została uszkodzona. Jeśli wystąpiło kilka operacji odczytu lub zapisu za pomocą nieprawidłowych wskaźników, pamięć może być uszkodzona. Zwykle występuje to podczas odczytywania lub zapisywania adresów poza wstępnie zdefiniowanym buforem.

AccessViolationException i bloki try/catch

AccessViolationException wyjątki zgłaszane przez środowisko uruchomieniowe platformy .NET nie są obsługiwane przez catch instrukcję w programie obsługi wyjątków ustrukturyzowanych, jeśli wyjątek występuje poza pamięcią zarezerwowaną przez środowisko uruchomieniowe. Aby obsłużyć taki AccessViolationException wyjątek, zastosuj HandleProcessCorruptedStateExceptionsAttribute atrybut do metody, w której zgłaszany jest wyjątek. Ta zmiana nie ma wpływu na AccessViolationException wyjątki zgłaszane przez kod użytkownika, co może być nadal przechwytywane przez instrukcję catch .