Самый простой язык для создания службы Windows - PullRequest
51 голосов
/ 27 февраля 2009

На каком языке проще всего создавать службы Windows?

Самый простой в этом случае будет определяться как наименьшее количество кода и самая низкая точка входа в язык.

Ответы [ 6 ]

176 голосов
/ 27 февраля 2009

С риском констатировать очевидное, если у вас есть какой-либо опыт работы с C / C ++ / Java, я думаю, что C # предлагает вам самую низкую точку входа.

Предполагая, что вы используете Visual Studio 2008, вы можете выполнить следующие действия:

  1. Откройте Visual Studio 2008 и выберите пункт меню «Файл | Новый | Проект».
  2. В диалоге Новый проект ...
    • Выберите узел Visual C # | Windows в типах проектов
    • Выберите шаблон службы Windows
    • Введите имя и местоположение для вашего проекта
    • Нажмите ОК
  3. На данный момент у вас есть все основы для службы Windows. Файл Program.cs содержит метод Main () для вашей службы, а Service1.cs определяет компонент System.ServiceProcess.ServiceBase, который является вашей новой службой Windows.
  4. В таблице свойств для вашего компонента Service1 рассмотрите возможность установки как минимум следующих свойств:
    • (Имя) - дать вашему объекту интуитивно понятное имя, например, ServiceExample
    • AutoLog - установите значение false, чтобы предотвратить запись событий по умолчанию в журнал событий приложений (Примечание: я не говорю, что вы не должны регистрировать события службы; я просто предпочитаю записывать в свой собственный журнал событий вместо Журнал приложения - см. ниже)
    • CanShutdown - установите на true, если вы хотите обрабатывать выключения системы
    • ServiceName - определяет имя, под которым ваша служба будет известна диспетчеру управления службами (SCM)
  5. В коде для ServiceExample виртуальные функции OnStart () и OnStop () заглушены. Вам нужно будет заполнить их тем, что необходимо сделать вашей службе. Если вы изменили свойство CanShutdown на true, вы также захотите переопределить метод OnShutdown. Ниже я создал пример, иллюстрирующий использование этих функций.
  6. На данный момент служба ServiceExample практически завершена, но вам все еще нужен способ ее установки. Для этого откройте компонент ServiceExample в конструкторе. Щелкните правой кнопкой мыши в любом месте панели дизайнера и выберите пункт меню «Добавить установщик». Это добавляет компонент ProjectInstaller в ваш проект, который содержит два дополнительных компонента - serviceProcessInstaller1 и serviceInstaller1.
  7. Выберите компонент serviceProcessInstaller1 в конструкторе. В таблице свойств рассмотрите возможность установки следующих свойств:
    • (Имя) - дать вашему объекту интуитивно понятное имя, например, serviceProcessInstaller
    • Учетная запись - выберите учетную запись LocalService как минимум, но вам может потребоваться использовать учетную запись NetworkService или LocalSystem, если вашей службе требуются дополнительные привилегии
  8. Выберите компонент serviceInstaller1 в конструкторе. В таблице свойств рассмотрите возможность установки следующих свойств:
    • (Имя) - дать объекту интуитивно понятное имя, например, serviceInstaller
    • Описание - описание услуги, которое будет отображаться в SCM для вашей услуги
    • DisplayName - понятное имя для вашего сервиса, которое будет отображаться в SCM для вашего сервиса
    • ServiceName - убедитесь, что это то же имя, которое вы выбрали для свойства ServiceName вашего компонента ServiceExample (см. Шаг 4)
    • StartType - укажите, хотите ли вы, чтобы служба запускалась автоматически или вручную
  9. Помните, что я сказал, что предпочитаю записывать события в свой собственный журнал событий вместо журнала событий приложения. Для этого вам необходимо заменить стандартный 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. Когда вы запускаете службу, ваши сообщения журнала появляются в журнале событий приложений.

4 голосов
/ 27 февраля 2009

Я согласен со всеми, кто откликнулся в другом месте, но я бы сказал, что не слишком сосредотачивайтесь на реальном языке, пока вы работаете в .NET Framework, и для вас есть стартовый проект, вы хорошо идти. В прошлом я сделал несколько «служб Windows» и разработал их как на VB.NET, так и на C # с минимальным кодом.

То, что я бы порекомендовал OP, это узнать, как создать для него пакет установщика. Установить службу так же просто, как выполнить «installutil.exe {диск} \ path \ to \ file.exe», но когда вам нужно сделать что-то большее, чем развертывание службы Windows «hello world», полезно знать и понимать, как действительно разверните службу осмысленно.

Не начинать пламенную войну, но я "стандартизировал" использование WiX для всех моих пакетов развертывания, за исключением того, чтобы делать старомодные вещи типа COM-взаимодействия, поскольку это большая нагрузка получить правильно установить. Я с нетерпением жду, чтобы команда WiX разработала загрузчик, который позволит вам поместить предварительные требования и основной файл MSI в EXE-файл, который можно загрузить. Они рассчитаны на 3,5, поэтому я терпеливо подожду и пока воспользуюсь самораспаковывающимися исполняемыми файлами WinZip.

0 голосов
/ 27 февраля 2009

Проект службы Windows в C # предоставит вам полностью развертываемый сервис из шаблона Visual Studio одним нажатием кнопки. Вам просто нужно добавить свой код полезной нагрузки.

0 голосов
/ 27 февраля 2009

Используйте тип проекта Visual Studio Service, используйте C # или VB.NET.

Я лично предпочитаю C #, но в целом легко понять жизненный цикл и кодировать логику на нужном этапе.

Сборка установщика также очень проста.

0 голосов
/ 27 февраля 2009

С Visual C # вы найдете большинство примеров кода в сети. В сочетании с Visual Studio, это прогулка по парку для запуска и запуска базовой службы Windows Visual Studio также упрощает создание пакета установщика MSI.

Это был бы мой выбор

0 голосов
/ 27 февраля 2009

Для меня, и я пробовал это только несколькими способами, Visual Studio и C # были самыми простыми.

Visual Studio выполнила все необходимые настройки служебных соединений для платформы, и я обнаружил, что C # очень прост в изучении, переходя с VB6, VB.NET и C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...