System.AccessViolationException 類別

本文提供此 API 參考文件的補充備註。

當程式代碼嘗試讀取或寫入尚未配置的記憶體或沒有存取權的記憶體時,存取違規會發生在 Unmanaged 或 unsafe 程式代碼中。 這通常會因為指標的值不正確而發生。 並非所有透過錯誤指標讀取或寫入的動作都會導致存取違規,因此存取違規通常指出已透過錯誤指標執行多次讀取或寫入,且該記憶體可能已毀損。 因此,存取違規幾乎一律表示嚴重的程式設計錯誤。 AccessViolationException清楚識別這些嚴重錯誤。

在完全由可驗證的Managed程式碼所組成的程式中,所有參考都是有效或 Null,而且存取違規是不可能的。 嘗試在可驗證程式代碼中參考 Null 參考的任何作業都會 NullReferenceException 擲回例外狀況。 AccessViolationException只有在可驗證的 Managed 程式代碼與 Unmanaged 程式代碼或不安全的 Managed 程式代碼互動時,才會發生 。

針對 AccessViolationException 例外狀況進行疑難解答

AccessViolationException只有在不安全的 Managed 程式代碼中,或當可驗證的 Managed 程式代碼與 Unmanaged 程式代碼互動時,才會發生例外狀況:

在這兩種情況下,您可以識別並更正例外狀況的原因 AccessViolationException ,如下所示:

  • 請確定您嘗試存取的記憶體已配置。 嘗試存取受保護的記憶體時,一 AccessViolationException 律會擲回例外狀況,也就是存取未配置或進程未擁有的記憶體。

    自動記憶體管理是 .NET 運行時間所提供的其中一項服務。 如果 Managed 程式代碼提供與 Unmanaged 程式代碼相同的功能,您可能想要移至 Managed 程式代碼,以利用這項功能。 如需詳細資訊,請參閱 Automatic Memory Management

  • 請確定您嘗試存取的記憶體尚未損毀。 如果透過錯誤的指標發生數個讀取或寫入作業,記憶體可能會損毀。 這通常會在讀取或寫入預先定義的緩衝區外部的位址時發生。

AccessViolationException 和 try/catch 區塊

AccessViolationException 如果例外狀況發生在運行時間保留的記憶體之外,.NET 運行時間擲回的例外狀況不會由 catch 結構化例外狀況處理程式中的 語句處理。 若要處理這類 AccessViolationException 例外狀況,請將 HandleProcessCorruptedStateExceptionsAttribute 屬性套用至擲回例外狀況的方法。 這項變更不會影響 AccessViolationException 使用者程式代碼擲回的例外狀況,語句可能會繼續攔截 catch