Frage

Ich bin mit einem COM-Objekt (MODI) von innerhalb meiner .net-Anwendung. Die Methode, die ich anrufen bin wirft einen System.AccessViolationException, die von Visual Studio abgefangen wird. Das Merkwürdige ist, dass ich meinen Anruf in einem Try-Catch gewickelt haben, die Handler für Access, COMException und alles andere, aber wenn Visual Studio (2010) fängt den Access, der Debugger bricht auf dem Methodenaufruf (doc.OCR), und wenn ich Schritt durch, geht es weiter zur nächsten Zeile an Stelle des Rastblock eingeben. Außerdem, wenn ich diese außerhalb des Visual Studio betreibe meine Anwendung abstürzt. Wie kann ich diese Ausnahme behandeln, die im COM-Objekt geworfen wird?

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();

}
War es hilfreich?

Lösung

In .NET 4.0, die Runtime-Griffen bestimmten Ausnahmen der als Windows-Structured Error Handling (SEH) Fehler als Indikatoren für Verdorbene Staat. Diese verderbten State Exceptions (CSE) werden nicht von Ihrem Standard-verwalteten Code gefangen werden dürfen. Ich werde nicht in die, warum bekommen oder wie hier ist. Lesen Sie diesen Artikel über CSE in .NET Framework 4.0:

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

Aber es gibt Hoffnung. Es gibt ein paar Möglichkeiten, dies zu umgehen:

  1. Recompile als .NET 3.5 Montage und führen Sie es in .NET 4.0.

  2. Fügen Sie eine Zeile zu Ihrer Anwendung Config-Datei unter der Konfiguration / runtime Element: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. Dekorieren Sie die Methoden, die Sie diese Ausnahmen in der HandleProcessCorruptedStateExceptions Attribut fangen wollen. Siehe http://msdn.microsoft.com/en-us/magazine/ dd419661.aspx # id0070035 .


Bearbeiten

Bisher ich referenzierten ein Forum posten für weitere Details. Aber da Microsoft Connect in den Ruhestand getreten sind, hier sind die zusätzlichen Details, falls Sie interessiert sind:

Von Gaurav Khanna, ein Entwickler von dem Microsoft CLR Team

  

Dieses Verhalten ist von Entwurf aufgrund einer Funktion des CLR 4.0 genannt verderbten State Exceptions. Einfach ausgedrückt, sollte nicht verwalteten Code, einen Versuch zu fangen Ausnahmen machen, die beschädigten Prozesszustand und AV zeigen ist einer von ihnen.

Er geht dann auf die Dokumentation auf der zu referenzieren HandleProcessCorruptedStateExceptionsAttribute und der oben genannte Artikel. Es genügt zu sagen, es ist auf jeden Fall lesenswert, wenn Sie diese Art von Ausnahmen fangen erwägen.

Andere Tipps

Fügen Sie die folgende in der Konfigurationsdatei, und es wird in Try-Catch-Block abgefangen werden. Ein Wort der Warnung ... versuchen, diese Situation zu vermeiden, da dies bedeutet, eine Art von Verletzung passiert.

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

Zusammengestellt von oben Antworten, für mich gearbeitet, hat wie folgt zu fangen.

Schritt # 1 - In der Config-Datei folgende Schnipsel

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

Schritt # 2

Add -

[HandleProcessCorruptedStateExceptions]

[SecurityCritical]

auf der Oberseite der Funktion, die Sie fangen sind binden die Ausnahme

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

Sie können mit versuchen AppDomain.UnhandledException sehen und wenn, mit dem Sie es zu fangen.

** EDIT *

Hier finden Sie einige weitere Informationen die nützlich sein könnten (es ist eine lange lesen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top