Pregunta

Estoy utilizando un objeto COM (MODI) desde dentro de mi aplicación .NET. El método que llamo lanza una System.AccessViolationException, que es interceptado por Visual Studio. Lo curioso es que he envuelto mi llamada en un intento de captura, que tiene controladores para AccessViolationException, COMException y todo lo demás, pero cuando Visual Studio (2010) intercepta la AccessViolationException, se rompe el depurador en la llamada al método (doc.OCR), y si me paso a través, continúa a la siguiente línea en lugar de entrar en el bloque de captura. Además, si me quedo esta fuera del estudio visual mi aplicación se bloquea. ¿Cómo puedo manejar esta excepción que se produce 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();

}
¿Fue útil?

Solución

En .NET 4.0, manejará el tiempo de ejecución de ciertas excepciones planteadas como errores de Windows estructurado Manejo de errores (SEH) como indicadores de estado dañado. Estas excepciones dañado el estado (CSE) no se les permite ser capturado por el código administrado estándar. No voy a entrar en la década de cómo o por qué está aquí. Lee este artículo sobre el CSE en .NET 4.0 Marco:

http://msdn.microsoft.com/en-us/ revista / dd419661.aspx # id0070035

Pero hay esperanza. Hay algunas maneras de evitar esto:

  1. Recompile como .NET 3.5 montaje y ejecutarlo en .NET 4.0.

  2. Añada una línea al archivo de configuración de la aplicación bajo el elemento de configuración / tiempo de ejecución: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. Decorar los métodos que se desea capturar estas excepciones con el atributo HandleProcessCorruptedStateExceptions. Ver http://msdn.microsoft.com/en-us/magazine/ dd419661.aspx # id0070035 para más detalles.


Editar

Anteriormente, hace referencia a un mensajes en el foro para obtener detalles adicionales. Pero desde Microsoft Connect ha sido retirado, aquí están los detalles adicionales en caso de que esté interesado:

A partir de Gaurav Khanna, un desarrollador del equipo de Microsoft CLR

  

Este comportamiento es por diseño debido a una característica de CLR 4.0 llaman excepciones dañado el estado. En pocas palabras, el código administrado no debería hacer un intento para capturar excepciones que indican el estado del proceso corrupto y AV es uno de ellos.

A continuación pasa a hacer referencia a la documentación sobre el HandleProcessCorruptedStateExceptionsAttribute y el artículo anterior. Basta con decir que es definitivamente vale la pena leer si está considerando la captura de estos tipos de excepciones.

Otros consejos

Agregue la siguiente en el archivo de configuración, y será atrapado en el bloque intento de captura. Una palabra de advertencia ... tratar de evitar esta situación, ya que esto significa algún tipo de violación está sucediendo.

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

Elaborado a partir de las respuestas anteriores, que funcionó para mí, no siguiendo los pasos de atraparlo.

Paso # 1 - Añadir siguiente fragmento de archivo de configuración

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

Paso # 2

Añadir -

[HandleProcessCorruptedStateExceptions]

[SecurityCritical]

en la parte superior de la función que está atando captura la excepción

Fuente: http: // www. gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html

Puede intentar usar AppDomain.UnhandledException y ver si se le permite ponerse a él.

EDITAR ** *

Aquí hay alguna más información que podría ser útil (es una lectura larga).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top