Estoy tratando de construir varios servicios de Windows para hacer cosas diferentes. Por ejemplo, yo necesito los servicios de Windows que se:

  1. Enviar un informe diario a través del correo electrónico
  2. Periódicamente la limpieza de algunas archivados información cada 30 minutos
  3. etc.

Las tareas que necesitan los servicios de windows son distintos por lo que no me gusta la idea de tener todo en un solo servicio.

Lo que he conseguido hasta ahora es un proyecto en Visual Studio 2008. He creado un servicio de windows, me he puesto un temporizador en el evento OnStart (simplemente escribe a un archivo de texto cada 5 segundos para propósitos de prueba). Luego he añadido un Instalador para el proyecto y cuando corro InstallUtil.exe todo funciona bien.

El problema viene cuando puedo añadir un segundo servicio de windows para el mismo proyecto. Me juego hasta la OnStart código de nuevo, con el mismo registro de información (ligeramente diferente, así que puedo decir que el servicio es escrito en el registro). Con el segundo servicio de windows, he cambiado el evento Principal en el Programa.cs de:

    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun = new ServiceBase[] 
        { 
            new Service1()
        };

        ServiceBase.Run(ServicesToRun);
    }

a:

    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun = new ServiceBase[] 
        { 
            new Service1(),
            new Service2()
        };

        ServiceBase.Run(ServicesToRun);
    }

En este punto, no hay tiempo de compilación errores, pero el Servicio2 servicio nunca hace nada…la tarea de registro nunca incendios.

Me condujo hacia el hecho de que el segundo no tiene «Instalador» asociado con él. Luego traté de agregar un Instalador de la manera que lo hice con el primer servicio (es decir, haga clic derecho en el diseñador de servicios, y haga clic en «Agregar Instalador»). Ahora, cuando voy a la ProjectInstaller.cs archivo, no hay otra serviceInstaller allí (serviceInstaller2).

Ahora cuando voy a construir el proyecto y tratar de instalar los servicios, y voy a los «Servicios» del panel de control de la ventana, y yo intente iniciar Service1, me sale el siguiente mensaje de error:

Windows no pudo iniciar el servicio Service1 en el Equipo Local.

Error 1083: El programa ejecutable que este servicio está configurado para ejecutarse en no implementar el servicio.

Me sale el mismo mensaje de error si intento iniciar Servicio2 así (con la excepción de que el mensaje de error identifica Servicio2, por supuesto).

Hay algo que me estoy perdiendo con el fin de obtener dos servicios que se ejecutan desde un exe?

  • ¿Hay algún otro motivo que el «yo quiero» que deben tener los servicios en un solo ejecutable? Normalmente, la modularidad sería preferible, pero puede haber circunstancias atenuantes que requiera de otra forma.
  • La única razón es por la facilidad de instalación y despliegue. Todos los «servicios» son bastante rápido las piezas de funcionalidad, por lo que prefiero no tener que instalar x número de servicios de windows para pequeñas piezas de código.
  • Estoy seguro de que hay numerosas razones para montar múltiples servicios en una sola asamblea. Donde yo trabajo ahora vamos a utilizar las bestias de que el diseño por el cliente de base — hace las pruebas de software que interactúa con los servicios de una brisa.
  • Esto podría ayudar
InformationsquelleAutor dp. | 2009-05-03

