C#如何在应用程序安装过程中安装Windows Service

时间:2015-03-04 10:37:50

标签: c# visual-studio-2013 windows-services windows-installer

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

到目前为止,我已尝试将一个安装程序添加到Service项目,单独发布并将结果 Setup.exe 安装为项目安装程序的自定义操作,但此方法没有任何成功。我会从命令行安装该东西,但是我需要在Visual Studio CMD工具中打包以访问 installutil 命令。

我的问题是,我可以从" Visual Studio安装程序 - 安装项目"安装Windows服务。作为一个更大的项目的一部分,如果是这样的话?到目前为止,这个过程一直没有找到我。

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

提前致谢

2 个答案:

答案 0 :(得分:3)

由于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服务,甚至还写了一步说明如何执行此操作。有些步骤不能自我解释,所以我自己将其用作服务项目的指南。

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

关于此主题的另一个链接:

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

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


以下是我创建Windows服务的分步说明。 (您也可以在http://www.rsprog.de/samplewindowsservice

上找到
  • File =>新=>项目...

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

  • 名称:SampleService

  • "为解决方案创建目录"检查

  • 在Solution Explorer中,选择Service1.cs,右键单击=>重命名

  • 将文件重命名为SampleService.cs

  • 选择是和#34; ...您是否也想要重命名..."

SampleService.cs现在应该在Design View中显示

  • 点击设计师视图的背景

  • 右键单击=>添加安装程序

(已添加serviceProcessInstaller1和serviceInstaller1)

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

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

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

  • 点击serviceInstaller1

  • 在“属性”窗口中,将ServiceName属性设置为SampleService。

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

  • 您还可以选择将StartType从手动设置为自动

  • 点击serviceProcessInstaller1

  • 修改帐户: 如果服务将在技术帐户(用户)下运行,您可以在此更改 或者例如作为LocalSystem

如果您将其设置为用户,则在设置期间弹出窗口将允许设置用户/密码

  • 在解决方案中右键单击=>添加=>新项目......

  • 其他项目类型=> Visual Studio Installer =>设置项目

  • 名称:SampleServiceSetup

  • 选择SampleServiceSetup项目,右键单击=>添加=>项目输出......

  • As Project" SampleService =>主要输出"应该已经选中了, as Configuration"(Active)"应该已经被选中了。

  • 按确定

  • 在属性视图中选择SampleServiceSetup项目:

  • 将InstallAllUsers更改为True
  • 将ProductName更改为SampleService(最后删除安装程序)
  • 将标题更改为SampleService(最后删除安装程序)

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

  • 在解决方案资源管理器中右键单击安装项目=> View =>自定义操作

  • 在“自定义操作”视图中,右键单击“自定义操作”节点=>添加自定义操作...

  • 双击列表中的“应用程序文件夹”将其打开, 从SampleService(Active)中选择Primary Output,然后单击OK。 (" SampleService(Active)"的主要输出被添加到四个节点中)

  • 选择SampleServiceSetup项目,右键单击=> View =>用户界面

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

  • 构建解决方案

答案 1 :(得分:1)

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

您需要研究bootstrapper / chainer的概念。 InstallShield有一个他们称为套件安装程序,而Windows Installer XML(WiX)有一个名为Burn。

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