Laden...

Instanz einer Klasse in anderer AppDomain erstellen und benutzen

Erstellt von Beatsteak vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.440 Views
B
Beatsteak Themenstarter:in
22 Beiträge seit 2008
vor 13 Jahren
Instanz einer Klasse in anderer AppDomain erstellen und benutzen

Hallo zusammen,

ich kämpfe gerade mit AppDomains und habe folgendes Problem:

Ich möchte einen Teil meiner Anwendung, in eine eigene AppDomain auslagern,
da in diesem Teil unter Umständen kritischer (Fremd-)Code ausgeführt werden kann, welcher die Anwendung zum stehen bringen kann, da dort mit der COM-Welt interagiert wird...

Eigentlich möchte ich nur eine Instanz einer bestimmten Klasse in einer anderen AppDomain erstellen und Funktionen dieser Klasse ausführen. Dafür habe ich eine RemoteProxy Klasse erstellt, welche von **MarshalByRefObj **abgeleitet ist und in dieser Proxy Klasse wird die eigentliche Instanz erzeugt und Funktionen ausgeführt.

Jedoch bekomme ich die ProxyKlasse nicht mit

[newAppDomain].CreateInstanceAndUnwrap(...)

erstellt, da nicht alle Typen (meiner "eigentlichen" Klasse serialisierbar sind. Diese Klasse verwendet auch Typen aus externen Bibliotheken, welche ich nicht "Serializable" deklarieren kann.

Kenn jemand eine Möglichkeit, wie ich dieses Problem umgehen/beheben kann?

Danke schonmal!

B
387 Beiträge seit 2005
vor 13 Jahren

Hi Beatsteak,

ich kann dir zwar jetzt auf die schnelle keinen Code dazu bereitstellen, aber deine Klassen müssen nicht all Serialisierbar sein, damit du sie in eine andere AppDomain auslagern kannst. Einzig die Objekte, mit denen du zwischen den AppDomains kommunizierst.

Ich hab sowas vor 3 Jahren einmal umgesetzt, und kann mich jetzt auch nicht mehr an jedes Detail erinnern. Das Prody-Objekt selbst ist meines wissen relativ dumm, es enthält lediglich ein Interface als Member. Über das Interface wird auf das externe Modul zugegriffen (und das dahinterstehende Objekte ist in der anderen AppDomain). Zusätzlich habe ich immer einen eigenen Thread in der anderen AppDomain laufen lasse - ist aber kein muss, glaube ich.

Aber mal eine andere Frage: Du sagst, du willst das machen, weil du sonst Probleme mit COM Komponenten hast? Meines Wissens dürfte es für COM keine AppDomain Grenzen geben, daher wird dir eine eigene AppDomain unter Umständen nicht einmal was bringen.

Gruß

3.971 Beiträge seit 2006
vor 13 Jahren

Du sagst, du willst das machen, weil du sonst Probleme mit COM Komponenten hast? Meines Wissens dürfte es für COM keine AppDomain Grenzen geben

Gibts auch nicht, C(++) und die WinAPI kennen keine AppDomains. Allerdings wird es zu fehlern kommen, wenn es sich um STA COM Objekt handelt. Hier darf der Zugriff auf das COM Objekt nur von einem Thread aus erfolgen.

Objekte die mittels Remoting übertragen werden sollen (auch bei AppDomains) müssen entweder von MarshalByRefObject abgeleitet sein (Referenztyp Verhalten) oder aber serialisierbar sein (Werttyp Verhalten).

Ist keines von beiden gegeben, kommt es zu einem Laufzeitfehler. Um das zu Lösen,musst du für jede zu übertragende Klasse einen Wrapper schreiben, der entweder von MarshalByRef abgeleitet ist oder eben ISerializable implementiert.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

B
Beatsteak Themenstarter:in
22 Beiträge seit 2008
vor 13 Jahren

Aber mal eine andere Frage: Du sagst, du willst das machen, weil du sonst Probleme mit COM Komponenten hast? Meines Wissens dürfte es für COM keine AppDomain Grenzen geben, daher wird dir eine eigene AppDomain unter Umständen nicht einmal was bringen.

Ich will ja nicht direkt mit den COM Objekten arbeiten, von daher müsste mein Ansatz mit der AppDomain klappen.

Der Kontext ist etwas schwer zu erklären, ich versuch mal stark zu abstrahieren und vereinfachen:

Meine Anwendung erzeugt momentan eine Klasse, in dieser Klasse wird sozusagen
eine "Ausführung" gestartet und gewartet, bis diese "Ausführung" zu Ende ist.
In dieser "Ausführung" können z.B. COM Komponenten geladen werden, DB-Verbindungen etc, auf die meine Anwendung aber keinen Einfluss hat bzw. meine Anwendung weiß nicht, was während dieser Ausführung passiert.

Nach dem Beenden dieser "Ausführung" zerstör ich die Klasse wieder, und meine Applikation beendet sich oder oder sie startet die "Ausführung ein zweites mal oder oder oder...

Jetzt möchte ich gerne die oben genannte Ausführung in eine anderen AppDomain auslagern, sozusagen in einer eigenen Sandbox, weil ich halt eben nicht weiß, was währen der Ausführung so abgeht und ich möchte auf keinen Fall, das es meine Anwendung behindert, das ist der Kontext.

Was ich momentan Versucht habe ist, für meine oben genannte Klasse eine Wrapper Klasse zu erzeugen, welche von MarshalByRef abgeleitet ist, von dieser Klasse lasse ich mir mit

[AppDomain].CreateInstanceAndUnwrap(...)

eine Instanz geben.
In dieser Wrapper Klasse soll dann die "Ausführung" in eine anderen Appdomain gestartet werden.