2008-10-17 24 views
50

¿Cómo inicia automáticamente un servicio después de ejecutar una instalación desde un Proyecto de instalación de Visual Studio?¿Cómo iniciar automáticamente su servicio después de la instalación?

Acabo de entender esto y pensé que iba a compartir la respuesta para el bien general. Respuesta a seguir Estoy abierto a otras y mejores formas de hacerlo.

+2

Estoy tan contento de ver a alguien publicando una pregunta útil de la que saben la respuesta. A veces, simplemente sabes que tu propina será bienvenida. También es posible que alguien responda con una alternativa atractiva a su solución. – DOK

+0

Eso es exactamente lo que estoy esperando. –

+0

Eso es algo tan obvio que quiero hacer. Nunca deja de sorprenderme las cosas que Microsoft deja fuera de su código. –

Respuesta

54

Agregue la siguiente clase a su proyecto.

using System.ServiceProcess; 

class ServInstaller : ServiceInstaller 
{ 
    protected override void OnCommitted(System.Collections.IDictionary savedState) 
    { 
     ServiceController sc = new ServiceController("YourServiceNameGoesHere"); 
     sc.Start(); 
    } 
} 

El proyecto de instalación recogerá la clase y ejecutará su servicio una vez que finalice el instalador.

+3

ServiceController implementa IDisposable. ¿No estaba usando la palabra clave 'usar' o llamando al método Dispose intencionalmente? –

+0

Acepto que siempre es una buena idea desechar correctamente. En este caso, solo se ejecuta una vez. Los incendios OnCommitted después de que se ejecuta el programa de instalación y luego el servicio se gestiona como cualquier otro y se inicia automáticamente en el próximo reinicio. –

+7

¿Qué pasa con base.OnCommitted (...). ¿Eso necesita ser llamado? –

9

gracias funcionar bien ...

private System.ServiceProcess.ServiceInstaller serviceInstaller1; 

private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e) 
{ 
    ServiceController sc = new ServiceController("YourServiceName"); 
    sc.Start(); 
} 
+1

Esta es la forma más sencilla, ya que el instalador del servicio y el evento AfterInstall ya están allí; no es necesario agregar una clase nueva. –

37

Pequeño Además de respuesta aceptada:

También puede buscar el nombre de servicio como este - evitando cualquier problema si se cambia el nombre del servicio en el futuro:

protected override void OnCommitted(System.Collections.IDictionary savedState) 
{ 
    new ServiceController(serviceInstaller1.ServiceName).Start(); 
} 

(Cada instalador tiene un ServiceProcessInstaller y una ServiceInstaller. Aquí el ServiceInstaller se llama ServiceInstaller1.)

+0

serviceInstaller1 es una variable miembro privada de ProjectInstaller, entonces, ¿cómo hago para acceder desde ServInstaller? – nrjohnstone

7

En lugar de crear su propia clase, seleccione el instalador servicio en el instalador del proyecto y agregar un controlador de eventos para el evento Comitted:

private void serviceInstallerService1_Committed(object sender, InstallEventArgs e) 
{ 
    var serviceInstaller = sender as ServiceInstaller; 
    // Start the service after it is installed. 
    if (serviceInstaller != null && serviceInstaller.StartType == ServiceStartMode.Automatic) 
    { 
     var serviceController = new ServiceController(serviceInstaller.ServiceName); 
     serviceController.Start(); 
    } 
} 

Se iniciará su servicio sólo si el tipo de inicio se establece en automático.

+0

No olvide agregar: 'using System.ServiceProcess;' – HeWillem

+0

esta es la opción que mejor me ha funcionado y parece la más simple y más obvia – nrjohnstone

3

Sobre la base de los fragmentos anteriormente, mi archivo ProjectInstaller.cs terminaron pareciéndose a esto por un servicio denominado FSWServiceMgr.exe. El servicio se inició después de la instalación. Como nota al margen, recuerde hacer clic en la pestaña Propiedades (no hacer clic con el botón derecho) cuando se selecciona el proyecto de instalación en el Explorador de soluciones para configurar la empresa y demás.


using System.ComponentModel; 
using System.Configuration.Install; 
using System.ServiceProcess; 

namespace FSWManager { 
    [RunInstaller(true)] 
    public partial class ProjectInstaller : Installer { 
     public ProjectInstaller() { 
      InitializeComponent(); 
      this.FSWServiceMgr.AfterInstall += FSWServiceMgr_AfterInstall; 
     } 

     static void FSWServiceMgr_AfterInstall(object sender, InstallEventArgs e) { 
      new ServiceController("FSWServiceMgr").Start(); 
     } 
    } 
} 
19

Este enfoque utiliza la clase de instalación y la menor cantidad de código.

using System.ComponentModel; 
using System.Configuration.Install; 
using System.ServiceProcess; 

namespace MyProject 
{ 
    [RunInstaller(true)] 
    public partial class ProjectInstaller : Installer 
    { 
     public ProjectInstaller() 
     { 
      InitializeComponent(); 
      serviceInstaller1.AfterInstall += (sender, args) => new ServiceController(serviceInstaller1.ServiceName).Start(); 
     } 
    } 
} 

Definir serviceInstaller1 (ServiceInstaller tipo) en el diseñador de la clase de instalación y establezca su propiedad ServiceName en el diseñador.

Cuestiones relacionadas