安装后自动启动Windows服务

时间:2011-11-11 17:45:51

标签: c# windows-services

这两个中的哪一个更适合(以及为什么)来自服务安装程序,我在不同的网站上看到了这两个(在stackoverflow Automatically start a Windows Service on installHow to automatically start your service after install?)。

// Auto Start the Service Once Installation is Finished.
this.AfterInstall += (s, e) => new ServiceController("service").Start();
this.Committed += (s, e) => new ServiceController("service").Start();

3 个答案:

答案 0 :(得分:2)

我认为后者更合适(尽管我对代码库进行了快速检查,而且我基本上编写了前者)。我看到的差异是回滚发生的可能性。在提交阶段,您将面临回滚的风险。但是如果你在AfterInstall中启动你的服务(这只是整个安装阶段的一部分(安装,回滚,提交,卸载这四个阶段))你可能会被后续的InstallerClass发出回滚。然后,您需要停止服务并将其卸载(Microsoft的默认服务安装程序类会为您执行此操作,因此这不是问题。

总之,没有太大区别。

答案 1 :(得分:1)

考虑Committed是在安装后引发的(也就是说,只有当Install()调用完成时,因此引发相关事件(如果成功))那么我会说在这一点上做的是& #34;最安全&#34 ;.事实上,我确定这是最后一次安装相关事件,并通过这样做完成了整个安装。

  

只有在每个方法的Install方法中调用Commit方法   此实例中的安装程序的InstallerCollection成功。

由于Commit收集了卸载所需的信息,因此可能会中断并因此在整个安装过程中调用Rollback - 您可以可能发现自己处于绑定状态如果服务已经在完成,成功提交之前已经雄心勃勃地运行。

答案 2 :(得分:0)

在服务项目的C#中,您将拥有一个名为ProjectInstaller.cs的安装程序类,修改它以覆盖AfterInstall事件处理程序以自动启动该服务,如下面的代码

[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
    public ProjectInstaller()
    {
        InitializeComponent();
    }

    protected override void OnAfterInstall(IDictionary savedState)
    {
        base.OnAfterInstall(savedState);
        using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
        {
            serviceController.Start();
        }
    }
}

这将在安装后自动启动Windows服务