С риском констатировать очевидное, если у вас есть какой-либо опыт работы с C / C ++ / Java, я думаю, что C # предлагает вам самую низкую точку входа.
Предполагая, что вы используете Visual Studio 2008, вы можете выполнить следующие действия:
- Откройте Visual Studio 2008 и выберите пункт меню «Файл | Новый | Проект».
- В диалоге Новый проект ...
- Выберите узел Visual C # | Windows в типах проектов
- Выберите шаблон службы Windows
- Введите имя и местоположение для вашего проекта
- Нажмите ОК
- На данный момент у вас есть все основы для службы Windows. Файл Program.cs содержит метод Main () для вашей службы, а Service1.cs определяет компонент System.ServiceProcess.ServiceBase, который является вашей новой службой Windows.
- В таблице свойств для вашего компонента Service1 рассмотрите возможность установки как минимум следующих свойств:
- (Имя) - дать вашему объекту интуитивно понятное имя, например, ServiceExample
- AutoLog - установите значение
false
, чтобы предотвратить запись событий по умолчанию в журнал событий приложений (Примечание: я не говорю, что вы не должны регистрировать события службы; я просто предпочитаю записывать в свой собственный журнал событий вместо Журнал приложения - см. ниже)
- CanShutdown - установите на
true
, если вы хотите обрабатывать выключения системы
- ServiceName - определяет имя, под которым ваша служба будет известна диспетчеру управления службами (SCM)
- В коде для ServiceExample виртуальные функции OnStart () и OnStop () заглушены. Вам нужно будет заполнить их тем, что необходимо сделать вашей службе. Если вы изменили свойство CanShutdown на
true
, вы также захотите переопределить метод OnShutdown. Ниже я создал пример, иллюстрирующий использование этих функций.
- На данный момент служба ServiceExample практически завершена, но вам все еще нужен способ ее установки. Для этого откройте компонент ServiceExample в конструкторе. Щелкните правой кнопкой мыши в любом месте панели дизайнера и выберите пункт меню «Добавить установщик». Это добавляет компонент ProjectInstaller в ваш проект, который содержит два дополнительных компонента - serviceProcessInstaller1 и serviceInstaller1.
- Выберите компонент serviceProcessInstaller1 в конструкторе. В таблице свойств рассмотрите возможность установки следующих свойств:
- (Имя) - дать вашему объекту интуитивно понятное имя, например, serviceProcessInstaller
- Учетная запись - выберите учетную запись LocalService как минимум, но вам может потребоваться использовать учетную запись NetworkService или LocalSystem, если вашей службе требуются дополнительные привилегии
- Выберите компонент serviceInstaller1 в конструкторе. В таблице свойств рассмотрите возможность установки следующих свойств:
- (Имя) - дать объекту интуитивно понятное имя, например, serviceInstaller
- Описание - описание услуги, которое будет отображаться в SCM для вашей услуги
- DisplayName - понятное имя для вашего сервиса, которое будет отображаться в SCM для вашего сервиса
- ServiceName - убедитесь, что это то же имя, которое вы выбрали для свойства ServiceName вашего компонента ServiceExample (см. Шаг 4)
- StartType - укажите, хотите ли вы, чтобы служба запускалась автоматически или вручную
- Помните, что я сказал, что предпочитаю записывать события в свой собственный журнал событий вместо журнала событий приложения. Для этого вам необходимо заменить стандартный EventLogInstaller в ProjectInstaller на собственный. Сделайте ваш код для ProjectInstaller похожим на это:
using System.Diagnostics;
[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
public ProjectInstaller()
{
InitializeComponent();
EventLogInstaller installer = FindInstaller(this.Installers);
if (installer != null)
{
installer.Log = "ServiceExample"; // enter your event log name here
}
}
private EventLogInstaller FindInstaller(InstallerCollection installers)
{
foreach (Installer installer in installers)
{
if (installer is EventLogInstaller)
{
return (EventLogInstaller)installer;
}
EventLogInstaller eventLogInstaller = FindInstaller(installer.Installers);
if (eventLogInstaller != null)
{
return eventLogInstaller;
}
}
return null;
}
}
На данный момент вы можете построить свой проект, чтобы получить исполняемый файл службы Windows. Чтобы установить службу, откройте командную строку Visual Studio 2008 и перейдите в каталог Debug или Release, где находится ваш исполняемый файл. В командной строке введите следующее: InstallUtil ServiceExample.exe . Это установит ваш сервис на локальном компьютере. Чтобы удалить его, введите в командной строке следующую команду: InstallUtil / u ServiceExample.exe
Пока ваша служба не запущена, вы можете вносить изменения в свою службу и перестраивать ее, т. Е. Вам не нужно удалять службу, чтобы вносить в нее изменения. Однако вы не сможете перезаписать исполняемый файл своими исправлениями и улучшениями, пока он работает.
Чтобы увидеть вашу службу в действии, откройте файл ServiceExample.cs и внесите следующие изменения:
using System.Diagnostics;
public partial class ServiceExample : ServiceBase
{
public ServiceExample()
{
// Uncomment this line to debug the service.
//Debugger.Break();
InitializeComponent();
// Ties the EventLog member of the ServiceBase base class to the
// ServiceExample event log created when the service was installed.
EventLog.Log = "ServiceExample";
}
protected override void OnStart(string[] args)
{
EventLog.WriteEntry("The service was started successfully.", EventLogEntryType.Information);
}
protected override void OnStop()
{
EventLog.WriteEntry("The service was stopped successfully.", EventLogEntryType.Information);
}
protected override void OnShutdown()
{
EventLog.WriteEntry("The service was shutdown successfully", EventLogEntryType.Information);
}
}
Как только вы запустите свою службу с этими изменениями, вы можете просмотреть журнал событий ServiceExample в средстве просмотра событий и просмотреть записанные там сообщения.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: Если вы предпочитаете использовать журнал событий приложения для ведения журнала событий вместо пользовательского, просто не вносите изменений в файл ProjectInstaller.cs. Кроме того, пропустите строку, которая устанавливает свойство Log EventLog в конструкторе ServiceExample. Когда вы запускаете службу, ваши сообщения журнала появляются в журнале событий приложений.