Kann ich verhindern, dass eine nicht abgefangene Ausnahme in einer anderen AppDomain die Anwendung herunterfährt?

8

Ich habe Probleme mit einer fehlerhaften Bibliothek, die eine Ausnahme in einem Finalizer auslöst, was natürlich die Anwendung stürzt.

Um dies zu vermeiden, habe ich versucht, die Bibliothek in ihrer eigenen AppDomain zu laden, aber die Ausnahme sprudelt immer noch zur Oberfläche und stürzt die Anwendung ab.

Wie in MSDN dokumentiert, verhindert die Registrierung auf AppDomain.UnhandledException nicht, dass die Exception sprudelt, aber ich bin ziemlich überrascht, dass es keine andere Möglichkeit gibt, eine solche Exception in einer "Sub-Anwendungsdomäne" abzufangen >

Wie können Plug-in-Hosts oder Anwendungen, die AppDomains verwenden, um potenziell schädlichen Code in der Sandbox zu verteilen, unbehandelte Ausnahmen stoppen? Ist das tatsächlich möglich?

Hinweis : Ich habe bereits eine andere Problemumgehung, die beschriebene hier . Der schlechte Finalizer befindet sich auf einem langlebigen Objekt, das anscheinend nur während des Herunterfahrens erfasst wird. Es reicht also aus, diesen "falschen" Fehler vor dem Benutzer zu verbergen. Dennoch finde ich diese Problemumgehung spröde, da sie entweder andere, echte Fehler verdeckt oder das Risiko birgt, dass meine Anwendung aufgebläht wird, wenn das Objekt früher erfasst wird.

    
Mathieu Garstecki 11.10.2010, 12:44
quelle

2 Antworten

4

Eine AppDomain ist nett, da Sie den Programmstatus ablegen können, aber Sie haben immer noch das Problem, dass der Thread tot ist. Dass dies auf dem Finalizer-Thread passiert, ist fatal, die CLR wird den Prozess ohne Rückgriff abbrechen.

Die einzige "Lösung" besteht darin, diese Komponente in einem eigenen Prozess auszuführen. Sie können mit Process.Kill () in den Kopf schießen, um zu verhindern, dass der Finalizer-Thread beim Beenden des Prozesses ausgeführt wird. Verwenden Sie einen der Interprozess-Kommunikationsmechanismen, die von .NET unterstützt werden, um mit ihm zu kommunizieren. Ein Socket, Named Pipe, Remoting oder WCF. Viel Glück damit.

    
Hans Passant 11.10.2010, 13:53
quelle
0

Tatsächlich hat es sich in .NET 1.0 / 1.1 so verhalten, wie Sie es brauchen. Sie können dennoch zu diesem Verhalten zurückkehren, indem Sie diese Zeile innerhalb des Knotens "runtime" zur Anwendungskonfigurationsdatei hinzufügen:

%Vor%

Dies verhindert, dass eine nicht behandelte Ausnahme in einem anderen Thread den gesamten Prozess beendet.

    
Nissim 12.05.2011 09:52
quelle