Frage

Ich habe eine MarshalByRefObject, die ich serialisiert und Speicher benötigen (in einer Datenbank), so konnte ich es später deserialisiert und verweisen. Ich habe gewählt, dies anders zu nähern: jetzt ich einen Windows-Dienst laufen lasse, die einfach die MarshalByRefObjects „lebendig“ hält (bitte beachten Sie, dass der RemoteObject ist eigentlich ein 3rd-Party-Objekt, das schaff' ich mich nicht):

// This is the object which extends the MarshalByRefObject class
RemoteObject myRemoteObject = new RemoteObject;

TcpServerChannel channel = new TcpServerChannel(6789);
ChannelServices.RegisterChannel(channel, true);

ObjRef objRef = RemotingServices.Marshal((System.MarshalByRefObject)myRemoteObject, id);

In einer anderen AppDomain ich einfach verbinden und rufen Sie das Objekt; alles funktioniert gut:

RemoteObject myLocalObject = (FCEngine.IFCVerificationSession)Activator.GetObject(
                           typeof(FCEngine.IFCVerificationSession),"tcp://localhost:6789/" + id);

Das Problem ist jetzt, dass der RemoteObject eine Eigenschaft enthält, die einfach ein HBITMAP Griff in dem long Typ gegossen. Ich kann leicht den Griff abrufen. Normalerweise (lokal) ich tun würde:

IntPtr hbitmap = (IntPtr)myLocalObject.ContextImage;
System.Drawing.Bitmap bmp = System.Drawing.Image.FromHbitmap(hbitmap);

Das funktioniert nicht, im aktuellen Fall. Ich bekomme ein System.Runtime.InteropServices.ExternalException ich das Problem vermuten, dass hbitmap ist ein Handle zu einem gewissen Speicher ist, die nicht in der lokalen AppDomain existiert, aber in der Windows-Dienst AppDomain. Meine Frage ist, was meine Optionen sind:

  • Die RemoteObject ist ziemlich komplex, es ist wie ein Baum, in dem Sie die Knoten durchqueren durch seine Funktionen aufrufen. Die dritte Partei erlegt, dass ich nur das Objekt einmal durchqueren kann. So durchlaufen it Service-Seite, Speichern von Bitmaps in einer Datenbank, und sie aus der Ferne wieder durchlaufen wird nicht funktionieren.
  • Ideal wäre in der Lage sein, eine Funktion im Windows-Dienst zu rufen, und das HBITMAP Handle als Argument übergeben, die tatsächliche Bitmap zurück. Dies ist nicht möglich in Windows Service.
  • Ich kann den Griff in einer Datenbank speichern und mache den Windows-Dienst die Datenbank für die sie abfragen. Es könnte dann die Bitmap abrufen und speichern sie in der gleichen DB für mich. Ich konnte dann abrufen wieder, dass die Bitmap der Ferne. Das ist sehr hässlich, da ich die Bitmap sofort benötigen.

Im Grunde würde Ich mag wissen, ob Sie Vorschläge müssen nicht hässlich Hacks wie die dritte Option ausführen müssen ... Was sind meine Optionen?

GELÖST Im Augenblick löste ich das Problem, indem ein benutzerdefiniertes Objekt zu schaffen, den MarshalByRefObject auf der Serviceseite erstreckt. Dieses Objekt hat ein Verfahren zum Abrufen und Speichern einer Bitmap durch den Griff verläuft. Ich gehe einfach das Objekt der Ferne, in der gleichen Art, wie ich mein 3rd-Party-Objekt nähern. Zu einfach einer Lösung, obwohl ein Kollege sie darauf hinweisen hatte.

War es hilfreich?

Lösung

ist HBitmap ein Griff, es hat keinen Sinn, nicht verwalteten Griffe serialisiert werden. Sie müssen den Bitmap Inhalt serialisiert, neu erstellen (Bitmap) auf einer entfernten Seite und dann wieder assign neu geschaffene HBITMAP.

P. S. Körperlich Griff ein Zeiger auf Zeiger ist, dessen Wert gilt nur eine der Adressraum erstellt wurde.

IMHO.

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