У меня есть приложение Windows Forms, которое я написал, которое выполняет некоторый мониторинг почтового ящика и базы данных. Клиент сообщил мне, что его нужно запускать каждый раз при перезагрузке сервера. Мне стыдно за то, что я позволил клиенту изменить требования.
Я подумал ... есть ли способ запустить приложение Windows Forms как службу, чтобы оно запускалось автоматически?
Разъяснение
Я бы хотел попытаться больше не писать код ... если возможно!





Единственный способ хотя бы учесть это - убедиться, что в приложении нет элементов пользовательского интерфейса, так как на компьютере, отличном от Vista, вам нужно перепрыгивать через препятствия, чтобы это работало, а в Vista вы не можете взаимодействовать с рабочий стол вообще.
Скорее всего, вам будет лучше преобразовать функциональность в набор общих библиотек, а затем создать службу, которая использует эти библиотеки, и установить ее на клиенте.
Нет, службе требуется класс, производный от класса ServiceBase, и класс ServiceInstaller для установки в службах Windows.
Если у вас есть хорошая развязанная функциональность в приложении форм, должно быть несложно создать класс службы с его установщиком, а затем запустить класс процессора в методе OnStart службы:
protected override void OnStart(string[] args)
{
Processor processor = new Processor();
Thread workerThread = new Thread(processor.OnStart);
workerThread.IsBackground = true;
try
{
workerThread.Start();
}
catch
{
//...
}
}
Нашел этот статья под названием Как создать сервис, определяемый пользователем.
Это должно сработать, но, похоже, это не очень удобное решение. Ссылка, которую я опубликовал, должна обеспечить менее беспорядочный подход.
EnocNRoll прав! Не используйте материалы из этой статьи. Он давно устарел и не представляет особой ценности.
Вы можете использовать InstallUtil для установки вашего приложения как службы, но вам нужно убедиться, что оно не зависит от графического интерфейса пользователя, и я бы рекомендовал вам изменить запуск приложения, чтобы оно не создавало никаких форм.
Чтобы использовать InstallUtil, вам понадобится класс, производный от Installer, вам также потребуются объекты ServiceProcessInstaller () и ServiceInstaller (), определенные в вашем классе установщика. InstallUtil ищет их в вашем exe-проекте.
Может быть, это не InstallUtil, о котором я тогда думаю ... Я определенно установил "нормальное" приложение в качестве службы несколько раз, используя утилиту командной строки. SC звонит в звонок.
(Этот ответ устарел, поскольку связанная статья была удалена в 2012 году. Однако StackOverflow не позволяет удалить принятый ответ. Поэтому, пожалуйста, не голосуйте против этого ответа, поскольку я сообщил вам, что он устарел.)
Альтернативная ссылка: https://web.archive.org/web/20111221041348/http://www.codeproject.com/kb/system/xyntservice.aspx
Исходный код C++ (или используйте вкладку «Обзор кода» в статье): https://web.archive.org/web/20111228050501/http://www.codeproject.com/KB/system/xyntservice.aspx
Unfortunately, the Zip file source code download does not work within the alternative links.
Проверьте эту статью: http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=719&av=49654
Это действительно старая статья, но она работает уже 8 лет и продолжает обновляться автором.
Он сделает то, что вы хотите.
Я нашел нечто подобное, что поставляется с Windows Resource Kit ... support.microsoft.com/kb/137890
Я думаю, что по-прежнему важно проверить это, потому что может быть, что аспект графического интерфейса приложения может дать сбой при запуске, если пользователь не вошел на сервер. В любых предыдущих сценариях, которые у меня были, администраторы настраивали сценарии автоматического входа в систему и просто запускали exe.
Примечание: я подтверждаю, что это взлом, но именно это и ищет MattRuma в данном случае.
Как это снова получило 1 голос? Я проголосовал до 2 пару часов назад и не вижу причин отклонять его.
Связанная статья больше не доступна.
Вы все еще можете найти статью о машине WayBack: web.archive.org/web/20111228050501/http://www.codeproject.co м /…
К сожалению, загрузка исходного кода Zip-файла не работает по ссылке на машину WayBack, но исходный файл CPP можно просмотреть.
Вы можете запустить приложение winforms как службу, вы просто не сможете его увидеть - оно будет отображаться на так называемом виртуальном рабочем столе, который нельзя просмотреть на вашем мониторе.
Это то, чем я хочу заниматься.
хорошо, круто, тогда можно не беспокоиться о запуске потока пользовательского интерфейса без контекста входа в систему? большой! Тогда теоретически должна работать любая из двух опубликованных статей.
Если вы уверены, что приложение может безопасно запускаться без присмотра (я имею в виду, что никогда может вызвать модальный элемент пользовательского интерфейса, такой как окно сообщения), и ему не требуется никакого взаимодействия до завершения работы, когда оно будет просто завершено, затем запустите его. как запланированное задание с триггером, установленным на запуск системы.
Если он может работать без присмотра, но, возможно, его необходимо выключить и перезапустить вручную или его нельзя просто завершить при выключении, тогда используйте XYNTService, как рекомендовано EnocNRoll. Это ужасный взлом, но он будет работать для того, что вы хотите.
Но, безусловно, лучшее решение - отделить функциональность вашей программы от пользовательского интерфейса и написать надлежащую службу. А для производственного сервера я бы ничего другого не допустил. Если разделить непросто, значит, у вас есть некоторые проблемы с дизайном, на которые все равно стоит обратить внимание.
Я предположил, что MattRuma просто ищет быстрый способ сделать это возможным. В остальном я полностью согласен. Однако битва за то, чтобы все делать правильно, вряд ли когда-либо выигрывается после того, как что-то находится в производстве.
Да ... Я ищу быстрых и грязных ... У меня нет ни роскоши, ни времени, чтобы сделать это правильно ... по крайней мере, прямо сейчас.
Да, я знаю, каково это. Тогда просто используйте XYNTService или Task Scheduler, но на самом деле очень внимательно проверьте свое приложение на любые возможные проблемы с пользовательским интерфейсом без присмотра.
Вы также можете рассмотреть коммерческое приложение AlwaysUp, которое будет запускать любое приложение как службу Windows. Он похож на XYNTService (упомянутый EnocNRoll), но имеет больше функций и полностью поддерживается.
Удачи!
Хммм ... Значит, нет возможности зайти в службы Windows и заставить его запускать мое приложение как службу?