使用 VS 2010 部署 Windows 服务
本技巧解释了如何使用 Visual Studio 2010 部署 Windows 服务。
引言
本技巧的目的是提供一个关于如何使用 Visual Studio 部署项目部署 Windows 服务的基本概念。本技巧涵盖了 Windows 服务部署时可能需要的大部分内容。以下是本技巧涵盖的一些关键点:
- 使用 Visual Studio 部署项目部署 Windows 服务
- 检测先前安装的 Windows 服务,并防止出现“错误 1001。指定的服务已存在。”的错误。
- 在完成 Windows 服务安装后启动 Windows 服务。
Using the Code
需要按照以下步骤添加 Installer:
- 切换到服务的设计视图。
- 右键单击它并选择“添加 Installer”。(这将添加
ProjectInstaller
文件。) - 切换到添加的
ProjectInstaller
的设计视图。 - 设置
serviceInstaller1
组件的属性。ServiceName = TestService
StartType = Manual
- 设置
serviceProcessInstaller1
组件的属性。Account = LocalSystem
- 为服务添加以下事件,以便在安装前停止服务,并在安装后自动启动。
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(); }
- 构建解决方案。
现在在同一个解决方案中添加 Setup 项目,并按照以下步骤配置 Setup 项目以自动部署 Windows 服务。
- 右键单击 Setup 项目 >> 添加 >> 项目输出。
- 这将添加项目输出组屏幕,并从这里添加 Windows 服务的原始输出,并从配置下拉菜单中选择“Release”模式。
- 现在通过右键单击 Windows 服务项目 >> 视图 >>
自定义操作
打开自定义操作窗口。 - 从这个窗口,右键单击 install 并添加自定义操作,然后从应用程序文件夹中选择原始输出。在
Condition
属性中设置以下行,以检测 Windows 服务是否先前已安装:NOT (Installed or PREVIOUSVERSIONSINSTALLED)
- 现在右键单击 uninstall 并添加自定义操作,然后从应用程序文件夹中选择原始输出。在
Condition
属性中设置以下行,以升级设置,而不是尝试卸载 Windows 服务。NOT UPGRADINGPRODUCTCODE
- 现在右键单击 Commit 并添加自定义操作,然后从应用程序文件夹中选择原始输出。将
CustomActionData
属性设置为以下内容,以获取先前安装版本的 Product Code:/OldProductCode="[PREVIOUSVERSIONSINSTALLED]"
- 现在重要的步骤是从 Windows 服务项目属性框中设置以下属性,以便在安装新设置之前调用卸载过程。
RemovePreviousVersions = True
- 构建项目。
此设置将满足介绍部分中提到的要求。