C# 如何安装 Windows 服务作为应用程序安装的一部分

C# How to install Windows Service as part of application installation

我创建了一个安装程序,它从一系列子项目中获取主要输出,组成我的应用程序的子项目之一是 Windows 服务。此服务需要作为主应用程序的一部分安装。

到目前为止,我已尝试将安装程序添加到服务项目,单独发布并安装结果 Setup.exe 作为项目安装程序的自定义操作但是这种方法没有任何成功。我会从命令行安装它,但是我需要打包到 Visual Studio CMD 工具中才能访问 installutil 命令。

我的问题是,我可以从 "Visual Studio Installer - Setup Project" 安装 Windows 服务作为更大项目的一部分吗?如果可以,如何安装?到目前为止,这个过程让我望而却步。

我想我可以尝试让自定义操作触发一个脚本,该脚本作为流程的一部分执行 ServiceInstaller,所以我会尝试这样做。

提前致谢

由于 VS2013 不包含旧的 (VS2010) Visual Studio 安装程序项目,我有这些建议:

使用 WiX 安装程序:https://wix.codeplex.com

甚至还有一个服务安装程序模板(未测试):

https://visualstudiogallery.msdn.microsoft.com/7f35c8ce-1763-4340-b720-ab2d359009c5


使用 VS 2013 安装扩展

有很多人抱怨 MS 放弃了旧的安装项目,所以他们把它作为扩展带回来了:

http://blogs.msdn.com/b/visualstudio/archive/2014/04/17/visual-studio-installer-projects-extension.aspx

我还没有测试过这个,但据我了解,它将恢复内部 VS 安装项目类型的旧功能。


我已经使用 VS2010 安装项目编写了一些 Windows 服务,甚至编写了 step-by-step 说明如何执行此操作。有些步骤不是self-explanatory,所以我自己用这个作为服务项目的指南。

我用 WiX 做了一些初步测试,这似乎是一个很好的解决方案,但是我还没有用它来安装服务。

另一个 link 关于这个话题:

https://superuser.com/questions/727643/installing-a-windows-service-without-visual-studios-installutil-exe

我计划尽快查看我的 step-by-step 有关使用 VS2013 安装服务的说明,并可能将其与 WiX 进行比较,如果您有兴趣,请告诉我,我可以将其公开。


这是我的 step-by-step 创建 Windows 服务的说明。 (您也可以在 http://www.rsprog.de/samplewindowsservice 上找到它)

  • 文件 => 新建 => 项目...

  • Visual C# => Windows 桌面 => Windows 服务

  • 名称:SampleService

  • "Create directory for solution" 选中

  • 在解决方案资源管理器中,select Service1.cs、right-click => 重命名

  • 将文件重命名为 SampleService.cs

  • Select 是“...您是否也想执行重命名...”

SampleService.cs 现在应该显示在设计视图中

  • 在设计器视图的背景中单击

  • right-click => 添加安装程序

(已添加 serviceProcessInstaller1 和 serviceInstaller1)

  • 在设计视图中打开SampleService.cs

  • 在属性中,将 ServiceName 设置为 SampleService

  • 在设计视图中打开 ProjectInstaller.cs

  • 点击serviceInstaller1

  • 在属性 window 中,将 ServiceName 属性 设置为 SampleService。

  • 将 DisplayName 属性 设置为 Sample Service 或其他 (稍后将在服务控制台中显示为服务名称)

  • 在这里你也可以选择将启动类型从手动设置为自动

  • 单击 serviceProcessInstaller1

  • 编辑帐户: 您可以在此处更改服务是否 运行 在技术帐户(用户)下 或者例如作为本地系统

如果您将其设置为用户,设置过程中的弹出窗口将允许设置用户/密码

  • 在解决方案 right-click => 添加 => 新项目...

  • 其他项目类型 => Visual Studio 安装程序 => 安装项目

  • 名称:SampleServiceSetup

  • Select SampleServiceSetup 项目,right-click => 添加 => 项目输出...

  • 因为项目 "SampleService => Primary output" 应该已经 selected, 因为配置“(活动)”应该已经 selected.

  • 按确定

  • Select SampleServiceSetup 项目,在属性视图中:

  • 将 InstallAllUsers 更改为 True
  • 将 ProductName 更改为 SampleService(最后删除设置)
  • 将标题更改为 SampleService(最后删除设置)

默认情况下,安装项目的目标平台是x86。 您可以在此处将其更改为 x64 (TargetPlatform)

  • Right-click 解决方案资源管理器中的设置项目 => 查看 => 自定义操作

  • 在自定义操作视图中,right-click 自定义操作节点 => 添加自定义操作...

  • Double-click列表中的应用程序文件夹打开它, select SampleService 的主要输出(活动),然后单击“确定”。 ("Primary output from SampleService (Active)"被添加到四个节点)

  • Select SampleServiceSetup 项目,right-click => 查看 => 用户界面

  • 开始 => 安装文件夹 => 属性 => InstallAllUsersVisible:更改为 False

  • 构建解决方案

Windows 安装程序有一个互斥锁,可以防止 运行 同时进行多个安装。因此,一个安装程序无法调用另一个安装程序。这有一个例外,但生成的模式无法静默安装,这不是最佳做法。

您需要研究引导程序/链程序的概念。 InstallShield 有一个他们称为套件安装程序的工具,Windows Installer XML (WiX) 有一个称为 Burn 的工具。

另外 Visual Studio 安装程序项目因其低质量而被 Windows 安装程序专家所熟知。我会考虑使用 WiX 等其他工具重写该安装程序。我维护一个名为 Industrial Strength Windows Installer XML (IsWiX - CodePlex) 的开源项目,它提供了项目模板(脚手架)和图形设计器,使编写安装服务的 MSI 成为可能,而无需编写单行 XML 手动。然后由 WiX 构建生成的项目以创建 MSI。