Condividi tramite


Classe System.AccessViolationException

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Una violazione di accesso si verifica in codice non gestito o non sicuro quando il codice tenta di leggere o scrivere in memoria che non è stato allocato o a cui non ha accesso. Ciò si verifica in genere perché un puntatore ha un valore non valido. Poiché non tutte le operazioni di lettura o scrittura tramite puntatori non validi generano violazioni di accesso, quando si verifica una violazione di accesso in genere significa che sono state eseguite numerose operazioni di lettura o scrittura tramite puntatori non validi e che la memoria potrebbe essere danneggiata. Pertanto, le violazioni di accesso quasi sempre indicano gravi errori di programmazione. Un AccessViolationException identifica chiaramente tali errori gravi.

Nei programmi costituiti interamente da codice gestito verificabile, tutti i riferimenti sono validi o null e le violazioni di accesso sono impossibili. Qualsiasi operazione che tenta di fare riferimento a un riferimento Null nel codice verificabile genera un'eccezione NullReferenceException . Si AccessViolationException verifica solo quando il codice gestito verificabile interagisce con codice non gestito o con codice gestito non sicuro.

Risolvere i problemi relativi alle eccezioni accessViolationException

Un'eccezione AccessViolationException può verificarsi solo in codice gestito non sicuro o quando il codice gestito verificabile interagisce con codice non gestito:

  • Una violazione di accesso che si verifica nel codice gestito non sicuro può essere espressa come NullReferenceException eccezione o AccessViolationException eccezione, a seconda della piattaforma.
  • Una violazione di accesso nel codice non gestito che si sposta fino al codice gestito viene sempre racchiusa in un'eccezione AccessViolationException .

In entrambi i casi, è possibile identificare e correggere la causa dell'eccezione AccessViolationException come indicato di seguito:

  • Assicurarsi che la memoria a cui si sta tentando di accedere sia stata allocata. Un'eccezione AccessViolationException viene sempre generata da un tentativo di accedere alla memoria protetta, ovvero per accedere alla memoria non allocata o che non è di proprietà di un processo.

    La gestione automatica della memoria è uno dei servizi offerti dal runtime .NET. Se il codice gestito fornisce la stessa funzionalità del codice non gestito, è possibile passare al codice gestito per sfruttare questa funzionalità. Per altre informazioni, vedere Automatic Memory Management.

  • Assicurarsi che la memoria a cui si sta tentando di accedere non sia danneggiata. Se sono state eseguite diverse operazioni di lettura o scrittura tramite puntatori non valido, la memoria potrebbe essere danneggiata. Ciò si verifica in genere durante la lettura o la scrittura in indirizzi esterni a un buffer predefinito.

AccessViolationException e blocchi try/catch

AccessViolationException Le eccezioni generate dal runtime .NET non vengono gestite dall'istruzione catch in un gestore di eccezioni strutturate se l'eccezione si verifica all'esterno della memoria riservata dal runtime. Per gestire tale AccessViolationException eccezione, applicare l'attributo HandleProcessCorruptedStateExceptionsAttribute al metodo in cui viene generata l'eccezione. Questa modifica non influisce sulle eccezioni AccessViolationException generate dal codice utente, che possono continuare a essere rilevate da un'istruzione catch.