Служба Windows без вмешательства Visual Studio - PullRequest
11 голосов
/ 09 февраля 2011

Я хотел бы создавать приложение Windows Service и управлять им без «помощи» дизайнера Visual Studio.

Поскольку это .NET, и, судя по MSDN и тому, что делает дизайнер, это означает наследование от Installer, построение и обработку ServiceProcessInstaller и ServiceInstaller для управления установкой.время выполнения serivce.

Runtime, это означает создание подкласса ServiceBase и запуск его с Main с использованием ServiceBase.Run (и переопределение различных ServiceBase методов обработки событий).

Однако, когда я делаю это, Visual Studio настаивает на том, чтобы относиться к подклассам Installer и ServiceBase как к редактируемым дизайнером файлам.Это не совсем помогает читабельности, не говоря уже о том, что вообще не может иметь дело с рукописным кодом. Я бы хотел, чтобы конструктор не позволял сохранять управляемость (чтобы избежать туманного «кто знает что запускает, когда», особенно для кода, который сложно тестировать и отлаживать, например, службы Windows, которые, в конце концов, должен * быть установлен , чтобы запускаться вообще), а также иметь возможность указывать имя службы во время выполнения, а не во время компиляции - дизайнер не поддерживает это.

Какя могу создать приложение-службу Windows без всего этого?

Ответы [ 4 ]

10 голосов
/ 23 марта 2016

ServiceBase является производным от Component. Чтобы отключить представление конструктора, вы можете прикрепить атрибут так:

[System.ComponentModel.DesignerCategory("Code")]
public class MyService : ServiceBase
{

}
5 голосов
/ 09 февраля 2011

Поскольку я часто создаю сервисы, делайте это так:

У меня есть общий базовый класс, который выглядит так:

internal class ServiceRunner : ServiceBase {
   protected static void Startup(string[] args, ServiceRunner instance, bool interactiveWait) {    
    if (instance == null)
        throw new ArgumentNullException("instance");

    if (Environment.UserInteractive) {
        instance.OnStart(args);
        if (interactiveWait) {
            Console.WriteLine("Press any key to stop service");
            Console.ReadKey();
        }
        instance.OnStop();
    }
    else
        Run(instance);
}

Затем я создаю все свои сервисы, подобные этой

internal class MyService : ServiceRunner
{
    public MyService() {
        ServiceName = ConfigurationManager.AppSettings["MyServiceName"];
    }

    private static void Main(string[] args) {
        Startup(args, new MyService(), true);
    }

    protected override void OnStart(string[] args) {
        base.OnStart(args);
        ...
    }

    protected override void OnStop() {
        ...
        base.OnStop();
    }
}

Теперь я могу проверить сервис, просто запустив его в отладчике или в командной строке.

При установке я использую командную строку

sc create ServiceName binPath= C:\...\MyService.exe

(я не смог остановить конструктор при двойном щелчке)

2 голосов
/ 09 февраля 2011

Ну, просто удалите вызов InitializeComponent () в конструкторе, и сгенерированный дизайнером код вам не по вкусу.

0 голосов
/ 09 февраля 2011

VS добавляет некоторые дополнительные вещи, но я бы не стал беспокоиться об этом. Вот учебник по созданию простого сервиса вручную в VS2005, он должен прекрасно работать и для новых версий.

http://www.codeproject.com/KB/system/WindowsService.aspx

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