Ответ 1
Если вы указали очевидное, если у вас есть фон C/С++/Java, я думаю, что С# предлагает вам самую низкую точку входа.
Предполагая, что вы используете Visual Studio 2008, вы можете выполнить следующие действия:
- Откройте Visual Studio 2008 и выберите пункт меню "Файл | Новый | Проект".
- В диалоговом окне "Новый проект"...
- Выберите типы Visual С# | Windows node в типах проекта
- Выберите шаблон службы Windows
- Введите имя и местоположение для вашего проекта.
- Нажмите OK
- На этом этапе у вас есть все основы для службы Windows. Файл Program.cs содержит метод Main() для вашей службы, а Service1.cs определяет компонент System.ServiceProcess.ServiceBase, который является вашей новой службой Windows.
- В компоненте Property Grid для вашего компонента Service1 рассмотрите возможность установки следующих свойств как минимум:
- (Name) - дать объекту интуитивное имя, например ServiceExample
- AutoLog - установить на
false
, чтобы предотвратить запись событий по умолчанию в журнал событий приложений (Примечание: я не говорю, что вы не должны регистрировать события службы, я просто предпочитаю писать в свой собственный журнал событий вместо журнал приложений - см. ниже) - CanShutdown - установить
true
, если вы хотите обрабатывать остановки системы - ServiceName - определяет имя, с помощью которого ваша служба будет известна диспетчеру управления службами (SCM)
- В коде для ServiceExample виртуальные функции OnStart() и OnStop() вычеркнуты. Вам нужно будет заполнить их тем, что необходимо для вашего обслуживания. Если вы изменили свойство CanShutdown на
true
, вы также захотите переопределить метод OnShutdown. Я привел пример, иллюстрирующий использование этих функций. - На этом этапе сервис ServiceExample по существу завершен, но вам все равно нужен способ его установки. Для этого откройте компонент DesignExample в дизайнере. Щелкните правой кнопкой мыши в любом месте панели дизайнера и выберите пункт меню "Добавить установщик". Это добавляет компонент ProjectInstaller к вашему проекту, который содержит два дополнительных компонента: serviceProcessInstaller1 и serviceInstaller1.
- Выберите компонент serviceProcessInstaller1 в дизайнере. В Property Grid рассмотрите настройку следующих свойств:
- (Name) - дать вашему объекту интуитивное имя, например serviceProcessInstaller
- Учетная запись - выберите учетную запись LocalService как минимум, но вам может потребоваться использовать учетную запись NetworkService или LocalSystem, если ваша служба требует больше привилегий.
- Выберите компонент serviceInstaller1 в дизайнере. В Property Grid рассмотрите настройку следующих свойств:
- (Имя) - дать объекту интуитивное имя, например, 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 в средстве просмотра событий и увидеть там зарегистрированные сообщения.
Надеюсь, что это поможет.
EDIT: если вы предпочитаете использовать журнал событий приложений для ведения журнала событий вместо пользовательского, просто не делайте никаких изменений в файле ProjectInstaller.cs. Кроме того, оставьте строку, которая задает свойство журнала EventLog в конструкторе ServiceExample. При запуске службы сообщения журнала появятся в журнале событий приложений.