2010-05-24 18 views
5

¿Hay alguna forma de pasar un objeto a un servicio de Windows? Conozco el método myServiceController.Star (string [] arg) pero necesito pasar un objeto más complejo que una matriz de cadenas. En realidad, no necesito que el objeto pase como parámetro, lo que realmente necesito es que el servicio pueda usar un objeto creado en una aplicación de formularios de Windows. Intenté usar el método System.Web.Script.Serialization.JavaScriptSerializer.Serialize para convertir el objeto en un Json, pero no pude porque el objeto contiene una referencia circular. También probé usando punteros, pero no podría ser porque es un objeto de tipo administrado.Pasar un objeto como parámetro a un servicio de Windows

¿Alguna idea de qué puedo hacer?

Respuesta

3

En lugar de intentar pasar el objeto itslef (que no funcionará ya que el servicio se ejecuta en un proceso separado) - pase una referencia de ejercicio a los datos. Por ejemplo, la ruta al archivo contiene el objeto serializado.

Supongo que su servicio también se implementa en .NET? De ser así, utilice la serialización binaria (BinaryFormatter) ya que manejará las referencias circulares. A continuación, puede deserializar en su servicio cargando desde el archivo nombrado.

Es posible que desee considerar lo que sucede si el usuario reinicia su servicio, ¿de dónde obtiene los datos en ese caso? No habrá parámetros de inicio. Puede ser más robusto utilizar el registro para almacenar el nombre de archivo del objeto serializado y hacer que su servicio se lea desde este en el inicio. Entonces siempre encontrará los datos incluso cuando se invocan sin parámetros de inicio, como es el caso en que la máquina se reinicia, o el usuario reinicia el servicio.

0

Utilizo una base de datos para compartir objetos entre un servicio de Windows y una aplicación de Windows, usando XML como formato de codificación y haciendo la serialización yo mismo. Con una base de datos puede envolver la comunicación en las transacciones (para bloquear), agregar campos adicionales para el registro, tratar la tabla como una cola y tener un lugar conveniente para recuperarse si tiene que reiniciar desde un bloqueo.

0

Totalmente depende de qué canales se comunique el servicio de Windows. Puede estar escuchando como un servicio web, ejecutando un escucha propietario de socket/puerto o (en .NET 4.0) mirando un archivo mapeado en memoria o un conducto con nombre.

Su pregunta menciona un método (cadena [] args), que se parece más a un método de línea de comando "principal". En ese caso, probablemente esté buscando algo incorrecto si se trata de un servicio de Windows. No ejecuta un EXE de servicio de Windows para pasarle argumentos ... no si desea que se ejecute como un servicio.

Cada uno de estos métodos implica sus propios caprichos. Pero básicamente tienes que ordenar tus datos a través de una serialización de referencia o valor.

2

La manera más fácil es utilizar un servicio WCF alojado por sí mismo. Si el Servicio y el cliente están en la misma máquina, puede usar una memoria llamada enlace de tubería.

http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx

http://omegacoder.com/?p=101

o puede utilizar un enlace de TCP si el cliente reside en una máquina diferente http://msdn.microsoft.com/en-us/library/ms733769.aspx

+1

Las canalizaciones con nombre era exactamente lo que iba a sugerir. – AaronLS

Cuestiones relacionadas