c# - Cómo manejar AccessViolationException
.net com (4)
Estoy usando un objeto COM (MODI) desde mi aplicación .net. El método que estoy llamando arroja System.AccessViolationException, que es interceptado por Visual Studio. Lo curioso es que he cerrado mi llamada en una captura de prueba, que tiene controladores para AccessViolationException, COMException y todo lo demás, pero cuando Visual Studio (2010) intercepta AccessViolationException, el depurador se rompe en la llamada al método (doc.OCR), y si paso, continúa a la siguiente línea en lugar de ingresar al bloque catch. Además, si ejecuto esto fuera del estudio visual mi aplicación se bloquea. ¿Cómo puedo manejar esta excepción que se lanza dentro del objeto COM?
MODI.Document doc = new MODI.Document();
try
{
doc.Create(sFileName);
try
{
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
sText = doc.Images[0].Layout.Text;
}
catch (System.AccessViolationException ex)
{
//MODI seems to get access violations for some reason, but is still able to return the OCR text.
sText = doc.Images[0].Layout.Text;
}
catch (System.Runtime.InteropServices.COMException ex)
{
//if no text exists, the engine throws an exception.
sText = "";
}
catch
{
sText = "";
}
if (sText != null)
{
sText = sText.Trim();
}
}
finally
{
doc.Close(false);
//Cleanup routine, this is how we are able to delete files used by MODI.
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
doc = null;
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
Agregue lo siguiente en el archivo de configuración, y quedará atrapado en el bloque try catch. Palabra de advertencia ... trate de evitar esta situación, ya que esto significa que está ocurriendo algún tipo de violación.
<configuration>
<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true" />
</runtime>
</configuration>
Compilado a partir de las respuestas anteriores, funcionó para mí, hizo los siguientes pasos para atraparlo.
Paso # 1 - Agregue el siguiente fragmento de código al archivo de configuración
<configuration>
<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true" />
</runtime>
</configuration>
Paso 2
Agregar -
[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
en la parte superior de la función que está atando atrapar la excepción
fuente: http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html
En .NET 4.0, el tiempo de ejecución maneja ciertas excepciones planteadas como errores de manejo de errores estructurados de Windows (SEH) como indicadores de estado dañado. Estas Excepciones de estado dañado (CSE) no pueden ser atrapadas por su código administrado estándar. No entraré en el por qué o cómo está aquí. Lea este artículo sobre CSE en .NET 4.0 Framework:
http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035
Pero hay esperanza. Hay algunas formas de evitar esto:
Vuelva a compilar como un ensamblado .NET 3.5 y ejecútelo en .NET 4.0.
Agregue una línea al archivo de configuración de la aplicación en el elemento de configuración / tiempo de ejecución:
<legacyCorruptedStateExceptionsPolicy enabled="true|false"/>
Decore los métodos con los que desea capturar estas excepciones con el atributo
HandleProcessCorruptedStateExceptions
. Consulte http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 para obtener detalles.
Para obtener más información: http://connect.microsoft.com/VisualStudio/feedback/details/557105/unable-to-catch-accessviolationexception
Puedes intentar usar AppDomain.UnhandledException y ver si eso te permite atraparlo.
**EDITAR*
Aquí hay más información que podría ser útil (es una lectura larga).