Как автоматически запустить службу после установки?
Как автоматически запустить службу после запуска установки из проекта установки Visual Studio?
Я просто понял это и подумал, что поделюсь ответом для общего блага. Ответ, чтобы следовать. Я открыт для других и лучших способов сделать это.
7 ответов:
добавьте в проект следующий класс.
using System.ServiceProcess; class ServInstaller : ServiceInstaller { protected override void OnCommitted(System.Collections.IDictionary savedState) { ServiceController sc = new ServiceController("YourServiceNameGoesHere"); sc.Start(); } }
проект установки подберет класс и запустит вашу службу после завершения установки.
небольшое дополнение к принятому ответу:
вы также можете получить имя службы, как это-избегая каких-либо проблем, если имя службы изменяется в будущем:
protected override void OnCommitted(System.Collections.IDictionary savedState) { new ServiceController(serviceInstaller1.ServiceName).Start(); }
(каждый установщик имеет ServiceProcessInstaller и ServiceInstaller. Здесь ServiceInstaller называется serviceInstaller1.)
этот подход использует класс установщика и наименьшее количество кода.
using System.ComponentModel; using System.Configuration.Install; using System.ServiceProcess; namespace MyProject { [RunInstaller(true)] public partial class ProjectInstaller : Installer { public ProjectInstaller() { InitializeComponent(); serviceInstaller1.AfterInstall += (sender, args) => new ServiceController(serviceInstaller1.ServiceName).Start(); } } }
определение
serviceInstaller1
(введите ServiceInstaller) в конструкторе классов установщика, а также установите егоServiceName
свойство в конструкторе.
спасибо, что он работает нормально...
private System.ServiceProcess.ServiceInstaller serviceInstaller1; private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e) { ServiceController sc = new ServiceController("YourServiceName"); sc.Start(); }
вместо создания собственного класса выберите установщик службы в установщике проекта и добавьте обработчик событий в событие Comitted:
private void serviceInstallerService1_Committed(object sender, InstallEventArgs e) { var serviceInstaller = sender as ServiceInstaller; // Start the service after it is installed. if (serviceInstaller != null && serviceInstaller.StartType == ServiceStartMode.Automatic) { var serviceController = new ServiceController(serviceInstaller.ServiceName); serviceController.Start(); } }
он запустит вашу службу только в том случае, если тип запуска установлен в автоматический.
на основе фрагментов выше, мой ProjectInstaller.файл CS завелся в таком виде на службу, которая называется FSWServiceMgr.исполняемый. Служба запускается после установки. В качестве примечания не забудьте нажать на вкладку Свойства (не щелкните правой кнопкой мыши), когда проект установки выбран в обозревателе решений, чтобы установить компанию и так далее.
using System.ComponentModel; using System.Configuration.Install; using System.ServiceProcess; namespace FSWManager { [RunInstaller(true)] public partial class ProjectInstaller : Installer { public ProjectInstaller() { InitializeComponent(); this.FSWServiceMgr.AfterInstall += FSWServiceMgr_AfterInstall; } static void FSWServiceMgr_AfterInstall(object sender, InstallEventArgs e) { new ServiceController("FSWServiceMgr").Start(); } } }
есть и другой способ, который не включает в себя код. Вы можете использовать таблицу Service Control. Отредактируйте созданный msi-файл с помощью orca.exe, и добавить запись в ServiceControl Table.
обязательны только столбцы ServiceControl, Name,Event и Component_. Столбец Component_ содержит идентификатор компонента из таблицы файлов. (Выберите файл в таблице file и скопируйте значение Component_value в таблицу ServiceControl.)
последний шаг чтобы обновить значение StartServices до 6575 в таблице InstallExecutesequence. Этого достаточно для запуска службы.
кстати, таблица установки службы позволяет настроить установщик для установки службы windows.