пятница, 24 декабря 2010 г.

Установка, удаление службы Windows из кода .NET приложения

В приложении нужно определить public классы, унаследованные от System.ServiceProcess.ServiceBase и System.Configuration.Install.Installer. Для наследника ServiceInstaller нужно указать атрибут [RunInstaller(true)]. Эти классы описывают службу. Установка и удаление выполняется статическими методами класса System.Configuration.Install.ManagedInstallerClass. О ManagedInstallerClass в MSDN написано только то, что это класс для внутренних нужно .NET Framework и он не предназначен для непосредственного вызова из кода пользователя. Пример использования этого класса можно найти в реализации утилит, которые поставляются вместе с .NET Framework.

Полный пример кода:


 1 using System;
 2 using System.ComponentModel;
 3 using System.Configuration.Install;
 4 using System.Reflection;
 5 using System.ServiceProcess;
 6 
 7 namespace ServiceInstallerTemplate
 8 {
 9     public class Service : ServiceBase
10     {
11         public Service()
12         {
13             ServiceName = "UniqueServiceName";
14         }
15     }
16 
17     [RunInstaller(true)]
18     public class ServiceInstaller : Installer
19     {
20         public ServiceInstaller()
21         {
22             var serviceProcessInstaller = new ServiceProcessInstaller();
23 
24             serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
25             serviceProcessInstaller.Username = null;
26             serviceProcessInstaller.Password = null;
27 
28             var serviceInstaller = new System.ServiceProcess.ServiceInstaller();
29 
30             serviceInstaller.DisplayName = "Service user friendly name";
31             serviceInstaller.Description = "Service description";
32             serviceInstaller.StartType = ServiceStartMode.Automatic;
33 
34             /* This must be identical to the System.ServiceProcess.ServiceBase.ServiceName*/
35             serviceInstaller.ServiceName = "UniqueServiceName";
36 
37             Installers.Add(serviceProcessInstaller);
38             Installers.Add(serviceInstaller);
39         }
40     }
41     
42     class Program
43     {
44         static void Main(string[] args)
45         {
46             var exeFileName = Assembly.GetExecutingAssembly().Location;
47 
48             if (args.Length != 1)
49                 WriteHelp();
50             else if (args[0] == "--install")
51                 ManagedInstallerClass.InstallHelper(new[] { exeFileName });
52             else if (args[0] == "--uninstall")
53                 ManagedInstallerClass.InstallHelper(new[] { "/u", exeFileName });
54             else 
55                 WriteHelp();
56         }
57 
58         static void WriteHelp()
59         {
60             Console.WriteLine("Use:");
61             Console.WriteLine("--install   - install service");
62             Console.WriteLine("--uninstall - uninstall service");
63         }
64     }
65 }

3 комментария:

  1. Добрый день! А есть ли возможность устанавливать в качестве сервисов сторонние приложения с помощью этих классов? Например хочу из кода .net установить в качестве службы сторонний exe.

    ОтветитьУдалить
  2. Здравствуйте. Нет, нельзя. Для того чтобы работали эти классы exe должен быть .NET сборкой и содержать определение наследника System.Configuration.Install.Installer. С помощью этих классов можно создать сервис-обертку, который при запуске будет запускать ваш exe, или, например, python-скрипт. Но это нужно в редких случаях, когда нужно взаимодействие с запущенной программой. Если просто нужно сделать сервис из произвольной программы, то посмотрите, например, вот это http://www.tacktech.com/display.cfm?ttid=197

    ОтветитьУдалить