У меня есть консольное приложение, и я хотел бы запустить его как службу Windows. VS2010 имеет шаблон проекта, который позволяет присоединить консольный проект и построить сервис Windows. Я не хотел бы добавлять отдельный сервисный проект и, если возможно, интегрировать сервисный код в консольное приложение, чтобы консольное приложение оставалось как один проект, который мог бы работать как консольное приложение или как служба Windows, если он запускается, например, из командной строки с помощью переключателей.
Может быть, кто-то может предложить библиотеку классов или фрагмент кода, который может быстро и легко преобразовать консольное приложение c # в службу?
Ответы:
Я обычно использую следующую технику для запуска того же приложения, что и консольное приложение или как служба:
Environment.UserInteractive
обычно верно для консольного приложения и false для службы. Технически, можно запустить службу в интерактивном режиме, так что вы можете вместо этого проверить переключатель командной строки.источник
Я имел большой успех с TopShelf .
TopShelf - это пакет Nuget, разработанный для упрощения создания приложений .NET Windows, которые могут работать как консольные приложения или как службы Windows. Вы можете быстро подключить такие события, как события запуска и остановки вашей службы, настроить с помощью кода, например, настроить учетную запись, с которой она работает, настроить зависимости от других служб и настроить способ восстановления после ошибок.
Из консоли диспетчера пакетов (Nuget):
Обратитесь к примерам кода, чтобы начать.
Пример:
TopShelf также заботится об установке службы, которая может сэкономить много времени и удаляет стандартный код из вашего решения. Чтобы установить .exe в качестве службы, просто выполните следующее из командной строки:
Вам не нужно подключать ServiceInstaller и все такое - TopShelf сделает все за вас.
источник
Итак, вот полное прохождение:
* InstallUtil.exe обычно можно найти здесь: C: \ windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.ex e
Program.cs
MyService.cs
MyServiceInstaller.cs
источник
Я слышал, что вы хотели, чтобы одна сборка остановила повторяющийся код, но это было бы проще и уменьшило бы повторение кода, а также упростило бы повторное использование вашего кода другими способами в будущем, если ...... вам нужно разбить его на 3 сборки.
источник
Start()
иStop()
методы , и приложение консоли имеет петлю. Если не считать фреймворк , такой как TopShelf , это лучший вариантВот новый способ преобразования консольного приложения в службу Windows в качестве рабочей службы на основе новейшей версии .Net Core 3.1. .
Если вы создадите рабочую службу из Visual Studio 2019, она предоставит вам практически все, что вам нужно для создания службы Windows из коробки, что также необходимо изменить в консольном приложении, чтобы преобразовать его в службу Windows.
Вот изменения, которые вам нужно сделать:
Установите следующие пакеты NuGet
Измените Program.cs для реализации, как показано ниже:
и добавьте Worker.cs, куда вы поместите код, который будет выполняться операциями службы:
Когда все готово и приложение успешно собрано , вы можете использовать sc.exe для установки exe своего консольного приложения в качестве службы Windows с помощью следующей команды:
источник
Ты можешь использовать
И это появится в списке услуг. Я не знаю, правильно ли это работает, хотя. Служба обычно должна прослушивать несколько событий.
Однако есть несколько сервисных оболочек, которые могут запускать любое приложение как реальный сервис. Например, Microsoft SrvAny из комплекта ресурсов Win2003
источник
Сначала я встраиваю консольное приложение в решение для службы Windows и ссылаюсь на него.
Затем я делаю консольный класс программы приложения общедоступным.
Затем я создаю две функции в консольном приложении
Затем в самой службе Windows я создаю экземпляр Программы и вызываю функции Start и Stop, добавленные в OnStart и OnStop. Увидеть ниже
Этот подход также можно использовать для гибридного приложения Windows / службы Windows.
источник
Возможно, вам следует определить, что вам нужно, насколько я знаю, вы не можете одновременно запускать ваше приложение как консоль или службу с командной строкой. Помните, что служба установлена, и вы должны запустить ее в диспетчере служб, вы можете создать новое приложение, которое запустит службу или запустит новый процесс, выполняющий ваше консольное приложение. Но как вы написали
Однажды я оказался на вашем месте, превратив консольное приложение в сервис. Сначала вам нужен шаблон, если вы работаете с VS Express Edition. Вот ссылка, где вы можете сделать свои первые шаги: C # Windows Service , это было очень полезно для меня. Затем, используя этот шаблон, добавьте свой код к нужным событиям сервиса.
Чтобы улучшить свой сервис, есть еще одна вещь, которую вы можете сделать, но это не быстро и / или легко, это использование доменов приложений и создание библиотек DLL для загрузки / выгрузки. В одном вы можете запустить новый процесс с помощью консольного приложения, а в другом dll вы можете просто добавить функциональность, которую должен выполнять сервис.
Удачи.
источник
Вы должны разделить функциональность на класс или классы и запустить их через одну из двух заглушек. Заглушка консоли или служебная заглушка.
Как видно, при запуске окон множество сервисов, составляющих инфраструктуру, не (и не могут напрямую) предоставлять пользователю консольные окна. Служба должна общаться с пользователем не графическим способом: через SCM; в журнале событий, в некоторый файл журнала и т. д. Служба также должна будет обмениваться данными с окнами через SCM, в противном случае она отключится.
Очевидно, было бы приемлемо иметь какое-то консольное приложение, которое может взаимодействовать со службой, но служба должна работать независимо, без необходимости взаимодействия с графическим интерфейсом.
Заглушка консоли может быть очень полезна для отладки поведения службы, но ее не следует использовать в «производственной» среде, которая, в конце концов, является целью создания службы.
Я не прочитал это полностью, но эта статья, кажется, сдать в правильном направлении.
источник
Я использую класс обслуживания, который следует стандартному шаблону, предписанному
ServiceBase
, и использую помощников для легкой отладки F5. Благодаря этому данные сервиса определяются в сервисе, что облегчает их поиск и управление жизненным циклом.Я обычно создаю приложение для Windows со структурой ниже. Я не создаю консольное приложение; таким образом, я не получаю большой черный ящик каждый раз, когда я запускаю приложение. Я остаюсь в отладчике, где все действия. я использую
Debug.WriteLine
так, чтобы сообщения отправлялись в окно вывода, которое хорошо стыкуется и остается видимым после завершения работы приложения.Я обычно не пытаюсь добавить код отладки для остановки; Я просто использую отладчик вместо этого. Если мне нужно отладить остановку, я делаю проект консольным приложением, добавляю
Stop
метод пересылки и вызываю его после вызоваConsole.ReadKey
.источник