Retrieve Remote-Bitmap, unter Verwendung von HBITMAP Griff in C #
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.
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.