2009-05-07 9 views
21

Creé un servicio de Windows en C#, lo instalé en un servidor y funciona bien.¿Cómo configuro el nombre de un servicio de Windows luego de la instalación (o fácilmente en tiempo de compilación)?

Ahora quiero instalar el mismo servicio nuevamente, pero ejecutando desde un directorio de trabajo diferente, con un archivo de configuración diferente, etc. Por lo tanto, me gustaría tener dos instancias (o más) del mismo servicio ejecutándose simultáneamente . Inicialmente, esto no es posible ya que el instalador se quejará de que ya hay un servicio con el nombre de pila instalado.

Puedo solucionar esto cambiando mi código, estableciendo la propiedad ServiceBase.ServiceName en un nuevo valor, y luego recompilando y ejecutando InstallUtil.exe nuevamente. Sin embargo, yo preferiría si pudiera establecer el nombre del servicio al momento de la instalación, es decir, idealmente me haría algo así

InstallUtil.exe/i /servicename = "MyService Instancia 2" MiServicio.exe

Si esto no se puede lograr (lo dudo mucho), me gustaría poder insertar el nombre del servicio cuando construya el servicio. Pensé que sería posible usar algún tipo de evento de compilación, usar un ingenioso truco de msbuild o nant o algo similar, pero no tengo ni idea.

Cualquier sugerencia sería muy apreciada.

Gracias por su tiempo.

+1

¿Hay alguna razón por la que no le haya dado a su servicio la posibilidad de ejecutar la lógica comercial en n-hilos para archivos n-config? ¿Así que se guarda el problema de las instancias múltiples desde el principio? – Nate

+0

Hmmm, ese podría ser un buen punto. Pero el servicio se creó hace un año, mucho antes de que me diera cuenta de que me gustaría poder ejecutar varias instancias, por lo que la aplicación no está realmente bien diseñada. Sin embargo, he encontrado una solución y la publicaré en un segundo. – Rune

Respuesta

28

He intentado acceder a una configuración usando

ConfigurationManager.OpenExeConfiguration(string exePath) 

en el instalador, pero no pudo conseguir que funcione.

En lugar de eso decidió utilizar System.Environment.GetCommandLineArgs() en el instalador de la siguiente manera:

string[] commandlineArgs = Environment.GetCommandLineArgs(); 

string servicename; 
string servicedisplayname; 
ParseServiceNameSwitches(
    commandlineArgs, 
    out servicename, 
    out servicedisplayname); 

serviceInstaller.ServiceName = servicename; 
serviceInstaller.DisplayName = servicedisplayname; 

Ahora puede instalar usando mis servicios

InstallUtil.exe/i InstallableService.dll /servicename =" myserviceinstance_2 " /servicedisplayname =" Mi servicio Instancia 2 "

Escribí una explicación más elaborada here.

+0

Mire la pregunta y la respuesta para obtener la solución perfecta para esto: http://stackoverflow.com/questions/ 8516701/how-to-get-windows-service-name-from-app-config – techExplorer

4

No se puede pasar esto como una línea de comando arg, ya que InstallUtil no proporciona los ganchos adecuados para eso.

Sin embargo, puede hacer que su instalador de servicios lea ServiceName desde un archivo de configuración. Si tiene look at some code para un ServiceInstaller típico, verá que solo es cuestión de tener las propiedades DisplayName y ServiceName apropiadas configuradas en tiempo de ejecución. Estos podrían leerse fácilmente desde un archivo de configuración en lugar de estar codificados.

+0

¿De verdad? Intenté leer estos valores del archivo ServiceExeName.config durante la instalación del servicio de Windows y no funcionó :( – Darragh

2

En lugar de utilizar la clase Environment.GetCommandLineArgs();Installer tiene una propiedad llamada Context desde donde se puede acceder a los argumentos de línea de comandos pasados ​​a InstallUtil estructurado en una bonita StringDictionary.

Cuestiones relacionadas