Как уже отмечал Дарин, преобразование приложения пользовательского интерфейса в службу Windows является в большинстве случаев не очень хорошей идеей.
При этом, может быть (или есть) крайние случаи, когдаэто может быть полезно.
До сих пор я не пытался сделать это с приложением WinForms, но я предполагаю, что шаги почти идентичны тем, что я когда-то делал.
Я написал бэкэнд-приложение, которое запускается какслужба Windows 99,99% времени, но ее также можно запустить как консольное приложение для более простой и быстрой отладки.
Что нужно сделать:
- запретить запуск приложения несколькими экземплярами (необязательно; см. Эту статью о том, как
- убедитесь, что ваше приложение не полагается на взаимодействие с пользователем
- при запуске приложения, проверьте, работает ли оно как служба Windows или в пользовательском режиме
Вы можете определить, запустил ли пользователь приложение, выполнив запрос Environment.UserInteractive
- который возвращает false
, если он запущен как служба Windows, и true
, когда он запущен в пользовательском режиме.
Ваш основной метод должен выглядеть примерно так:
static void Main()
{
// do common initialization, logging framework + the likes
if (Environment.UserInteractive)
{
// start up in user mode
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new myForm());
}
else
{
// start up as Windows service
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new myService()
};
ServiceBase.Run(ServicesToRun);
}
}