Не запускается приложение из службы Windows (C#)

300
01 ноября 2017, 00:41

Добрый день! Я написал два C# проекта: службу и консольное приложение. Смысл службы заключается в том, чтобы постоянно следить за приложением и в случае его выключения снова запускать (разрабатываю не вирус!). Исходный код запуска таков:

private static void launch()
{
    var p = new Process
    {
        EnableRaisingEvents = true,
        StartInfo = new ProcessStartInfo
        {
            FileName = appPath
        }
    };
    p.Exited += launchAgain;
    p.Start();
}
private static void launchAgain(object sender, EventArgs e)
{
    launch();
}

где appPath - путь консольного приложения

Проблема в том, что если написать это в консольном приложении, а не службе, то все работает. Через службу, в принципе, тоже все работает. Но проблема заключается в том, что процесс консольного приложение отображается в диспетчере задач, но не отображается сама консоль.

Пробовал баловаться с параметрами CreateNoWindow и UseShellExecute у StartInfo - безрезультатно.

Answer 1

Служба и UI - вещи несовместимые. Конечно, в системе есть костыли способы которые позволяют делать службы со своим UI, но это концептуально неправильно. Выбрав вариант "служба с UI", вам придется решать проблемы "а что если пользователь вышел из системы", "а что если в системе два сеанса активно", "а что если у текущего пользователя нет прав" и т.п.

Если вам нужно взаимодействие с пользователем - значит, вашим выбором должна стать обычная программа, которую вы будете запускать одним из трех способов:

  1. через планировщик заданий;
  2. через ключ реестра HKCU\Software\Microsoft\Windows\CurrentVersion\Run;
  3. через папку "автозагрузка".

Чтобы сделать программу у которой не будет своего интерфейса, можно проступить так:

  1. создать новый консольный проект, после чего в свойствах переключить тип проекта на "оконное приложение";
  2. создать новый проект winforms, после чего удалить из него единственную форму (также имеет смысл удалить ссылку на сборку System.Windows.Forms);
  3. также вы можете переделать вашу службу в обычное приложение без UI удалив из проекта компонент-наследник ServiceBase и стерев все лишнее в Main (также не будет лишним удалить ссылку на сборку System.ServiceProcess).
READ ALSO
Применение Clang в C#

Применение Clang в C#

Прошу помощи с библиотекой Clang, а точнее с её вариантами на C#Пробовал CppSharp и ClangSharp

226
Смена материала объекта в Unity

Смена материала объекта в Unity

Пытаюсь изменить материал объекта через код

225
Как удалить все одинаковые строки из файла txt?

Как удалить все одинаковые строки из файла txt?

Как-то спрашивал такой вопрос: убрать повторы строк из txt

280