Domanda

Ho un MarshalByRefObject, che avevo bisogno di serializzare e conservare (in un database), così ho potuto deserializzare e fare riferimento in un secondo momento. Ho scelto di avvicinarsi a questo modo diverso: in questo momento sto facendo funzionare un servizio di Windows che mantiene semplicemente il MarshalByRefObjects "vivo" (si ricorda che il RemoteObject è in realtà un oggetto 3rd party, che io non creo me stesso):

// 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 un altro dominio di applicazione che è sufficiente collegare e recuperare l'oggetto; tutto funziona benissimo:

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

Ora il problema è che la RemoteObject contiene una proprietà che è semplicemente una maniglia HBITMAP fusa al tipo long. Posso recuperare la maniglia facilmente. Normalmente (localmente) vorrei fare:

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

Questo non funziona nel caso in questione. Ho un System.Runtime.InteropServices.ExternalException Credo che il problema è che hbitmap è una maniglia a qualche ricordo che non esiste nel dominio di applicazione locale, ma nel servizio AppDomain di Windows. La mia domanda è che cosa le mie opzioni sono:

  • Il RemoteObject è piuttosto complessa, è come un albero in cui si attraversano i nodi chiamando le sue funzioni. Il 3 ° impone parti che posso attraversare solo l'oggetto una volta. Così lo attraversa Service-side, la memorizzazione di bitmap in un database, e attraversando in remoto ancora non funzionerà.
  • ideale sarebbe quella di essere in grado di chiamare una funzione nel servizio di Windows, e passare il manico HBITMAP come argomento, restituendo il bitmap attuale. Questo non è possibile in Windows Services.
  • ho potuto memorizzare la maniglia in una banca dati e rendere il servizio Windows polling del database per esso. Si potrebbe quindi recuperare la bitmap e conservarla nello stesso DB per me. Potrei poi di nuovo recuperare quella bitmap in remoto. Questo è molto brutto, perché ho bisogno subito la bitmap.

In sostanza vorrei sapere se avete suggerimenti di non dover eseguire brutte hack come l'opzione 3 ... Quali sono le opzioni?

RISOLTO In questo momento ho risolto il problema con la creazione di un oggetto personalizzato che si estende MarshalByRefObject sul lato di servizio. Questo oggetto ha un metodo per recuperare e salvare una bitmap passando la maniglia. Ho semplicemente avvicinarsi all'oggetto remoto, allo stesso modo mi avvicino al mio oggetto 3rd party. Troppo semplice di una soluzione, anche se un collega ha dovuto farlo notare.

È stato utile?

Soluzione

HBitmap è una maniglia, non ha senso per serializzare maniglie non gestiti. È necessario serializzare il contenuto bitmap, ricrearlo (bitmap) su un lato remoto, e poi riassegnare HBITMAP appena creata.

P.S. Fisicamente maniglia è un puntatore al puntatore, il suo valore è applicabile solo è stato creato uno spazio degli indirizzi.

IMHO.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top