Самый простой язык для создания службы Windows
На каком языке проще всего создавать службы Windows?
Самый простой в этом случае будет определен как наименьшее количество кода и самая низкая точка входа в язык.
6 ответов
С риском констатировать очевидное, если у вас есть какой-либо опыт работы с 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. Когда вы запустите службу, ваши сообщения журнала появятся в журнале событий приложений.
Я согласен со всеми, кто ответил в другом месте, но я бы сказал, что не слишком сосредотачивайтесь на реальном языке, пока вы работаете в.NET Framework и у вас есть стартовый проект, вы хорошо идти. В прошлом я сделал несколько "служб Windows" и разработал их как на VB.NET, так и на C# с минимальным количеством кода.
Я бы порекомендовал OP сделать так, чтобы он научился создавать для него пакет установщика. Установить службу так же просто, как выполнить "installutil.exe {диск}\path\to\file.exe", но когда вам нужно сделать что-то большее, чем развертывание службы Windows "hello world", полезно знать и понимать, как действительно разверните службу осмысленно.
Не для того, чтобы начать пламенную войну, но я "стандартизировал" использование WiX для всех моих пакетов развертывания, за исключением того, чтобы делать старомодные вещи типа COM-взаимодействия, так как это большая часть работы по правильной установке. Я с нетерпением жду, чтобы команда WiX разработала загрузчик, который позволит вам поместить необходимые компоненты и основной файл MSI в EXE-файл, который можно загрузить. Они рассчитаны на 3.5, поэтому я терпеливо подожду и пока воспользуюсь самораспаковывающимися исполняемыми файлами WinZip.
Проект службы Windows в C# предоставит вам полностью развертываемый сервис из шаблона Visual Studio одним нажатием кнопки. Вам просто нужно добавить свой код полезной нагрузки.
Для меня, и я только попробовал это несколькими способами, Visual Studio и C# были самыми простыми.
Visual Studio выполнила все необходимые настройки служебных соединений для инфраструктуры, и я обнаружил, что C# очень прост в освоении, переходя с VB6, VB.NET и C.
С Visual C# вы найдете большинство примеров кода в сети. В сочетании с Visual Studio вы можете прогуляться по парку, чтобы получить базовую службу Windows. Visual Studio также упрощает создание пакета установщика MSI.
Это был бы мой выбор
Используйте тип проекта Visual Studio Service, используйте C# или VB.NET.
Я лично предпочитаю C#, но в целом легко понять жизненный цикл и кодировать логику на нужном этапе.
Сборка установщика также очень проста.