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 放弃了旧的安装项目,所以他们把它作为扩展带回来了:
我还没有测试过这个,但据我了解,它将恢复内部 VS 安装项目类型的旧功能。
我已经使用 VS2010 安装项目编写了一些 Windows 服务,甚至编写了 step-by-step 说明如何执行此操作。有些步骤不是self-explanatory,所以我自己用这个作为服务项目的指南。
我用 WiX 做了一些初步测试,这似乎是一个很好的解决方案,但是我还没有用它来安装服务。
另一个 link 关于这个话题:
我计划尽快查看我的 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。
我创建了一个安装程序,它从一系列子项目中获取主要输出,组成我的应用程序的子项目之一是 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 放弃了旧的安装项目,所以他们把它作为扩展带回来了:
我还没有测试过这个,但据我了解,它将恢复内部 VS 安装项目类型的旧功能。
我已经使用 VS2010 安装项目编写了一些 Windows 服务,甚至编写了 step-by-step 说明如何执行此操作。有些步骤不是self-explanatory,所以我自己用这个作为服务项目的指南。
我用 WiX 做了一些初步测试,这似乎是一个很好的解决方案,但是我还没有用它来安装服务。
另一个 link 关于这个话题:
我计划尽快查看我的 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。