Запустить приложение Windows Forms как службу?

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

Я подумал ... есть ли способ запустить приложение Windows Forms как службу, чтобы оно запускалось автоматически?

Разъяснение

Я бы хотел попытаться больше не писать код ... если возможно!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
14 595
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Скорее всего, вам будет лучше преобразовать функциональность в набор общих библиотек, а затем создать службу, которая использует эти библиотеки, и установить ее на клиенте.

Хммм ... Значит, нет возможности зайти в службы Windows и заставить его запускать мое приложение как службу?

mattruma 21.01.2009 00:00

Нет, службе требуется класс, производный от класса ServiceBase, и класс ServiceInstaller для установки в службах Windows.

Ricardo Villamil 21.01.2009 00:07

Если у вас есть хорошая развязанная функциональность в приложении форм, должно быть несложно создать класс службы с его установщиком, а затем запустить класс процессора в методе 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 - AnandaGopal Pardue 21.01.2009 00:15

EnocNRoll прав! Не используйте материалы из этой статьи. Он давно устарел и не представляет особой ценности.

Stephen Martin 21.01.2009 01:05

Вы можете использовать InstallUtil для установки вашего приложения как службы, но вам нужно убедиться, что оно не зависит от графического интерфейса пользователя, и я бы рекомендовал вам изменить запуск приложения, чтобы оно не создавало никаких форм.

Чтобы использовать InstallUtil, вам понадобится класс, производный от Installer, вам также потребуются объекты ServiceProcessInstaller () и ServiceInstaller (), определенные в вашем классе установщика. InstallUtil ищет их в вашем exe-проекте.

Ricardo Villamil 21.01.2009 00:10

Может быть, это не InstallUtil, о котором я тогда думаю ... Я определенно установил "нормальное" приложение в качестве службы несколько раз, используя утилиту командной строки. SC звонит в звонок.

Steven Robbins 21.01.2009 00:22
Ответ принят как подходящий

(Этот ответ устарел, поскольку связанная статья была удалена в 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.

Запускайте свои программы Windows из службы NT

Проверьте эту статью: http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=719&av=49654

Это действительно старая статья, но она работает уже 8 лет и продолжает обновляться автором.

Он сделает то, что вы хотите.

Я нашел нечто подобное, что поставляется с Windows Resource Kit ... support.microsoft.com/kb/137890

mattruma 21.01.2009 00:14

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

EnocNRoll - AnandaGopal Pardue 21.01.2009 00:19

Примечание: я подтверждаю, что это взлом, но именно это и ищет MattRuma в данном случае.

EnocNRoll - AnandaGopal Pardue 21.01.2009 03:05

Как это снова получило 1 голос? Я проголосовал до 2 пару часов назад и не вижу причин отклонять его.

Stephen Martin 21.01.2009 04:09

Связанная статья больше не доступна.

RMuesi 01.01.2019 23:32

Вы все еще можете найти статью о машине WayBack: web.archive.org/web/20111228050501/http://www.codeproject.co‌ м /…

Claudio Nastasi Junior 01.11.2019 23:52

К сожалению, загрузка исходного кода Zip-файла не работает по ссылке на машину WayBack, но исходный файл CPP можно просмотреть.

EnocNRoll - AnandaGopal Pardue 06.11.2019 22:23

Вы можете запустить приложение winforms как службу, вы просто не сможете его увидеть - оно будет отображаться на так называемом виртуальном рабочем столе, который нельзя просмотреть на вашем мониторе.

Это то, чем я хочу заниматься.

mattruma 21.01.2009 00:31

хорошо, круто, тогда можно не беспокоиться о запуске потока пользовательского интерфейса без контекста входа в систему? большой! Тогда теоретически должна работать любая из двух опубликованных статей.

EnocNRoll - AnandaGopal Pardue 21.01.2009 00:55

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

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

Но, безусловно, лучшее решение - отделить функциональность вашей программы от пользовательского интерфейса и написать надлежащую службу. А для производственного сервера я бы ничего другого не допустил. Если разделить непросто, значит, у вас есть некоторые проблемы с дизайном, на которые все равно стоит обратить внимание.

Я предположил, что MattRuma просто ищет быстрый способ сделать это возможным. В остальном я полностью согласен. Однако битва за то, чтобы все делать правильно, вряд ли когда-либо выигрывается после того, как что-то находится в производстве.

EnocNRoll - AnandaGopal Pardue 21.01.2009 01:16

Да ... Я ищу быстрых и грязных ... У меня нет ни роскоши, ни времени, чтобы сделать это правильно ... по крайней мере, прямо сейчас.

mattruma 21.01.2009 01:18

Да, я знаю, каково это. Тогда просто используйте XYNTService или Task Scheduler, но на самом деле очень внимательно проверьте свое приложение на любые возможные проблемы с пользовательским интерфейсом без присмотра.

Stephen Martin 21.01.2009 01:23

Вы также можете рассмотреть коммерческое приложение AlwaysUp, которое будет запускать любое приложение как службу Windows. Он похож на XYNTService (упомянутый EnocNRoll), но имеет больше функций и полностью поддерживается.

Удачи!

Другие вопросы по теме