none
Utilizar un componente Global en una aplicación windows distribuida RRS feed

  • Pregunta

  • Buen día

    tengo una aplicación windows, pero necesito tener un componente que sea global a todas las instancias del aplicativo windows que se ejecute. 

    Este componente deberia saber cuántas instancias de la aplicación se están ejecutando, y poder enviar eventos a una instancia de una aplicación concreta.

    ¿cómo podría hacer eso?

    Sería parecido a la clase global.asax de ASP.net
    lunes, 21 de julio de 2014 16:21

Todas las respuestas

  • Si la aplicación es distribuida, es decir, se ejecuta en varios equipos, tendrás que disponer de algún mecanismo de comunicación entre ellos. Y uno de los equipos contendrá el componente común. En una aplicación moderna, lo normal es que la comunicación la hagas con WCF. Si el componente común lo ruedas con un ServiceHost dentro de un Servicio Windows, entonces basta con que configures el componente con el InstanceMode ajustado a Single. De esa manera, se creará una única instancia para atender a todos los clientes. Si quieres que pueda disparar eventos sobre los clientes, puedes usar un Binding de tipo Duplex. El componente sabrá a cuál de los clientes llamar gracias al proxy de retrollamada que se genera al recibir la conexión desde cada cliente. ¡Ojo con la reentrancia (usa OneWay en las dos direcciones de la comunicación Duplex), y pon los bloqueos adecuados en el componente común para evitar condiciones de carrera cuando accedas a las variables comunes!

    Por supuesto, nada de todo esto es sencillo; necesitarás estudiar WCF bastante a fondo para poder programar una aplicación de este tipo. No es algo que se pueda demostrar con un ejemplo de cuatro líneas en un mensaje del foro.

    lunes, 21 de julio de 2014 18:14
  • exáctamente eso quiero, me podrías explicar un poco mejor eso? dónde puedo obtener más información para hacer el servicehost, 

    algún tutorial tal vez?

    necesitaría que ese componente en el servidor, pudiera identificar a cada una de las instancias del aplicativo, y que pueda disparar un evento en un aplicativo específico (no en todos)

    De hecho aclaro un poco más la pregunta. estoy tratando de comunicar dos aplicativos, uno es vb6 y el otro es vb.net, y necesito que cuando suceda algo en el aplicativo vb.6 se dispare un evento en un control específico, de una instancia específica.

    Quizas esto aclare un poco mi problema

    lunes, 21 de julio de 2014 20:18
  • Sí, esto aclara un poco tu problema. No podrás usar WCF en modo duplex, porque en VB6 no hay cliente de WCF. Aunque sí hay librerías para llamar a servicios SOAP, y con WCF se podría configurar un binding compatible, no te va a servir para disparar los eventos.

    Podrías recurrir a alguna tecnología más antigua, por ejemplo, configurar un servicio COM+ en el servidor (se puede hacer en .NET con System.EnterpriseServices) y luego consumirlo desde VB6 a través de DCOM.

    O podrías usar COM/Interop para consumir desde VB6 un componente programado en .NET, y que este último sea el que se comunique mediante WCF.

    Otra opción sería centralizar el servicio en una aplicación web (puedes usar variables de tipo static, o el objeto Application, para compartir estado entre todas las instancias), y desde ahí disparar los eventos mediante SignalR. No hay cliente de SignalR para VB6 (que yo sepa), pero si los eventos van en sentido contrario (desde VB6 al servidor y de ahi a los clientes de .NET), entonces podría servirte.

    En fin, como ves hay varias opciones. Ninguna de ellas es trivial, y todas requieren estudiar bastante para aprender cómo usarlas. Una búsqueda por internet te permitirá localizar abundante documentación y tutoriales. Pero no creo que nadie pueda darte una explicación con pocas palabras en un mensaje del foro.

    lunes, 21 de julio de 2014 20:49