65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在安装程序完成后立即自动启动 .NET WCF Windows 服务

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (4投票s)

2012年1月19日

CPOL

3分钟阅读

viewsIcon

40107

在安装程序完成后立即自动启动 .NET WCF Windows 服务。

引言

最近我遇到了一种情况,我需要做三件事

  1. 创建 WCF Windows 服务。
  2. 为该服务创建安装程序项目。
  3. 在安装完成后立即启动该服务。

前两个步骤非常简单,并且有很多在线内容可以帮助我们这样做。 但是关于如何执行第三步的信息不容易获得。 因此,我想写一篇文章来帮助人们这样做 - 即,在服务安装完成后自动启动 Windows 服务。

我将简单介绍前两个步骤以开始这篇文章,然后使用代码片段进入第三点。

1. 创建 WCF Windows 服务

http://msdn.microsoft.com/en-us/library/ms733069.aspx。 这是一篇非常好的 MSDN 文章,清楚地解释了如何创建 WCF Windows 服务。

我们为什么需要 WCF Windows 服务?

通常,Windows 服务被认为是后台程序,它们只是在没有任何用户干预的情况下完成它们的工作。 但是 WCF Windows 服务有什么特别之处呢?

让我用一个例子来解释这一点 - 假设我有一个需求,我需要一个后台服务,该服务查看数据库并根据一天中的时间以特定的间隔为我创建一个特定格式的文件。 因此,对于此要求,我可以创建一个普通的 Windows 服务,该服务在预先定义的时间间隔内查看数据库,并为我生成文件。

现在想象一下,假设需求略有变化 - 用户不仅希望以特定的间隔/一天中的时间生成文件,他们还希望构建另一个客户端应用程序,该应用程序可以按需创建这些文件。 他们还希望从客户端更改预先配置的间隔。 即,通过单击按钮,他们希望生成文件,而不管预定义的间隔配置如何。

这是一种需要将 Windows 服务的功能暴露在外部的情况 - 因此需要 WCF Windows 服务。

2. 为 Windows 服务创建安装程序项目

http://msdn.microsoft.com/en-us/library/zt39148a(VS.80).aspx 另一篇演练 MSDN 文章,解释了如何为 Windows 服务创建安装程序项目。

此步骤创建一个 msi 文件,该文件执行两件事

  • 将服务的主要输出安装到特定文件夹。
  • 在服务控制管理器 (SCM) 中安装 Windows 服务。

3. 在安装完成后立即启动该服务

请记住,我的要求是在服务安装完成后立即启动该服务。 本节解释了如何做到这一点。

基本上,当您创建 WCF Windows 服务时,您需要向 Project Installer 添加两个组件

  1. ServiceProcessInstaller, 和
  2. ServiceInstaller

这在第一个链接中有所解释,这是创建任何 .NET Windows 服务的基本步骤。

我所做的只是处理 ServiceInstaller 组件的“committed”事件。 一旦服务安装程序提交 Windows 服务的安装,就会触发此事件。

下面的代码片段显示了确切的操作方法。 ProjectInstaller 类将作为 ProjectInstaller.cs 文件的一部分已经在您的代码库中可用。

[RunInstaller(true)]
public partial class ProjectInstaller : Installer 
{
    public ProjectInstaller()
    {
        InitializeComponent();
        this.serviceInstaller1.Committed += new InstallEventHandler(serviceInstaller1_Committed);
    }
    /// <summary>
    /// This method will ensure that the Service is started once installation is committed.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void serviceInstaller1_Committed(object sender, InstallEventArgs e)
    {
        var controller = new ServiceController(this.serviceInstaller1.ServiceName);
        controller.Start();
        controller.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running);
    }
}

一旦处理了 ServiceInstaller 的 committed 事件,如下所示,就应该重新构建在步骤 2 中创建的安装程序项目。现在,当您使用安装程序安装 Windows 服务时,不仅安装了 Windows 服务,而且还为您启动了它。

结论

通常,人们会创建另一个批处理文件,用于通过单击来启动服务。 或者,用户可以打开 SCM(从命令行输入 services.msc),然后滚动并找到他们已安装的服务,然后右键单击并启动。

此解决方案将允许用户通过一个步骤来执行整个安装并启动 Windows 服务。

© . All rights reserved.