Sdílet prostřednictvím


System.AccessViolationException – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

K narušení přístupu dochází v nespravovaném nebo nebezpečném kódu, když se kód pokusí číst nebo zapisovat do paměti, která nebyla přidělena nebo ke které nemá přístup. K tomu obvykle dochází, protože ukazatel má chybnou hodnotu. Ne všechny čtení nebo zápisy prostřednictvím chybných ukazatelů vedou k narušení přístupu, takže narušení přístupu obvykle značí, že došlo k několika čtením nebo zápisům prostřednictvím chybných ukazatelů a že paměť může být poškozena. Porušení přístupu tedy téměř vždy značí závažné chyby programování. Jasně AccessViolationException identifikuje tyto závažné chyby.

V programech, které se skládají zcela z ověřitelného spravovaného kódu, jsou všechny odkazy platné nebo null a porušení přístupu nejsou možná. Jakákoli operace, která se pokusí odkazovat na odkaz null v ověřitelném NullReferenceException kódu, vyvolá výjimku. K problému AccessViolationException dochází pouze v případě, že ověřitelný spravovaný kód komunikuje s nespravovaným kódem nebo s nebezpečným spravovaným kódem.

Řešení potíží s výjimkami AccessViolationException

K AccessViolationException výjimce může dojít pouze v nebezpečném spravovaném kódu nebo v případě, že ověřitelný spravovaný kód komunikuje s nespravovaným kódem:

  • Porušení přístupu, ke kterému dochází v nebezpečném spravovaném NullReferenceException kódu, může být vyjádřeno buď výjimkou, nebo AccessViolationException výjimkou v závislosti na platformě.
  • Porušení přístupu v nespravovaném kódu, který bubliny až do spravovaného kódu zabalí vždy do AccessViolationException výjimky.

V obou případech můžete identifikovat a opravit příčinu AccessViolationException výjimky následujícím způsobem:

  • Ujistěte se, že byla přidělena paměť, ke které se pokoušíte získat přístup. Výjimku AccessViolationException vždy vyvolá pokus o přístup k chráněné paměti – to znamená přístup k paměti, která není přidělena nebo která není vlastněna procesem.

    Automatická správa paměti je jednou ze služeb, které poskytuje modul runtime .NET. Pokud spravovaný kód poskytuje stejné funkce jako nespravovaný kód, můžete přejít na spravovaný kód, abyste mohli tuto funkci využít. Další informace naleznete v tématu Automatická správa paměti.

  • Ujistěte se, že paměť, ke které se pokoušíte získat přístup, nebyla poškozena. Pokud došlo k několika operacím čtení nebo zápisu chybnými ukazateli, může být paměť poškozena. K tomu obvykle dochází při čtení nebo zápisu na adresy mimo předdefinovanou vyrovnávací paměť.

AccessViolationException a bloky try/catch

AccessViolationException Výjimky vyvolané modulem runtime .NET nejsou zpracovávány příkazem catch v obslužné rutině strukturované výjimky, pokud k výjimce dochází mimo paměť vyhrazenou modulem runtime. Chcete-li takovou AccessViolationException výjimku zpracovat, použijte HandleProcessCorruptedStateExceptionsAttribute atribut na metodu, ve které je vyvolán výjimka. Tato změna nemá vliv na AccessViolationException výjimky vyvolané uživatelským kódem, které můžou být nadále zachyceny příkazem catch .