2010-02-11 18 views
11

He escrito un servicio de Windows, del cual quiero que se ejecute 1 instancia por cliente. Esto se debe a que cada uno de los clientes tiene su propia base de datos con esquemas idénticos; la única diferencia entre los servicios de Windows es que cada uno tendrá un parámetro diferente que corresponda a la base de datos de clientes a la que están destinados. (Y no puedo tener un servicio con múltiples subprocesos de trabajo, porque la conexión de base de datos usa una variable estática, con la que no puedo mezclar entre subprocesos)¿Cómo hacer un servicio de Windows con parámetros?

Encontré this neat little tutorial acerca de cómo hacer un servicio de Windows, pero solo me muestra cómo configurarlo para un solo servicio. Quiero configurar n instancias del servicio, cada una con un nombre para mostrar que incluye el nombre del cliente, ejecutándose con el parámetro de línea de comando que denota la ID del cliente.

El tutorial vinculado anteriormente tiene una clase llamada MyWindowsServiceInstaller, que instala el servicio de Windows en el sistema local, y supongo que esto sería un lugar lógico para establecer un bucle foreach a través de todos mis clientes, la creación de un servicio para cada. Pero no puedo ver en ninguna parte de las interfaces proporcionadas que me permita configurar un parámetro de línea de comando para el nuevo servicio.

¿Cómo lo haces?

+0

estoy quitando mi respuesta, hay gente por ahí que saben más de esto que yo. –

+0

@Binary Worrier - ¡Ojalá no hubieras eliminado tu respuesta! Hubo algunas ideas en que hay que eran muy prometedor ... –

+0

respuesta restaurarse: a lo marcó como CW, es incompleta, tenemos una hoja de trucos en algún lugar con "cómo" las instrucciones para conseguir varias instancias de la misma en marcha el servicio, pero No puedo encontrarlo y no tengo tiempo para cavar, lo siento, Shaul. –

Respuesta

7

Wil Peck wrote a good article acerca de cómo instalar varias instancias de un servicio de Windows en una sola caja.La idea básica es que debes engañar al instalador para que crea que son servicios diferentes dándoles diferentes nombres.

Dicho esto, parece que sería más fácil (y más fácil de mantener) a rediseñar su código de conexión de base de datos para que pueda soportar múltiples subprocesos de trabajo.

+1

+1 para el enlace, +1 otra vez si pudiera aconsejar tener varios hilos de trabajo en un servicio. Siempre puede tener una GUI que remotas al servicio y muestra información sobre los subprocesos en ejecución. –

+0

Sí, Wil tiene la respuesta. ¡Muchas gracias por el puntero! –

1

Básicamente necesita instalar el servicio varias veces y personalizarlo con su archivo exe.config.

Como alternativa, puede tener un servicio que ejecute diferentes subprocesos de trabajo para cada cliente.

actualización

exe.Config es un Application Configuration File

no tengo ni idea de cómo usar ese componente de instalación para instalar varias instancias del servicio, yo no era consciente de que podía.

Donde necesitamos varias instancias de uno de nuestros servicios para ejecutar en una máquina, en realidad solo lo instalamos una vez, luego literalmente copiamos la carpeta instalada y cambiamos el nombre del exe para la segunda instancia. La segunda instancia se configura en su propio archivo de configuración de la aplicación.

+0

En el tutorial al que he vinculado anteriormente, hay una clase llamada MyWindowsServiceInstaller, que hace el trabajo de instalación. Parece que debería ser el lugar para configurar un bucle para todos los clientes, pero no puedo ver nada en absoluto para configurar los parámetros de línea de comando para cada servicio. ¿Cómo se configuran los parámetros? y perdón por mi ignorancia, pero ¿qué es exe.config? –

+0

he actualizado mi pregunta para aclarar algunos de los puntos que mencionas. –

+0

1 para el enlace al archivo de configuración de la aplicación –

1

Por lo que yo sé, es imposible proporcionar parámetros de inicio usando ServiceInstaller, ServiceProcessInstaller o installutil. Sin embargo, es posible proporcionar parámetros de inicio utilizando algunas API ap de advapi.dll (ver el menú de la izquierda). Se puede encontrar una colección completa de las llamadas requeridas here. Es una clase (también) llamada ServiceInstaller que contiene los métodos externos necesarios y algunos métodos de utilidad.

Desea utilizar el método de utilidad InstallAndStart. Acepta un nombre de servicio, un nombre para mostrar y una ruta al ejecutable que representa su servicio de Windows. Se le puede llamar así:

InstallAndStart("MyService", "My Service For User 1", 
       "c:\\pathtoexe\MyService.exe user1"); 

Si tiene el servicio siguiente parámetro startupParam recibirá el valor user1.

class Program : ServiceBase 
{ 
    private string startupParam; 

    static void Main(string[] args) 
    { 
     string arg = args[0]; 
     ServiceBase.Run(new Program(arg)); 
    } 

    public Program(string startupParam) 
    { 
     this.ServiceName = "MyService"; 
     this.startupParam = startupParam; 
    } 
    ... 
} 
+0

ummm ... acaba de intentar esto, y no se ve como installutil le permite pasar parámetros ...? ¿Me estoy perdiendo de algo? –

+0

Hm, parece que no estoy en lo correcto. Perdón por eso y olvídate de la parte installutil. Uso una clase personalizada de ServiceInstaller que usa las aplicaciones COM para iniciar y detener servicios. Esta clase permite pasar parámetros y pensé que installutil haría lo mismo. Actualizaré mi respuesta ... –

+0

Ronald, tengo un cliente que necesita el Servicio de Windows para realizar acciones en el sistema usando la cuenta del SISTEMA, porque mi cliente no tiene permisos. Si quiero que el cliente le diga al Servicio de Windows qué hacer, ¿debo parar y comenzar cada vez, pasando argumentos como este? Encontré la función OnCustomCommand, pero no es útil porque solo puedes pasar números enteros. ¿O debería usar una base de datos o claves de registro para establecer argumentos temporalmente en función del cliente que se ejecuta? – MacGyver

-2

Si el uso de herramientas de terceros está bien con usted, trate de http://installer.codeeffects.com. Le permiten crear un instalador .exe para su servicio de Windows y agregar parámetros a la interfaz de usuario del instalador. Además, no es necesario que desarrolles tu propio proyecto de configuración. Espero que esto ayude.

+0

$ ping installer.codeeffects.com ping: no se puede resolver installer.codeeffects.com: host desconocido – harperville

12

Todo lo que quería era enviar un parámetro para el servicio que he creado. Como resultado, todo lo que tiene que hacer es (con cuidado!) Editar el registro en HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ y agregar el parámetro en ImagePath, después de las comillas.

Por ejemplo. ImagePath del valor: "C: \ Archivos de programa \ myservice \ MiServicio.exe" param1

he encontrado la solución en este enlace http://social.msdn.microsoft.com/Forums/is/csharpgeneral/thread/38242afa-7e40-4c06-975e-aa97d3cc782f

Cuestiones relacionadas