Дважды щелкните, чтобы запустить службу Windows

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

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

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

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

Спасибо.


person Josh    schedule 03.07.2010    source источник


Ответы (4)


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

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

(полное раскрытие, я один из авторов проекта)

person Chris Patterson    schedule 03.07.2010
comment
Пробовал ваш проект ... но аргумент SERVICE не работает. Это похоже на обычную службу Windows. Он говорит -------------------------- - Ошибка запуска службы Windows --------------------------- Не удается запустить службу из командной строки или отладчика. Сначала необходимо установить службу Windows (с помощью installutil.exe), а затем запустить ее с помощью ServerExplorer, инструмента администрирования служб Windows или команды NET START. --------------------------- В ПОРЯДКЕ ---------------------- -----. - person Josh; 06.07.2010
comment
Вам необходимо создать свой собственный EXE, вы можете следить за игрой здесь: topshelf- project.com/documentation/getting-started - person Chris Patterson; 07.07.2010
comment
См. Мой вопрос здесь .... stackoverflow .com / questions / 3256535 /. - person Josh; 15.07.2010

Взгляните на класс 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();
    }
}
person Incognito    schedule 03.07.2010
comment
Мне все еще нужно использовать NET START или SC .... Как мне запустить службу, дважды щелкнув по ней? - person Josh; 06.07.2010
comment
@Josh Вы можете просто удвоить часы для исполняемого файла и запустить службу. Что вы можете сделать, так это просто создать другой исполняемый файл, который будет использовать ServiceController для запуска ваших служб, которые еще не запущены. Вы можете проверить, как это делает MS SQL Server. Есть отдельная программа, которая останавливает и запускает службу, если вы не хотите использовать MMC. - person Incognito; 06.07.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();           
     }
}
person Charles Bretana    schedule 03.07.2010
comment
А как насчет запуска службы? Мне нужно запустить службу, просто дважды щелкнув по ней ... - person Josh; 06.07.2010
comment
@Josh, Используйте класс ServiceController() для запуска и остановки сервисов. Вам нужно будет решить, как написать эту основную подпрограмму, чтобы это сделать ... Это зависит от вас ... - person Charles Bretana; 06.07.2010

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

person Matt Davis    schedule 03.07.2010
comment
вариант -start - это то, что мне действительно нужно. - person Josh; 06.07.2010