【问题标题】:Automatically start a windows service after install安装后自动启动windows服务
【发布时间】:2018-05-13 20:07:10
【问题描述】:

这两个服务安装程序中哪一个更可取(以及为什么),我在不同的网站上都提到过(以及在 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();

【问题讨论】:

    标签: c# windows-services


    【解决方案1】:

    我认为后者更合适一些(尽管快速检查了我的代码库并且我基本上编写了前者)。我看到的区别是发生回滚的机会。在提交阶段,您已经度过了回滚的风险。但是,如果您在 AfterInstall 中启动您的服务(这只是整个安装阶段的一部分(四个阶段是安装、回滚、提交、卸载)),您就有可能由​​后续的 InstallerClass 发出回滚。然后,您需要停止服务并卸载它(Microsoft 的默认服务安装程序类会为您执行此操作,因此这不是什么大问题。

    总的来说,没有太大的区别。

    【讨论】:

    • 有点错误:[AfterInstall] 在 Installers 属性中所有安装程序的 Install 方法运行后发生。 该事件与任何单个安装无关组件。
    • 完全没有错。我在 IC 方面拥有丰富的经验。 IC 可以在单个 EXE/DLL 中作为树组合在一起。 Installers 属性仅适用于单个树(即该特定 IC 的子级)。它没有说明同一个 EXE/DLL 中的其他 IC 树。请举例说明我的评论是如何错误的。
    • 在这种情况下,Committed 事件的行为将完全相同(因为容器的实例不能调用其他容器的实例)——除非我误解了你?
    • 正如我之前所问的,请明确解释我的错误之处。然后我可以更容易地指出你的论点是错误的。为了论证,让我们使用一个带有 4 个 IC 树(IC1-IC4)的 EXE,而 IC1 和 IC3 各有 2 个子 IC(IC1Sub1、IC1Sub2 等)。 4个阶段的执行顺序你清楚吗(推荐你去用你喜欢的反编译器破解打开微软的类)?
    • 感谢您的帮助。由于committed是最后运行的,对我来说似乎最合适,但想要其他意见。
    【解决方案2】:

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

    仅当每个的 Install 方法时才会调用 Commit 方法 此实例的 InstallerCollection 中的安装程序成功。

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

    【讨论】:

      【解决方案3】:

      在您的服务项目的 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 服务

      【讨论】:

        猜你喜欢
        • 2017-08-26
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多