c# - servicio - windows service visual studio 2015
¿Cómo configuro el nombre de un servicio de Windows después de la instalación(o fácilmente en tiempo de compilación)? (3)
En lugar de usar Environment.GetCommandLineArgs();
El Installer
la clase tiene una propiedad llamada Context
desde la cual puede acceder a los argumentos de la línea de comandos que se le pasan a InstallUtil estructurado en un buen StringDictionary
.
He creado un servicio de Windows en C #, lo instalé en un servidor y funciona bien.
Ahora quiero instalar el mismo servicio de nuevo, pero ejecutando desde un directorio de trabajo diferente, teniendo un archivo de configuración diferente, etc. Por lo tanto, me gustaría tener dos (o más) instancias del mismo servicio ejecutándose simultáneamente. Inicialmente, esto no es posible ya que el instalador se quejará de que ya existe un servicio con el nombre dado instalado.
Puedo superar esto cambiando mi código, configurando la propiedad ServiceBase.ServiceName
a un nuevo valor, y luego compilando y ejecutando InstallUtil.exe nuevamente. Sin embargo, preferiría mucho si pudiera establecer el nombre del servicio en el momento de la instalación, es decir, lo ideal sería hacer algo como
InstallUtil.exe / i / servicename = "MyService Instance 2" MyService.exe
Si esto no es posible (lo dudo mucho), me gustaría poder inyectar el nombre del servicio cuando construyo el servicio. Pensé que podría ser posible usar algún tipo de evento de compilación, usar un truco de msbuild o nant inteligente o algo así, pero no tengo ni idea.
Cualquier sugerencia sería muy apreciada.
Gracias por tu tiempo.
Intenté acceder a una configuración usando
ConfigurationManager.OpenExeConfiguration(string exePath)
en el instalador, pero no pudo hacerlo funcionar.
En su lugar, decidí usar System.Environment.GetCommandLineArgs()
en el instalador de esta manera:
string[] commandlineArgs = Environment.GetCommandLineArgs();
string servicename;
string servicedisplayname;
ParseServiceNameSwitches(
commandlineArgs,
out servicename,
out servicedisplayname);
serviceInstaller.ServiceName = servicename;
serviceInstaller.DisplayName = servicedisplayname;
Ahora puedo instalar mis servicios usando
InstallUtil.exe / i InstallableService.dll / servicename = "myserviceinstance_2" / servicedisplayname = "My Service Instance 2"
Escribí una explicación más elaborada here .
No 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 el instalador de su servicio lea el ServiceName de un archivo de configuración. Si observa algún código para un ServiceInstaller típico, verá que solo es cuestión de tener la configuración adecuada de las propiedades DisplayName y ServiceName en el tiempo de ejecución. Estos podrían leerse fácilmente desde un archivo de configuración en lugar de estar codificados.