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

使用 VS 2010 部署 Windows 服务

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (9投票s)

2013年4月10日

CPOL

2分钟阅读

viewsIcon

84554

downloadIcon

1230

本技巧解释了如何使用 Visual Studio 2010 部署 Windows 服务。

引言

本技巧的目的是提供一个关于如何使用 Visual Studio 部署项目部署 Windows 服务的基本概念。本技巧涵盖了 Windows 服务部署时可能需要的大部分内容。以下是本技巧涵盖的一些关键点:

  • 使用 Visual Studio 部署项目部署 Windows 服务
  • 检测先前安装的 Windows 服务,并防止出现“错误 1001。指定的服务已存在。”的错误。
  • 在完成 Windows 服务安装后启动 Windows 服务。

Using the Code

需要按照以下步骤添加 Installer:

  1. 切换到服务的设计视图。
  2. 右键单击它并选择“添加 Installer”。(这将添加 ProjectInstaller 文件。)
  3. 切换到添加的 ProjectInstaller 的设计视图。
  4. 设置 serviceInstaller1 组件的属性。
    • ServiceName = TestService
    • StartType = Manual
  5. 设置 serviceProcessInstaller1 组件的属性。
    • Account = LocalSystem
  6. 为服务添加以下事件,以便在安装前停止服务,并在安装后自动启动。
    private void serviceInstaller1_BeforeInstall(object sender, InstallEventArgs e)
    {
        try
        {
            ServiceController controller = ServiceController.GetServices().Where
            (s => s.ServiceName == serviceInstaller1.ServiceName).FirstOrDefault();
            if (controller != null)
            {
                if ((controller.Status != ServiceControllerStatus.Stopped) && 
                (controller.Status != ServiceControllerStatus.StopPending))
                {
                    controller.Stop();
                }
            }
        }
        catch (Exception ex)
        {
            throw new System.Configuration.Install.InstallException
                (ex.Message.ToString());
        }
    } 
    
    private void serviceInstaller1_BeforeUninstall(object sender, InstallEventArgs e)
    {
        try
        {
            ServiceController controller = ServiceController.GetServices().Where
            (s => s.ServiceName == serviceInstaller1.ServiceName).FirstOrDefault();
            if (controller != null)
            {
                if ((controller.Status != ServiceControllerStatus.Stopped) && 
                (controller.Status != ServiceControllerStatus.StopPending))
                {
                    controller.Stop();
                }
            }
        }
        catch (Exception ex)
        {
            throw new System.Configuration.Install.InstallException
                (ex.Message.ToString());
        }
    } 
    
    private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
    {
        new ServiceController(serviceInstaller1.ServiceName).Start();
    } 
  7. 构建解决方案。

现在在同一个解决方案中添加 Setup 项目,并按照以下步骤配置 Setup 项目以自动部署 Windows 服务。

  1. 右键单击 Setup 项目 >> 添加 >> 项目输出。
  2. 这将添加项目输出组屏幕,并从这里添加 Windows 服务的原始输出,并从配置下拉菜单中选择“Release”模式。
  3. 现在通过右键单击 Windows 服务项目 >> 视图 >> 自定义操作 打开自定义操作窗口。
  4. 从这个窗口,右键单击 install 并添加自定义操作,然后从应用程序文件夹中选择原始输出。在 Condition 属性中设置以下行,以检测 Windows 服务是否先前已安装:
    NOT (Installed or PREVIOUSVERSIONSINSTALLED) 
  5. 现在右键单击 uninstall 并添加自定义操作,然后从应用程序文件夹中选择原始输出。在 Condition 属性中设置以下行,以升级设置,而不是尝试卸载 Windows 服务。
    NOT UPGRADINGPRODUCTCODE 
  6. 现在右键单击 Commit 并添加自定义操作,然后从应用程序文件夹中选择原始输出。将 CustomActionData 属性设置为以下内容,以获取先前安装版本的 Product Code:
    /OldProductCode="[PREVIOUSVERSIONSINSTALLED]"
  7. 现在重要的步骤是从 Windows 服务项目属性框中设置以下属性,以便在安装新设置之前调用卸载过程。
    RemovePreviousVersions = True   
  8. 构建项目。

此设置将满足介绍部分中提到的要求。

© . All rights reserved.