安装后如何自动启动服务?

时间:2008-10-17 15:51:44

标签: .net installer service

如何从Visual Studio安装项目运行安装后自动启动服务?

我只想出这个,并认为我会分享一般的好处的答案。回答如下。我对其他更好的方法持开放态度。

7 个答案:

答案 0 :(得分:56)

将以下类添加到项目中。

using System.ServiceProcess;  

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

安装程序完成后,安装项目将选择该类并运行您的服务。

答案 1 :(得分:40)

对接受的答案的补充:

您也可以像这样获取服务名称 - 如果将来更改服务名称,可以避免任何问题:

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

(每个安装程序都有一个ServiceProcessInstaller和一个ServiceInstaller。这里的ServiceInstaller称为serviceInstaller1。)

答案 2 :(得分:23)

此方法使用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();
        }
    }
}

在Installer类设计器中定义serviceInstaller1(类型ServiceInstaller),并在设计器中设置其ServiceName属性。

答案 3 :(得分:10)

谢谢它运行正常...

private System.ServiceProcess.ServiceInstaller serviceInstaller1;

private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController("YourServiceName");
    sc.Start();
}

答案 4 :(得分:7)

不是创建自己的类,而是在项目安装程序中选择服务安装程序,并向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();
    }
}

仅当启动类型设置为自动时,它才会启动您的服务。

答案 5 :(得分:3)

根据上面的代码段,我的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();
        }
    }
}

答案 6 :(得分:0)

还有另一种不涉及代码的方法。您可以使用服务控制表。使用orca.exe编辑生成的msi文件,并向ServiceControl Table添加条目。

只有ServiceControl,Name,Event和Component_列是必需的。 Component_列包含File Table中的ComponentId。 (选择文件表中的文件,并将Component_value复制到ServiceControl表。)

最后一步是在表InstallExecutesequence中将StartServices的值更新为6575。这足以启动服务。

顺便说一句,服务安装表允许您配置安装程序以安装Windows服务。