Pregunta

Tengo un MarshalByRefObject la que necesitaba para serializar y almacenar (en una base de datos), por lo que podría deserializar y hacer referencia a ella más tarde. He optado por acercarse a esto de manera diferente: en este momento estoy ejecutando un servicio de Windows que simplemente se mantiene el MarshalByRefObjects (Tenga en cuenta que el RemoteObject es en realidad un objeto de tercera parte, que no me creo a mí mismo) "vivo":

// 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);

En otro dominio de aplicación simplemente conectar y recuperar el objeto; todo funciona bien:

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

Ahora el problema es que el RemoteObject contiene una propiedad que es simplemente un mango HBITMAP fundido al tipo long. Puedo recuperar el identificador fácilmente. Normalmente (localmente) que haría:

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

Esto no funciona en el caso actual. Consigo un System.Runtime.InteropServices.ExternalException Supongo que el problema es que hbitmap es un identificador para un recuerdo que no existe en el dominio de aplicación local, pero en el dominio de aplicación de servicio de Windows. Mi pregunta es lo que mis opciones son:

  • El RemoteObject es bastante compleja, es como un árbol en el que se recorre los nodos llamando a sus funciones. Los impone 3 ª parte que sólo puede atravesar el objeto una vez. Así que lo atraviesa de servicio del lado, el almacenamiento de mapas de bits en una base de datos, y atravesando de nuevo de forma remota no funcionará.
  • ideal sería ser capaz de llamar a una función en el servicio de Windows, y pasar el mango HBITMAP como argumento, volviendo el mapa de bits real. Esto no es posible en los servicios de Windows.
  • Me podría almacenar el mango en una base de datos y realizar el servicio de Windows sondea la base de datos para ello. A continuación, podría recuperar el mapa de bits y almacenarlo en el mismo DB para mí. Podría entonces de nuevo recuperar ese mapa de bits de forma remota. Esto es muy feo, ya que necesito el mapa de bits de inmediato.

Básicamente me gustaría saber si usted tiene alguna sugerencia que no tiene que realizar cortes feos como la tercera opción ... ¿Cuáles son mis opciones?

SOLUCIONADO Ahora he resuelto el problema mediante la creación de un objeto personalizado que se extiende en el lado MarshalByRefObject servicio. Este objeto tiene un método para recuperar y guardar un mapa de bits haciendo pasar el mango. Simplemente acercamiento al objeto a distancia, de la misma manera me acerco a mi tercera objeto partido. Demasiado simple de una solución, aunque un colega tuvo que señalarlo.

¿Fue útil?

Solución

HBitmap es un mango, no tiene sentido para serializar los mangos no administrados. Es necesario para serializar el contenido de mapa de bits, volver a crearlo (mapa de bits) en un lado alejado, y luego volver a asignar HBITMAP recién creado.

P.S. Físicamente mango es un puntero a puntero, su valor es aplicable solamente se ha creado un espacio de direcciones.

En mi humilde opinión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top