.net - try - 처리되지 않은 'system.accessviolationexception' 형식의 예외가 system.windows.forms.dll에서 발생했습니다.




.NET에서 액세스 위반 예외를 catch 할 수 있습니까? (4)

예.

App.confg에서 <configuration> 태그 내에 다음 코드를 입력하십시오.

<runtime>
    <legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>

이제 다른 것과 마찬가지로 손상된 상태 예외 (CSE)를 catch 할 수 있어야합니다.

참고 : 이미 런타임 태그가있는 경우 <legacyCorruptedStateExceptionsPolicy enabled="true"/> 를 간단히 추가하십시오

위의 .Net 4.5에서 작동합니다.

AccessViolationException 을 잡을 수있는 방법이 있습니까? 그것은 통제하지 않는 관리되지 않는 DLL에 의해 throw됩니다.


try-catch 블록을 사용하여 관리되지 않는 DLL에 대한 호출을 래핑 할 수 있습니다. AccessViolationExceptions 은 정상적으로 발견 될 수 있습니다. 다음 코드를 실행하면 두 메시지가 모두 표시됩니다.

try
{
    throw new AccessViolationException();
}
catch (Exception e)
{
    MessageBox.Show(e.Message + e.StackTrace, e.Message, MessageBoxButtons.OK, MessageBoxIcons.Error);
}
MessageBox.Show("Still running..");

편집 : .NET 4는 동작변경을 도입했습니다. 런타임에 특별히 "ask" 않는 "ask" 않는 한 손상된 상태 예외를 catch하는 것이 더 이상 가능하지 않습니다.


당신은해서는 안됩니다. 액세스 위반은 심각한 문제입니다. 예기치 않은 잘못된 메모리 주소에 쓰거나 읽는 것입니다. John이 이미 설명했듯이 액세스 위반이 발생하기 전에 관리되지 않는 DLL이 이미 프로세스 메모리를 손상시킬 수 있습니다. 이것은 현재 프로세스의 어느 부분에서나 예측할 수없는 영향을 미칠 수 있습니다.

가장 안전한 방법은 사용자에게 알리고 즉시 종료하는 것입니다.

몇 가지 세부 정보 : 액세스 위반은 운영 체제 예외 (소위 SEH 또는 구조적 예외 처리 예외)입니다. 이것은 System.Exception 에서 관리되는 CLR 예외와 다른 종류의 예외입니다. SEH 예외는 순수하게 관리되는 코드로 거의 볼 수 없지만 관리되지 않는 코드와 같이 발생하는 경우 CLR은이를 관리 코드에 전달하여 사용자가이를 잡을 수 있습니다 1 .

그러나 SEH 예외를 잡는 것은 좋은 생각이 아닙니다. 자세한 내용은 다음 텍스트를 가져온 MSDN 매거진의 손상된 상태 예외 처리 문서에서 설명합니다.

CLR은 프로그램 자체에서 발생하는 예외와 동일한 메커니즘을 사용하여 SEH 예외를 관리 코드에 항상 전달했습니다. 이는 코드가 합리적으로 처리 할 수없는 예외적 인 조건을 처리하지 않는 한 문제가되지 않습니다. 대부분의 프로그램은 액세스 위반 후 안전하게 계속 실행할 수 없습니다. 유감스럽게도 CLR의 예외 처리 모델은 프로그램이 System.Exception 계층 구조의 맨 위에있는 예외를 잡아 내도록 허용하여 사용자가 이러한 심각한 오류를 포착하도록 항상 권장했습니다. 그러나 이것은 거의 할 일이 아닙니다.

1 이것은 .NET 3.5까지는 사실이었습니다. .NET 4에서는 동작이 변경되었습니다. 이러한 종류의 예외를 계속 catch하려면 legacyCorruptedStateExceptionsPolicy=true 를 app.config에 추가해야합니다. 위의 링크 된 articled에 대한 자세한 내용.


우선 0xA3으로 완전히 대답합니다. 그러나 방법이 없다면 더러운 관리되지 않는 dll을 자체 프로세스로 래핑하고 IPC (TCP / IP, namedpipes 등)를 통해 데이터를 전송할 수 있습니다. 모든 예외 사항을 파악하고 호스트 프로세스에 알립니다. 따라서 호스트 프로세스는 대부분 메모리 손상으로부터 보호됩니다.





unmanaged