这两个中的哪一个更适合(以及为什么)来自服务安装程序,我在不同的网站上看到了这两个(在stackoverflow Automatically start a Windows Service on install和How 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();
答案 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服务