7 Comentarios

  1. 15

    He descubierto la manera de tener un ejecutable, sino dos servicios. Cada servicio se instala en el jefe de servicio con su propio nombre y de la capacidad para iniciar/detener. Creo que esto es lo que estás queriendo, ¿correcto? Aquí es lo que yo hice:

    1. Creado un proyecto de servicio.
    2. Añadido un segundo servicio para el mismo proyecto (con un único nombre de servicio).
    3. Añadido un instalador para ambos servicios (ServiceA y ServiceB).
    4. En el ProjectInstaller.El diseñador.vb archivo he cambiado el mío.Los instaladores.AddRange línea para mostrar, tanto de los instaladores de servicios. (Me.ServiceInstaller1, Me.ServiceInstaller2)
    5. En el Principal punto de entrada de la principal de servicio (ServiceA en mi caso), me puse el ServicesToRun variable a una matriz de ServiceBase con todos los servicios que quiero que se ejecute (ServiceA y ServiceB). Este es un paso importante, ya que el servicio de administrador de conjuntos de una propiedad basada en el número de argumentos aquí – ya sea para permitir múltiples instancias de la misma exe o una única instancia.
    6. Agregar un proyecto de instalación y uso de la producción de Servicios.
    7. Agregar una acción personalizada usando la salida de los Servicios.

    Usted puede encontrar el código de demostración aquí:
    http://code.google.com/p/multi-service-install/

    Disfrutar!

  2. 5

    Supongo que ustedes ya han resuelto esto, pero en caso de que otra persona lo necesita, voy a publicar una respuesta a este problema que me llevó varias horas de hoy.
    La solución es no agregar otro proyecto instalador, pero un instalador de servicio, que es un componente en el proyecto de instalación. Que recién agregado instalador de servicio tiene que tener segundo nombre de servicio configurado.

    • Tuve que usar el detalle aquí para que me diga cómo hacer esto: msdn.microsoft.com/en-us/library/zt39148a(v=vs 110).aspx Para los perezosos: «Abra el menú contextual de la ventana del diseñador (si está utilizando un dispositivo de puntero, haga clic dentro de la ventana) y, a continuación, elija Agregar Instalador.»
    • Yo era incapaz de entender lo que usted entiende por puntos 6 y 7.
    • Creo que él se está refiriendo a un tipo de proyecto que estaba disponible en el momento o de la escritura (2009), que produjo el programa de asistentes de instalación para los usuarios finales. Esto fue eliminado a partir de VS2012, pero todavía disponible como una extensión en el VS mercado. Pero me gustaría recomendar el uso de algo que, como se produce realmente anciano de interfaz de usuario, y tiene un bug con aplicaciones de 64 bits.
  3. 2

    He tenido un problema similar hoy en día, y logró resolverlo.

    En primer lugar, me aseguré de que cada uno de los servicios que había una significativa y única propiedad ServiceName. El generador dio tanto de los servicios que el mismo nombre de la que no habría ayudado.

    I luego se retira y se regenera la clase ProjectInstaller, y añadió que los instaladores para cada una de las clases. De hecho estoy seguro que ambos fueron activados en el método estático Main.

    Ahora puedo instalar los dos servicios con el archivo dll, pero lamentablemente, cuando me inicie uno de los servicios que se parece a realizar las funciones de sí mismo y el otro de servicio. Es decir, tanto de los servicios que se están ejecutando (aunque sólo uno de los servicios aparece como ‘Comenzó’ en el Administrador de Equipo). Todavía estoy tratando de descifrar eso…

  4. 1

    Estoy construyendo algo muy similar a lo que usted está pensando. Lo que me he decidido a hacer (hasta ahora) es que todos los de mi ‘servicios’ (a pesar de que no son los servicios, el ‘controlador’ es) implementar una interfaz en particular (con init() y ejecutar() de las operaciones, así como una FRECUENCIA de enumeración).

    El controlador es el servicio de windows y lee la lista de programas/archivos dll desde un xml archivo de configuración en tiempo de ejecución y los carga en una Lista y llama a su método execute () (si es aplicable) en cualquier frecuencia en la que se han definido.

    En mi caso, cada programa contiene un control de usuario que se carga en una ficha página de el controlador que permite al usuario controlar/modificar. Voy a publicar el código, si le interesa.

    No estoy seguro si eso estaba claro. De hecho, me dieron la idea de otra MANERA que el usuario que implementa algo similar, pero no puedo encontrar ese post ahora.

  5. 0

    Tuve el mismo problema en la actualidad, y logró solucionarlo.
    En mi caso, yo sólo tenía que abrir el *.el diseñador.cs archivos de mis servicios y asegúrese de que el nombre del servicio está establecido correctamente. Más importante aún, el mismo nombre que debe utilizarse en la *Instalador.El diseñador.cs y si tiene código en *Instalador.cs.

    Creo que este error sólo se produce debido a la falta de coincidencia de nombre.

    La esperanza de que este helpds

  6. 0

    La instalación de 2 distintos y no relacionados servicios en un solo ejecutable tiene un olor raro para mí. Aunque es posible llegar a trabajar, no hacer lo correcto.

    De lo que suena, es necesario realizar algunas tareas diferentes en distintos intervalos y sus tareas pueden o no estar relacionados. Has mirado en Quartz.NET? Suena como un buen ajuste para sus necesidades.

    http://quartznet.sourceforge.net/features.html

Dejar respuesta

Please enter your comment!
Please enter your name here