Дважды щелкните, чтобы запустить службу Windows - PullRequest
4 голосов
/ 03 июля 2010

Как настроить службу Windows следующим образом ...

1.) Автоматический запуск после установки

2.) Автоматический запуск, даже если мы просто дважды щелкнем по исполняемому файлу

Другими словами, я не хочу использовать команды «NET START», «SC» и не хочу запускать его через консоль служб. Я просто хочу, чтобы моя служба автоматически устанавливалась и автоматически запускалась ... плюс автоматически запускалась при двойном щелчке исполняемого файла.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 03 июля 2010

Посмотрите на ServiceController class.

Вы можете использовать его в 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();
    }
}
2 голосов
/ 03 июля 2010

Взгляните на проект Topshelf (http://topshelf -project.com ) и устраните всю сложность написания служб Windows в .NET.Он обрабатывает всю саморегистрацию и устраняет все зависимости от кода сервиса из вашего приложения.

Он также с открытым исходным кодом и размещен на GitHub, что облегчает адаптацию к любому приложению.(полное раскрытие, я один из авторов проекта)

1 голос
/ 03 июля 2010

Вы можете добавить аргументы командной строки, которые вызывают установщик (используйте 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();           
     }
}
0 голосов
/ 03 июля 2010

Мой пост здесь показывает, как заставить вашу службу Windows устанавливать себя из командной строки, используя параметр -install. Вы можете расширить эту логику, добавив параметр -start, а затем создать ярлык на рабочем столе, включающий этот параметр.

...