start application app c# windows-services wcf

c# - application - wcf service host



Cómo hacer que el servicio de Windows se inicie como "Automático(inicio demorado)" (4)

Ahora que .NET 4.0 está aquí:

serviceInstaller1.StartType = ServiceStartMode.Automatic; serviceInstaller1.DelayedAutoStart = true;

Guión:

Un servicio WCF que se ejecuta como un servicio de Windows. La cuenta es "Usuario".

Lo que se hace:

He anulado OnBeforeInstall en el instalador de proyectos para poder establecer el nombre de usuario y la contraseña de un archivo de configuración.

Lo que yo podría hacer:

Me gustaría poder establecer el tipo de inicio como Automático (inicio demorado)

Lo que he intentado:

Puse el siguiente coderow en el OnBeforeInstall anulado

serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;

Pensé que engañaría a la enumeración de ServiceStartMode para que representara Automático (inicio demorado), no funcionó. No he intentado nada más simplemente porque no pude encontrar nada que probar.

Lo que he encontrado en la red:

Descubrí que Automático (inicio demorado) estará disponible en .NET 4, pero eso no me ayuda en este momento. MSDN Descubrí que DelayedAutoStart podría agregarse a la clave de configuración del servicio, pero se siente como un hack si debo hacer esto desde el código. ¿Pero quizás esta es la única solución disponible para mí en este momento?

¿Algunas ideas?

Robert Persson, Suecia


Para mi proyecto .NET Framework 3.5, puedo instalar mi servicio como un servicio "Automático (Retrasado)" configurando manualmente el valor DelayedAutostart para mi servicio. Por ejemplo:

public ProjectInstaller() { ... AfterInstall += ProjectInstaller_AfterInstall; } void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e) { string serviceName = <YourSpecific>Installer.ServiceName; using (RegistryKey serviceKey = Registry.LocalMachine.OpenSubKey(@"System/CurrentControlSet/Services/" + serviceName, true)) { serviceKey.SetValue("DelayedAutostart", 1, RegistryValueKind.DWord); } }

Tenga en cuenta que después de instalar el servicio, el servicio no aparecerá como "Automático (Retrasado)" hasta que se reinicie la computadora .


Su única otra opción es usar P / invoke para llamar a ChangeServiceConfig2 con SERVICE_CONFIG_DELAYED_AUTO_START_INFO . Pero como parece que no está dispuesto a agregar la entrada del registro, dudo que quiera usar P / invocar. No hay otra forma de hacerlo desde .NET Framework (<4.0).


Voy a ampliar en jdknight responder un poco. Tuve problemas de permiso de escritura al intentar su solución, así que esto es lo que hice:

void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e) { try { RegistryKey key = Registry.LocalMachine.OpenSubKey("System", true); //Opens the System hive with writting permissions set to true key = key.CreateSubKey("CurrentControlSet"); //CreateSubKey opens if subkey exists, otherwise it will create that subkey key = key.CreateSubKey("services"); key = key.CreateSubKey(serviceInstaller1.ServiceName); key.SetValue("DelayedAutostart", 1, RegistryValueKind.DWord); } catch (Exception exc) { Console.WriteLine(exc.Message); } }

También me registré en el evento AfterInstall agregando una nueva instancia de InstallEventHandler. No estoy seguro de si eso es realmente necesario, pero tampoco va a doler:

AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);

Funciona como un encanto en .NET Framework 2.0. Como se ha señalado anteriormente, para los marcos 4 y superiores, use

serviceInstaller1.DelayedAutoStart = true;

Según la respuesta del Fiat.