2

我使用 Visual Studio C# Express 创建了一个可执行的 MyService.exe。Express 版本中没有创建服务的选项。过去,这已使用 INSTSRV 和 SRVANY 手动安装为用户定义的服务,如MSDN 文章“如何创建用户定义的服务” 中所述

是否可以为此文件创建一个 wix 3.5 安装程序

  1. 不需要目标计算机上存在 SRVANY.exe 和 INSTRV.exe 文件
  2. 不使用 INSTSRV.exe 作为自定义操作
4

2 回答 2

4

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

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

这就是服务的运行方式。让我们谈谈如何安装它。您可以通过多种方式以编程方式创建服务(SC、InstSrv.exe、安装程序类自定义操作等),但从 MSI 的角度来看,它们都不需要。Windows 安装程序具有 ServiceInstall 和 ServiceControl 表以及用于处理启动、停止、创建和删除 Windows 服务的标准操作。有时,例如 SrvAny.exe 的情况,您会得到一些无法使用这些表表达的安装程序要求,在这种情况下,您使用注册表表。对于 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>
于 2014-05-15T13:43:00.893 回答
-1

WiX 确实支持安装 Windows 服务,但仅支持安装本机服务。这意味着应用程序必须编写为服务

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

  • 将您的应用程序重写为原生 Windows 服务

或者

于 2011-12-22T10:04:31.737 回答