Wix安装程序替换INSTSRV和SRVANY以进行用户定义的服务安装

时间:2011-12-21 19:38:17

标签: windows-services wix windows-installer instsrv srvany

我使用Visual Studio C#Express创建了一个可执行文件MyService.exe。 Express版本中没有用于创建服务的选项。过去,已使用INSTSRV和SRVANY手动将其安装为用户定义的服务,如MSDN Article 'How To Create a User-Defined Service'

中所述

是否可以为此文件

创建wix 3.5安装程序
  1. 不要求目标计算机上存在SRVANY.exe和INSTRV.exe文件
  2. 不使用INSTSRV.exe作为自定义操作

2 个答案:

答案 0 :(得分:3)

这是真正的独家新闻:服务是服务,是服务。这是我的座右铭。我的意思是我不在乎你是否使用C ++ EXE,VB exe,C#EXE,一些thunking主机EXE,如SrvAny.exe ......它们都实现了相同的API来与服务进行交互控制经理。

因此,SCV将调用SrvAny并获取启动命令。此时,它将读取注册表值并知道如何运行其他EXE或脚本。当SrvAny收到Stop调用时,它将终止您的进程,并且报告已停止到SCM。

这就是服务的运行方式。我们来谈谈如何安装它。有许多方法可以以编程方式创建服务(SC,InstSrv.exe,安装程序类自定义操作等),但从MSI的角度来看,它们都不需要。 Windows Installer具有ServiceInstall和ServiceControl表以及用于处理启动,停止,创建和删除Windows服务的标准操作。有时,例如SrvAny.exe的情况,您会得到一些无法使用这些表表达的安装程序要求,在这种情况下,您使用Registry表。对于SrvAny.exe,需要创建一个带有注册表数据的Parameters键,该注册表数据可以告诉SrvAny.exe启动时实际调用的内容。

以下是WiX中使用SrvAny.exe将NodeJs脚本作为服务运行的示例:

<Component Id="c1" Guid="redacted">
  <File Id="f1" Source="$(var.SourceDir)\srvany.exe" KeyPath="yes" />
  <ServiceInstall Id="si1" DisplayName="MyService" Description="MyService" Name="MyService" Start="auto" Type="ownProcess" Vital="no" ErrorControl="normal" Account="NT AUTHORITY\NetworkService"  />
  <ServiceControl Id="sc1" Name="MyService" Remove="both" Stop="both" Start="install" Wait="yes" />
  <RegistryValue Id="reg1" Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\MyService\Parameters" Name="Application" Type="string" Value="node &quot;[#f2]&quot;" Action="write" />
</Component>
<Component Id="c2" Guid="redacted" KeyPath="yes">
  <File Id="f2" Source="$(var.SourceDir)\server.js" />
</Component>

答案 1 :(得分:-1)

WiX确实支持安装Windows服务,但只支持本地服务。这意味着应用程序必须是written as a service

由于您的应用程序使用SRVANY.EXE作为服务运行,因此您有两个选项

  • 将您的应用程序重写为本机Windows服务