У меня есть стандартная .NET служба Windows, написанная на C #.
Может ли он установить себя без использования InstallUtil? Должен ли я использовать класс установщика службы? Как я должен использовать это?
Я хочу иметь возможность позвонить следующее:
MyService.exe -install
И это будет иметь тот же эффект, что и вызов:
InstallUtil MyService.exe
c#
.net
deployment
windows-services
installutil
Юваль Пелед
источник
источник
Ответы:
Да, это вполне возможно (т.е. я делаю именно это); вам просто нужно сослаться на правильный dll (System.ServiceProcess.dll) и добавить класс установщика ...
Вот пример:
источник
static void Install(bool undo, string[] args)
вне класса (и т. Д.). Можете ли вы уточнить, как вы это реализовали?Посмотрите на InstallHelper способе ManagedInstaller класса. Вы можете установить сервис, используя:
Это именно то, что делает InstallUtil. Аргументы такие же, как для InstallUtil.
Преимущества этого метода заключаются в том, что в реестре нет путаницы, и он использует тот же механизм, что и InstallUtil.
источник
InstallUtil
нужно 3. вам не нужно менять установщик на x86 / x64 4. он не изменился в нескольких версиях .Net - если он делает , это будет подобрано в тестировании, и я исправлю это тогда.Вы всегда можете вернуться к старым добрым вызовам WinAPI, хотя объем выполняемой работы нетривиален. Нет необходимости устанавливать службы .NET с помощью механизма .NET.
Установить:
OpenSCManager
.CreateService
чтобы зарегистрировать услугу.ChangeServiceConfig2
чтобы установить описание.CloseServiceHandle
.Чтобы удалить:
OpenSCManager
.OpenService
.DeleteService
дескриптор, возвращенныйOpenService
.CloseServiceHandle
.Основная причина, по которой я предпочитаю это использовать
ServiceInstaller
/,ServiceProcessInstaller
заключается в том, что вы можете зарегистрировать службу с помощью собственных аргументов командной строки. Например, вы можете зарегистрировать его как"MyApp.exe -service"
, а затем, если пользователь запускает ваше приложение без каких-либо аргументов, вы можете предложить им пользовательский интерфейс для установки / удаления службы.Запуск Reflector on
ServiceInstaller
может заполнить детали, отсутствующие в этом кратком объяснении.PS Очевидно, что это не будет иметь «того же эффекта, что и вызов: InstallUtil MyService.exe» - в частности, вы не сможете удалить его с помощью InstallUtil. Но, похоже, это не было для вас строгим требованием.
источник
Вот класс, который я использую при написании услуг. У меня обычно есть интерактивный экран, который появляется, когда служба не вызывается. Оттуда я использую класс по мере необходимости. Это позволяет использовать несколько именованных экземпляров на одном компьютере - поэтому поле InstanceID
Образец звонка
Сам класс
источник
GetCurrentProcess
деталь параметром и успешно ее использовал. прекрасно работает!Приведенные выше примеры на самом деле не работают для меня, и ссылка на форум в качестве решения № 1 ужасна. Вот класс, который я написал (частично), а другая часть объединена с этой ссылкой, которую я нашел где-то похороненной
Чтобы установить службу, выполните команду InstallAndStart следующим образом:
Убедитесь, что у учетной записи, на которой запущена программа, есть разрешение на установку служб. Вы всегда можете запустить программу от имени администратора.
Я также включил несколько команд для доступа без API, которые не устанавливают и не удаляют службы, но вы можете перечислить их и управлять несколькими (запуск, остановка, перезапуск). Вам действительно нужно только повысить разрешения на установку или удаление служб.
Также есть пара команд для получения и установки переменных среды, таких как
OPENSSL_CONF
илиTEMP
. По большей части параметры и имена методов должны быть достаточно понятными.источник
Unknown = -1, NotFound = 0, Stopped = 1, StartPending = 2, StopPending = 3, Running = 4
В случае попытки установить приложение командной строки в качестве службы Windows, попробуйте утилиту NSSM . Связанные подробности ServerFault найдены здесь .
источник
источник