c# - Por qué.NET4.0 no puede capturar AccessViolationException
c++ access-violation (2)
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 cualquier cosa cuando se lance una excepción de estado corrupto. Prácticamente no hay razón para querer que un proceso con estado dañado continúe ejecutándose.
Para la 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 .
Es realmente interesante que el siguiente código de C # se bloquee en .NET4.0 pero funcione bien en .NET2.0.
Código C #
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 compila el código C # anterior contra .NET2.0, todo funciona bien. Solo compilarlo contra .NET4.0 lo hará fallar en el tiempo de ejecución.
Sospecho que el mecanismo de captura de excepciones del sistema ha cambiado desde .NET4.0. ¿Algunas ideas?
[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;
}