双击以启动Windows服务

时间:2010-07-03 15:57:58

标签: c# windows-services autostart

如何使Windows服务以下列方式工作......

1。)安装后自动启动

2。)即使我们只是双击可执行文件

也会自动启动

换句话说,我不想使用“NET START”,“SC”命令,也不想通过服务控制台启动它。我只是想让我的服务自动安装并自动启动...加上双击可执行文件时自动启动。

感谢。

4 个答案:

答案 0 :(得分:4)

查看ServiceController课程。

您可以在commited事件中使用它,如下所示:

[RunInstaller(true)]
public class ServiceInstaller : Installer
{
    string serviceName = "MyServiceName";

    public ServiceInstaller()
    {
        var processInstaller = new ServiceProcessInstaller();
        var serviceInstaller = new ServiceInstaller();

        processInstaller.Account = ...;
        processInstaller.Username = ...;
        processInstaller.Password = ...;

        serviceInstaller.DisplayName = serviceName;
        serviceInstaller.StartType = ServiceStartMode.Automatic;

        serviceInstaller.ServiceName = serviceName;

        this.Installers.Add(processInstaller);
        this.Installers.Add(serviceInstaller);

        this.Committed += new InstallEventHandler(ServiceInstaller_Committed);
    }

    void ServiceInstaller_Committed(object sender, InstallEventArgs e)
    {
        // Auto Start the Service Once Installation is Finished.
        var controller = new ServiceController(serviceName);
        controller.Start();
    }
}

答案 1 :(得分:2)

查看Topshelf项目(http://topshelf-project.com)并消除在.NET中编写Windows服务的所有复杂性。它处理所有自我注册,并消除了应用程序中对服务代码的所有依赖性。

它也是开源的,并在GitHub上托管,可以轻松适应任何应用程序。

(完全披露,我是该项目的作者之一)

答案 2 :(得分:1)

您可以添加调用安装程序的命令行参数(使用ManagedInstallerClass.InstallHelper())和代码来启动服务...

 public class DataImportService : ServiceBase
 {
     // ----------- Other code -----------

     static void Main(string[] args)
     {
       if (args.Length == 0) 
       {
            InstallService(false, argValue); break;
            StartService();
       }
       else
       {
            string arg0 = args[0],
            switchVal = arg0.ToUpper(),
            argValue = arg0.Contains(":") ?
            arg0.Substring(arg0.IndexOf(":")) : null;

            switch (switchVal.Substring(0, 1))
            {
                //Install Service and run
                case ("I"): case ("-I"): case ("/I"):
                    InstallService(true, argValue); break;

                 // Start Service
                case ("S"): case ("-S"): case ("/S"):
                    StartService();
                default: break;

                 // Install & Start Service
                case ("IS"): case ("-IS"): case ("/IS"):
                    InstallService(false, argValue); break;
                    StartService();

                // Uninstall Service
                case ("U"): case ("-U"): case ("/U"):
                    InstallService(false, argValue); break;

                default: break;                   
            }
        }

     private static void InstallService(bool install,  string argFileSpec)
     {
        string fileSpec = Assembly.GetExecutingAssembly().Location;
        if (!String.IsNullOrEmpty(argFileSpec)) fileSpec = argFileSpec;
        // ------------------------------------------------------------
        string[] installerParams =
            install? new string[] { fileSpec } :
                     new string[] { "/u", fileSpec };
        ManagedInstallerClass.InstallHelper(installerParams);
     }

     private void StartService()
     {
        var ctlr  = new ServiceController();
        ctlr.ServiceName = "MyService";    // hard code the service name
        // Start the service
        ctlr.Start();           
     }
}

答案 3 :(得分:0)

我的帖子here显示了如何使用-install选项从命令行安装Windows服务。您可以扩展此逻辑以使用-start选项,然后在桌面上创建包含该选项的快捷方式。