Können nicht behandelte Ausnahmen in Child-AppDomains daran gehindert werden, den Hauptprozess abzustürzen?

8

Ich schreibe eine kleine Plugins-Bibliothek, die App-Domains verwendet, um Plugins mit .Net Framework 4.0 zu isolieren. Daher ist der Code, der in jedem Plugin steckt, nicht in meiner Kontrolle. Wenn eine unbehandelte Ausnahme in einem der Plugins ausgelöst wird, habe ich beobachtet, dass die Ergebnisse irgendwie gemischt sind. Sie sind wie folgt.

Wenn die unbehandelte Ausnahme im Hauptthread des Plugins ausgelöst wird, kann die ausführbare Hauptanwendung, die die execute-Methode des Plugins aufruft, sie sauber fangen und handhaben. Keine Probleme dort. Jedoch,

  1. Wenn das Plugin eine Nachrichtenschleife für eine WinForms-basierte App in der Execute-Methode des Plugins startet und eine unbehandelte Ausnahme in der WinForm-Anwendung (dh in einem Formular) ausgelöst wird, kann die Pluggable-App nur die Ausnahme abfangen von innerhalb des Visual Studio Debuggers laufen. Andernfalls (wenn sie außerhalb von VS aufgerufen wird) stürzt die Plug-in-App mit den Plugins ab.

  2. Wenn die nicht behandelte Ausnahme in einem separaten Thread ausgelöst wird, der von der Execute-Methode des Plug-Ins erzeugt wird, hat die Pluggable-App keine Chance, die Ausnahme abzufangen und stürzt ab.

Ich habe ein einfaches VS 2010-Projekt erstellt, um dieses Verhalten unter dem folgenden Link zu simulieren. Ссылка

Darin sieht die Hauptmethode in der Pluggable-App so aus

%Vor%

Dies ist der Code für das Plugin-Projekt. Es erbt von der PluginBase-Klasse im Pluggable-App-Projekt oben.

%Vor%

Schließlich ist dies der Code aus dem Formular im Plugin

%Vor%

Wie kann ich verhindern, dass der Hauptprozess aufgrund der beiden oben genannten Szenarien (1 und 2) beendet wird?

Vielen Dank im Voraus.

    
Harindaka 29.06.2011, 12:46
quelle

1 Antwort

1

Zur Behandlung der WinForms-Ausnahme. Sie könnten "trap" für solche ThreadExceptions in der PluginBase-Klasse setzen:

%Vor%

Standardmäßig wird Ihnen "Das Ausnahmefenster" angezeigt. Aber wird zu diesem Handler kommen, wenn er zur Verfügung gestellt wird.

Wie für das Abfangen von Ausnahme von anderem Thread. Es gibt keine Möglichkeit. Das Beste, was Sie tun können, ist eine Benachrichtigung über das Auslösen einer Ausnahme.

%Vor%     
DiVan 30.06.2011, 07:13
quelle