安装后自动启动windows服务

本文关键字:服务 windows 自动启动 安装 | 更新日期: 2023-09-27 18:14:07

从服务安装程序中哪一个更可取(以及为什么),我在不同的网站上都看到过(这里是stackoverflow在安装时自动启动Windows服务和如何在安装后自动启动服务?)

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

安装后自动启动windows服务

我认为后者更合适一些(尽管快速检查一下我的代码库,我编写的基本上是前者)。我看到的区别是发生回滚的可能性。在提交阶段,您可以避免回滚的风险。但是如果你在AfterInstall中启动你的服务(这只是整个安装阶段的一部分(四个阶段分别是安装,回滚,提交,卸载)),你就有可能由后续的InstallerClass发出回滚。然后你需要停止你的服务并卸载它(微软的默认服务安装程序类为你做的),所以这不是一个大问题。

总之,没有太大的区别。

考虑到Committed是在安装后引发的(也就是说,只有当Install()调用完成时,才会引发相关事件(如果成功)),那么我会说在这一点上做它是"最安全的"。事实上,我确信这是最后一个与安装相关的事件,通过这样做,完成了完整的安装。

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

由于Commit收集卸载所需的信息,并且可能会中断,因此Rollback在安装过程中被调用-如果服务在完成之前已经在运行,那么可能会发现自己陷入困境。

在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服务