Wix 服务安装参数
本文关键字:参数 安装 服务 Wix | 更新日期: 2023-09-27 18:34:16
有谁知道如何在启动时将我在ServiceInstall中声明的参数传递给服务?它们在我的OnStart(string[] args)中似乎总是为空。
<ServiceInstall
Id="ServiceInstaller"
Type="ownProcess"
Vital="yes"
Name="MyService"
DisplayName="MyService"
Description="MyService Desc"
Start="auto"
Account="LocalSystem"
ErrorControl="ignore"
Interactive="yes"
Arguments="MY ARGS HERE"
>
</ServiceInstall>
<ServiceControl Id="ServiceControl" Start="install" Stop="both" Remove="uninstall" Name="MyService" Wait="yes" />
有点旧,但这是你可以做的
<ServiceInstall
Id="SomeService"
Type="ownProcess"
Vital="yes"
Name="Some Service"
DisplayName="Some Service"
Description="Monitoring and management of some service"
Start="auto"
Account="LocalSystem"
ErrorControl="normal"
Interactive="no"/>
<ServiceControl Id="StartSomeService" Start="install" Stop="both" Remove="uninstall" Name="Some Service" Wait="yes">
<ServiceArgument>[P_USEREMAIL]</ServiceArgument>
<ServiceArgument>[P_USERPASSWORD]</ServiceArgument>
<ServiceArgument>[P_DEFAULTNAMINGCONTEXT]</ServiceArgument>
<ServiceArgument>[P_USEHTTPPROXY]</ServiceArgument>
<ServiceArgument>[P_PROXYADDRESS]</ServiceArgument>
<ServiceArgument>[P_PROXYDOMAIN]</ServiceArgument>
<ServiceArgument>[P_PROXYUSERNAME]</ServiceArgument>
<ServiceArgument>[P_PROXYPASSWORD]</ServiceArgument>
</ServiceControl>
更新:可悲的是,WIX文档在此元素方面毫无抱负。
基本上,您可以设置(公共)WIX变量,通常定义为[P_*](例如msiexec参数,静态或CA)。这些值在启动时传递给服务的方式与从服务控制台启动服务(或我想使用net start)时将这些值连接成作为启动参数提供的字符串的方式相同。在我的例子中,这些是空格分隔的值,例如 [P_USERMAIL] 是"--useremail some@email.com",尽管这是任意的,因为您将在您发布的服务启动代码中处理这个问题。
您可能知道,这些值不会持久保存。如果服务无法使用您提供的值进行初始化,则需要重新安装/修复或以其他方式将它们传递给服务(即服务控制台、net start)。
有人在这方面取得了进展吗?我没有看到这个论点在启动时影响我的服务:
<ServiceInstall
Id="ServiceInstaller"
Type="ownProcess"
Vital="yes"
Name="Service"
DisplayName="Service"
Description="a service"
Arguments="-p stuff"
Start="auto"
Account="LocalSystem"
ErrorControl="normal"
Interactive="yes"/>
我的服务总是得到一个空的 arg 数组:
partial class PrintMonitorService : ServiceBase
{
private readonly PrintMonitorServiceManager _serviceManager;
public PrintMonitorService()
{
InitializeComponent();
_serviceManager = new PrintMonitorServiceManager();
}
protected override void OnStart(string[] args)
{
_serviceManager.StartHosting(args);
}
protected override void OnStop()
{
_serviceManager.StopHosting();
}
在这里还没有真正找到答案,所以我就是这样解决同样的问题:
有两组参数可用于 Windows 服务:
1)当您使用<ServiceInstall .. Arguments="YOUR Service Args">
元素时,您的参数将被添加到服务的"可执行文件路径"(注册表中的"ImagePath")中。
使用 Environment.GetCommandLineArgs 方法获取参数(请注意,该方法返回的第一个参数是服务名称)。
请记住将参数保存到配置文件或注册表中,并在安装前阅读它们!因为如果您运行修复/更改安装功能,这些参数将消失。
2)启动参数(一次性参数)。
这些参数是运行服务时在 OnStart(string[] args) 方法中可用的参数。