Question

J'utilise un objet COM (MODI) à partir de mon application .net. La méthode que je fais appel jette un System.AccessViolationException, qui est intercepté par Visual Studio. La chose étrange est que je l'ai enveloppé mon appel dans une prise d'essai, qui a des gestionnaires pour AccessViolationException, COMException et tout le reste, mais quand Visual Studio (2010) intercepte le AccessViolationException, les pauses de débogage sur l'appel de méthode (doc.OCR), et si je fais un pas à travers, il continue à la ligne suivante au lieu d'entrer dans le bloc de prises. De plus, si je lance ce en dehors du studio visuel ma plante application. Comment puis-je gérer cette exception qui est jeté dans l'objet 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();

}
Était-ce utile?

La solution

Dans .NET 4.0, les poignées d'exécution de certaines exceptions soulevées comme des erreurs de Windows Error Handling structuré (SEH) comme indicateurs de Corrupted État. Ces exceptions Corrupted l'Etat (CSE) ne sont pas autorisés à être pris par votre code standard géré. Je ne vais pas entrer dans le pourquoi ou comment est ici. Lire cet article sur le CST est dans le .NET Framework 4.0:

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

Mais il y a espoir. Il y a quelques façons de contourner ce problème:

  1. recompilation comme un assemblage .NET 3.5 et l'exécuter dans .NET 4.0.

  2. Ajouter une ligne à votre fichier de configuration de l'application sous l'élément configuration / exécution: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. ornez les méthodes que vous voulez capturer ces exceptions avec l'attribut HandleProcessCorruptedStateExceptions. Voir http://msdn.microsoft.com/en-us/magazine/ dd419661.aspx # id0070035 pour plus de détails.


EDIT

Auparavant, je fait référence à une après le forum pour plus de détails. Mais depuis que Microsoft Connect a été retiré, voici les détails supplémentaires au cas où vous êtes intéressé:

De Gaurav Khanna, un développeur de l'équipe Microsoft CLR

  

Ce comportement est dû à une caractéristique de 4,0 CLR appelées exceptions Corrupted État. Autrement dit, le code managé shouldnt faire une tentative d'exceptions de capture qui indiquent l'état du processus corrompu et AV est l'un d'entre eux.

Il continue alors de faire référence à la documentation sur le HandleProcessCorruptedStateExceptionsAttribute et l'article ci-dessus. Qu'il suffise de dire, il vaut vraiment la peine d'être lu si vous envisagez d'attraper ces types d'exceptions.

Autres conseils

Ajoutez les lignes suivantes dans le fichier de configuration, et il sera pris dans essayer bloc catch. Mise en garde ... essayez d'éviter cette situation, car cela signifie une sorte de violation se passe.

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

Compilé à partir des réponses ci-dessus, a travaillé pour moi, est-ce en suivant les étapes de l'attraper.

Étape # 1 - Ajouter suivant extrait dans le fichier de configuration

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

Étape # 2

Ajoutez -

[HandleProcessCorruptedStateExceptions]

[SecurityCritical]

sur la partie supérieure de la fonction que vous liez Intercepter l'exception

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

Vous pouvez essayer d'utiliser AppDomain.UnhandledException et voir si cela vous permet de l'attraper.

** EDIT *

Voici quelques plus d'informations qui pourraient être utiles (c'est une lecture longue).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top