AppDomain Entladen der übergeordneten AppDomain

8

Ich habe Probleme, etwas über meinen AppDomain.Unload(...) -Aufruf herauszufinden. Ich habe eine detaillierte Erklärung mit Code von meine frühere Frage . Wie sich herausstellt, habe ich ein paar Schritte durchgeführt, die ich anscheinend nicht tun muss. Ich bin jedoch ziemlich sicher, dass wenn eine AppDomain erstellt und dann in einer Sammlung gehalten wird:

%Vor%

... wenn Sie damit fertig sind, müssen Sie es entladen:

%Vor%

Entfernen Sie dann die Domain aus der Sammlung.

Beim Entladen der Domäne wird jedoch die gesamte Anwendung beendet. Wenn ich das Entladen entferne, ist alles in Ordnung ... und wir müssen einfach die Domäne aus der Sammlung entfernen. Aber ich befürchte, dass meine Kind-AppDomain wirklich nicht entladen wird. Es wird vielleicht irgendwann GC'd bekommen, aber das gibt mir keinen warmen Fuzzy.

Die untergeordnete AppDomain-Assembly (eine Windows Form-Anwendung) wird asynchron über eine Schnittstelle (IModule) gestartet, auf die in meiner Adapterklasse verwiesen wird, die MarshalByRefObject erbt. Ich frage mich, ob dieser Verweis auf IModule Start () (die die Plugin-Modul-Assembly implementiert) nicht ordnungsgemäß Marshalling (wegen meiner Implementierung). Wenn die Shutdown () -Methode aufgerufen wird, stirbt die gesamte Anwendung ab. Sollte ich meinem IModule stattdessen eine abstrakte Klasse geben, so sollte es auch MBR erben? Verwirrt ...

Nachdem ich meinen Code angesehen habe:

%Vor%

... meine Befürchtung ist, dass IModule eine Schnittstelle ist. Obwohl ich eine Instanz in einer untergeordneten Domäne erstelle, dringt die Assembly in meine Hauptanwendungsdomäne. Wenn ich versuche, die untergeordnete Domäne zu entladen, werden beide Domänen daher entladen. Wäre das korrekt? Und was wäre wahrscheinlich die beste Lösung, um Start () & amp; Stop () Methoden über das MBR (Adapter) -Objekt?

UPDATE: Siehe meine Antwort unten für Änderungen -
Okay, es gibt kein Leck - alles erbt MBR:

  1. Host: MarshalByRefObject - Instances der ModuleAdapter in einer neuen AppDomain
  2. ModuleAdapter: MarshalByRefObject - IModule-Schnittstelle, Schnittstellenmethoden (Start, Stop)
  3. MyModulePlugin: MarshalByRefObject - Anwendung.Run (myForm)

Mache ich noch etwas falsch? Ich habe mehrere Dinge ausprobiert und es scheint einfach falsch oder unvollständig zu sein. Wenn ich den ModuleAdapter zum Herunterfahren anrichte, ruft er AppDomain.Unload(AppDomain.CurrentDomain) auf und die Host-Domäne bleibt ebenfalls stehen. Ich bekomme immer noch einige Ausnahmen der ersten Chance beim Beenden der Anwendung. Aber das Formular (myForm) wurde angewiesen, .Close ().

Also, ich suche immer noch nach dem richtigen Weg, dies zu tun ...

    
IAbstract 19.02.2010, 06:25
quelle

1 Antwort

1

Wie ich vermutet habe, verursacht die Instanziierung mit der IModule-Schnittstelle in der primären Domäne ein Leck. Um das richtig zu machen:

%Vor%

wo ModuleAdapter MarshalByRefObject erbt. Dann:

%Vor%

Innerhalb der ModuleAdapter-Klasse:

%Vor%

Ich begrüße Kommentare oder zusätzliche Antworten für einen besseren Weg.

Nach dem Verschieben der Instanziierung in die ModuleAdapter-Klasse haben wir immer noch das Problem, dass AppDomain.Unload die gesamte Anwendung beendet. Ich frage mich, ob dies daran liegt, dass wir im Modul-Plugin Application.Run(myForm) verwenden - wenn wir dann herunterfahren, rufen wir myForm.Close () auf. Offensichtlich beendet dies die Anwendung, so dass ich mich fragte, ob myForm.Close () auch die AppDomain "entlädt".

    
IAbstract 22.02.2010, 15:45
quelle

Tags und Links