Umgehung .net Anwendungsdomäne nur das Bewegen von Objekten von Wert
-
11-07-2019 - |
Frage
Ich entwickle eine .net-Anwendung, die heavely auf Plugins abhängt. Die Anwendung selbst enthält eine Verbindung zu einem Remote-Server.
Vor kurzem ausgegraben ich in Anwendungsdomänen und sie als die ideale Lösung finden Sie in dem Plugin-Code vom Rest der Anwendung zu isolieren.
Allerdings gibt es einen großen Nachteil, der mir nicht in der Lage macht die Anwendungsdomänen für die Ausrichtung des Plugins zu implementieren. Es scheint, gibt es keine Möglichkeit, ein Objekt durch Verweis auf eine andere Anwendungsdomäne zu übergeben, die benötigt wird, um eine Bezugnahme auf das Verbindungsobjekt zu übergeben.
Ich hatte gehofft, jemand könnte mir eine Abhilfe, damit ich einen Verweis auf dieses Objekt passieren kann.
Hinweis: ein Proxy-Erstellung indiskutabel ist, wirkt die Verbindungsschicht bereits als Proxy, da die Klassen werden automatisch generiert
.Hinweis 2:. System.AddIn kann nicht verwendet werden, da sie nicht auf dem Compact Framework ist
Lösung
Haben Sie versucht, die sich aus MarshalByRefObject ? Es ist ein Schmerz, dass es Schrauben Ihrer Vererbungshierarchie, aber ich denke, es ist das, was Sie wollen.
Aus der Dokumentation:
MarshalByRefObject ist die Basisklasse für Objekte, die miteinander kommunizieren über Anwendungsdomänengrenzen durch Austausch von Nachrichten über einen Proxy verwenden. Objekte, die erben nicht von MarshalByRefObject sind implizit Marschall von Wert. Wenn ein Remote Anwendung verweist auf einen Marschall von Wertobjekt, eine Kopie des Objekts ist über Anwendungsdomäne übergeben Grenzen.
MarshalByRefObject Objekte direkt im zugegriffen Grenzen der lokalen Anwendung Domain. Das erste Mal, wenn eine Anwendung in einer Remote-Anwendungsdomäne greift ein MarshalByRefObject, ein Proxy wird an die Remote-Anwendung übergeben. Nachfolgende Aufrufe auf dem Proxy sind Zurück zu dem Objekt Wohnsitz gemarshallte in der lokalen Anwendungsdomäne.
Typen müssen erben von MarshalByRefObject, wenn der Typ ist über Anwendungsdomäne verwendet Grenzen, und der Zustand der Objekt muss nicht, weil die kopiert werden Mitglieder des Objekts sind nicht verwendbar außerhalb der Anwendungsdomäne, wo sie erstellt wurden.
Nach meiner Erfahrung kann es ziemlich einschränkend sein - du wirklich so wenig tun müssen, um möglichst über die AppDomain Grenze, vorzugsweise beschränken sich auf Vorgänge, die nur erfordern primitive Typen, Strings und Arrays von beiden. Das kann gut mit mehreren AppDomains zu meiner eigenen Unerfahrenheit zurückzuführen sein, in der Arbeit, aber es ist nur eine Warnung, dass es ein bisschen wie ein Minenfeld.
Andere Tipps
zwischen AppDomains auf der gleichen Instanz zu sprechen, muss sie erben von MarshalByRefObject . Geschah diese Weise wird jeder Methodenaufruf für das Objekt (einschließlich Eigenschaften usw.) tatsächlich ein remoting Anruf an die anderen app-Domäne. Heißt das helfen?
Beachten Sie, dass clean-up von MarshalByRefObject
Proxies up gereinigt basierend auf einem Mietvertrag. Kurz gesagt, wenn Sie für eine bestimmte Zeit, um das Objekt nicht wird es freigegeben. Sie können dies durch InitializeLifetimeService
übergeordnete Steuerung ein Leasingobjekt zurückzukehren, die Sie braucht übereinstimmt. Wenn Sie Rückkehr null
Sie effektiv das Leasing deaktivieren und dann wird das Objekt nur freigegeben, wenn der AppDomain entladen wird.