Por qué AccessViolationException no puede ser capturado por .NET4.0

Es realmente interesante que el siguiente código C # se bloqueará en .NET4.0 pero funcionará correctamente en .NET2.0.

C # code

class Program { static void Main(string[] args) { try { ExceptionTest(); Console.WriteLine("Done!"); } catch (Exception e) { Console.WriteLine("Error !!!"); Console.WriteLine(e.Message); } } [DllImport("badapp")] private static extern int ExceptionTest(); } 

Código C ++

 extern "C" __declspec(dllexport) int ExceptionTest() { IUnknown* pUnk = NULL; pUnk->AddRef(); return 0; } 

Si comstack el código C # anterior contra .NET2.0, todo funciona bien. Solo comstackrlo contra .NET4.0 lo hará bloquearse en tiempo de ejecución.

Sospecho que el mecanismo de captura de excepción del sistema ha sido cambiado desde .NET4.0. ¿Algunas ideas?

Sí, cambió en .NET 4. No puede detectar excepciones que indiquen un estado dañado. Esto se debe a que prácticamente no hay garantía de que pueda hacer nada en absoluto cuando se produce una excepción de estado dañado. Prácticamente no hay ninguna razón para querer que un proceso con estado dañado continúe ejecutándose.

Para compatibilidad con código anterior, puede cambiar este comportamiento agregando el elemento legacyCorruptedStateExceptionsPolicy a app.config.

También puede hacerlo caso por caso marcando los métodos en los que desea capturar estas excepciones con el atributo HandleProcessCorruptedStateExceptions .

  [HandleProcessCorruptedStateExceptions] public static unsafe int LenghtPoint(this IntPtr point) { //por optimizar byte* bytePoint = (byte*)point.ToPointer(); byte auxByte; int length = 1; bool encontrado = false; while (!encontrado) { try { auxByte = bytePoint[length]; length++; } catch (System.AccessViolationException) { length--; encontrado = true; } } return length; } 
Intereting Posts