Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a .NET Windows Service start right after the installation?

Besides the service.StartType = ServiceStartMode.Automatic my service does not start after installation

Solution

Inserted this code on my ProjectInstaller

protected override void OnAfterInstall(System.Collections.IDictionary savedState) {     base.OnAfterInstall(savedState);     using (var serviceController = new ServiceController(this.serviceInstaller1.ServiceName, Environment.MachineName))         serviceController.Start(); } 

Thanks to ScottTx and Francis B.

like image 770
Jader Dias Avatar asked Jul 28 '09 17:07

Jader Dias


People also ask

How do I start Windows Service after auto install?

In your Installer class, add a handler for the AfterInstall event. You can then call the ServiceController in the event handler to start the service. Now when you run InstallUtil on your installer, it will install and then start up the service automatically.

How do I start .NET Services in Windows?

Start service Open Start. Search for Command Prompt, right-click the top result, and select the Run as administrator option. Type the following command to start a service and press Enter: net start "SERVICE-NAME" In the command, replace "SERVICE-NAME" for the name or display name of the service.


2 Answers

I've posted a step-by-step procedure for creating a Windows service in C# here. It sounds like you're at least to this point, and now you're wondering how to start the service once it is installed. Setting the StartType property to Automatic will cause the service to start automatically after rebooting your system, but it will not (as you've discovered) automatically start your service after installation.

I don't remember where I found it originally (perhaps Marc Gravell?), but I did find a solution online that allows you to install and start your service by actually running your service itself. Here's the step-by-step:

  1. Structure the Main() function of your service like this:

    static void Main(string[] args) {     if (args.Length == 0) {         // Run your service normally.         ServiceBase[] ServicesToRun = new ServiceBase[] {new YourService()};         ServiceBase.Run(ServicesToRun);     } else if (args.Length == 1) {         switch (args[0]) {             case "-install":                 InstallService();                 StartService();                 break;             case "-uninstall":                 StopService();                 UninstallService();                 break;             default:                 throw new NotImplementedException();         }     } } 
  2. Here is the supporting code:

    using System.Collections; using System.Configuration.Install; using System.ServiceProcess;  private static bool IsInstalled() {     using (ServiceController controller =          new ServiceController("YourServiceName")) {         try {             ServiceControllerStatus status = controller.Status;         } catch {             return false;         }         return true;     } }  private static bool IsRunning() {     using (ServiceController controller =          new ServiceController("YourServiceName")) {         if (!IsInstalled()) return false;         return (controller.Status == ServiceControllerStatus.Running);     } }  private static AssemblyInstaller GetInstaller() {     AssemblyInstaller installer = new AssemblyInstaller(         typeof(YourServiceType).Assembly, null);     installer.UseNewContext = true;     return installer; } 
  3. Continuing with the supporting code...

    private static void InstallService() {     if (IsInstalled()) return;      try {         using (AssemblyInstaller installer = GetInstaller()) {             IDictionary state = new Hashtable();             try {                 installer.Install(state);                 installer.Commit(state);             } catch {                 try {                     installer.Rollback(state);                 } catch { }                 throw;             }         }     } catch {         throw;     } }  private static void UninstallService() {     if ( !IsInstalled() ) return;     try {         using ( AssemblyInstaller installer = GetInstaller() ) {             IDictionary state = new Hashtable();             try {                 installer.Uninstall( state );             } catch {                 throw;             }         }     } catch {         throw;     } }  private static void StartService() {     if ( !IsInstalled() ) return;      using (ServiceController controller =          new ServiceController("YourServiceName")) {         try {             if ( controller.Status != ServiceControllerStatus.Running ) {                 controller.Start();                 controller.WaitForStatus( ServiceControllerStatus.Running,                      TimeSpan.FromSeconds( 10 ) );             }         } catch {             throw;         }     } }  private static void StopService() {     if ( !IsInstalled() ) return;     using ( ServiceController controller =          new ServiceController("YourServiceName")) {         try {             if ( controller.Status != ServiceControllerStatus.Stopped ) {                 controller.Stop();                 controller.WaitForStatus( ServiceControllerStatus.Stopped,                       TimeSpan.FromSeconds( 10 ) );             }         } catch {             throw;         }     } } 
  4. At this point, after you install your service on the target machine, just run your service from the command line (like any ordinary application) with the -install command line argument to install and start your service.

I think I've covered everything, but if you find this doesn't work, please let me know so I can update the answer.

like image 89
Matt Davis Avatar answered Sep 24 '22 16:09

Matt Davis


You can do this all from within your service executable in response to events fired from the InstallUtil process. Override the OnAfterInstall event to use a ServiceController class to start the service.

http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceinstaller.aspx

like image 27
ScottTx Avatar answered Sep 24 '22 16:09

ScottTx