.Net Service и Windows App одновременно? - PullRequest
0 голосов
/ 17 июля 2009

Когда вы создаете Службу Windwows, вы получаете файл .exe, который необходимо зарегистрировать, и запускаете его из оснастки «Службы».

Если вы попытаетесь выполнить этот файл .exe, вы получите сообщение: «Невозможно запустить службу из командной строки или отладчика. Сначала необходимо установить службу Windows (с помощью installutil.exe), а затем запустить с помощью ServerExplorer, Windows Средство администрирования служб или команда NET START. "

Можно ли каким-то образом установить что-то в службе, чтобы при запуске в качестве обычного .exe вместо отображения этого сообщения оно выполняло то, что мы можем контролировать в коде? (Например, запустить Sub Main () или что-то в этом роде, очевидно, что это будет точка входа, отличная от той, которую вы получаете, когда запускаете ее в качестве службы)

Спасибо!
Daniel

Ответы [ 4 ]

4 голосов
/ 17 июля 2009

Ну, это возможно, но я не уверен, что это красивое решение:

static void Main()
{
    bool your_condition = ReadRegistry or ReadConfigurationFile;
    if(your_condition)
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new YourService() 
        }
        ServiceBase.Run(ServicesToRun);
    }
    else
    {
        Application.Run(new YourForm())
    }
}

Я не проверял, но думаю, что это сработает.

2 голосов
/ 17 июля 2009

Мы стремимся построить наш аналог Фрэнсиса Б., но используем условную компиляцию:

#if DEBUG
    Application.Run(new YourForm())
#else
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
    { 
        new YourService() 
    }
    ServiceBase.Run(ServicesToRun);
#endif

Таким образом, во время разработки легко тестировать и отлаживать, а затем выполнять развертывание сборки как службу.

Я не уверен по вашему вопросу, хотите ли вы, чтобы он был выпущен как отдельный exe-файл или просто как инструмент, помогающий разработке и тестированию.

Кстати, обратите внимание, что вам не нужно иметь блок application.run () в вашей отладочной версии. Если он не показывает форму, то подойдет любой код, который выполняет бесконечный цикл при создании обработчика OnStart вашего сервиса в отдельном потоке.

1 голос
/ 17 июля 2009

Вы можете написать свое приложение как отдельную библиотеку классов, а затем создать заглушку exe для его запуска?

0 голосов
/ 17 июля 2009

Вы можете передать значение arg.

что-то вроде app.exe -UI или app.exe -Service

...