Dar*_*fer 2 windows-installer windows-services wix instsrv srvany
我使用 Visual Studio C# Express 创建了可执行文件 MyService.exe。Express 版本中没有用于创建服务的选项。过去,这是使用 INSTSRV 和 SRVANY 手动安装为用户定义的服务,如MSDN 文章“如何创建用户定义的服务” 中所述
是否可以为此文件创建一个 wix 3.5 安装程序
这是真正的独家新闻:服务是服务是服务。这是我的座右铭。我的意思是,我不在乎您是否使用 C++ EXE、VB exe、C# EXE、某些 thunking 主机 EXE(例如 SrvAny.exe)...它们都实现相同的 API 来与服务交互控制经理。
因此 SrvAny 将被 SCM 调用并获得启动命令。此时它将读取注册表值并知道如何运行其他 EXE 或脚本。当 SrvAny 收到 Stop 调用时,它将终止您的进程并向 SCM 报告已停止。
这就是服务的运行方式。我们来谈谈如何安装。您可以通过多种方式以编程方式创建服务(SC、InstSrv.exe、安装程序类自定义操作等),但从 MSI 的角度来看,它们都不是必需的。Windows Installer 具有 ServiceInstall 和 ServiceControl 表以及用于处理启动、停止、创建和删除 Windows 服务的标准操作。有时,例如 SrvAny.exe 的情况,您会遇到一些无法使用这些表表达的安装程序要求,在这种情况下,您可以使用注册表。对于 SrvAny.exe,需要使用注册表数据创建一个参数项,该注册表数据指导 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 "[#f2]"" Action="write" />
</Component>
<Component Id="c2" Guid="redacted" KeyPath="yes">
<File Id="f2" Source="$(var.SourceDir)\server.js" />
</Component>
Run Code Online (Sandbox Code Playgroud)