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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top