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


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

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

7   51  

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.