Как автоматически запустить сервис после установки? - PullRequest
52 голосов
/ 17 октября 2008

Как автоматически запустить службу после запуска установки из проекта установки Visual Studio?

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

Ответы [ 7 ]

56 голосов
/ 17 октября 2008

Добавьте следующий класс в ваш проект.

using System.ServiceProcess;  

class ServInstaller : ServiceInstaller
{
    protected override void OnCommitted(System.Collections.IDictionary savedState)
    {
        ServiceController sc = new ServiceController("YourServiceNameGoesHere");
        sc.Start();
    }
}

Проект установки выберет класс и запустит ваш сервис после завершения установки.

40 голосов
/ 20 апреля 2009

Небольшое дополнение к принятому ответу:

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

protected override void OnCommitted(System.Collections.IDictionary savedState)
{
    new ServiceController(serviceInstaller1.ServiceName).Start();
}

(каждый установщик имеет ServiceProcessInstaller и ServiceInstaller. Здесь ServiceInstaller называется serviceInstaller1.)

23 голосов
/ 26 мая 2012

Этот подход использует класс Installer и наименьшее количество кода.

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) в конструкторе класса Installer, а также установите его свойство ServiceName в конструкторе.

10 голосов
/ 09 апреля 2009

спасибо, что все в порядке ...

private System.ServiceProcess.ServiceInstaller serviceInstaller1;

private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController("YourServiceName");
    sc.Start();
}
7 голосов
/ 10 мая 2012

Вместо создания собственного класса выберите установщик службы в установщике проекта и добавьте обработчик события в событие Comoted:

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();
    }
}

Служба будет запущена только в том случае, если установлен автоматический тип запуска.

3 голосов
/ 19 мая 2012

Исходя из приведенных выше фрагментов, мой файл ProjectInstaller.cs оказался похожим на этот для службы с именем FSWServiceMgr.exe. Служба запустилась после установки. В качестве примечания, не забудьте нажать вкладку Свойства (не правой кнопкой мыши), когда проект установки выбран в обозревателе решений, чтобы установить компанию и т. Д.


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();
        }
    }
}
0 голосов
/ 07 мая 2018

Существует также другой способ, который не связан с кодом. Вы можете использовать Service Control Table. Отредактируйте созданный MSI-файл с помощью orca.exe и добавьте запись в таблицу ServiceControl .

.

Обязательны только столбцы ServiceControl, Name, Event и Component_. Столбец Component_ содержит идентификатор компонента из таблицы файлов. (Выберите файл в таблице файлов и скопируйте значение_компонента в таблицу ServiceControl.)

Последний шаг - обновить значение StartServices до 6575 в таблице InstallExecutesequence. Этого достаточно для запуска службы.

Кстати, таблица установки службы позволяет настроить установщик для установки службы Windows.

...