我有以下 .wxs 文件:
<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="x.x.x.x" ?>
<?define UpgradeCode="{**MYGUID**}" ?>
<?define Manufacturer="My Company" ?>
<?define ProductName="My Product" ?>
<?define SkuName="MyProduct" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*"
Name="$(var.ProductName)"
Language="1033"
Version="$(var.ProductVersion)"
Manufacturer="$(var.Manufacturer)"
UpgradeCode="$(var.UpgradeCode)">
<Package InstallerVersion="301"
Compressed="yes"
InstallPrivileges="elevated"
InstallScope="perMachine"
Platform="x86" />
<Media Id="1"
Cabinet="$(var.SkuName).cab"
EmbedCab="yes" />
<Directory Id="TARGETDIR"
Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="ManufacturereDirectory"
Name="$(var.Manufacturer)">
<Directory Id="ProductDirectory"
Name="$(var.ProductName)" />
</Directory>
</Directory>
</Directory>
<ComponentGroup Id="MainComponentGroup">
<Component Directory="ProductDirectory">
<File Name="$(var.MyProject.TargetFileName)"
Source="$(var.MyProject.TargetPath)"
KeyPath="yes"
Vital="yes" />
<ServiceInstall Id="SeviceInstall"
Name="$(var.ProductName)"
DisplayName="$(var.ProductName)"
Type="ownProcess"
Interactive="no"
Start="auto"
Vital="yes"
ErrorControl="normal"
Account="LOCALSYSTEM">
</ServiceInstall>
<ServiceControl Id="ServiceControl_Start"
Name="$(var.ProductName)"
Start="install"
Wait="no" />
<ServiceControl Id="ServiceControl_Stop"
Name="$(var.ProductName)"
Stop="both"
Remove="uninstall"
Wait="yes" />
</Component>
</ComponentGroup>
<Feature Id="MainFeature"
Level="1">
<ComponentGroupRef Id="MainComponentGroup" />
</Feature>
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Property="UPGRADEFOUND"
Minimum="0.0.0.1" IncludeMinimum="yes"
Maximum="$(var.ProductVersion)" IncludeMaximum="yes"
OnlyDetect="no"
IgnoreRemoveFailure="yes"
MigrateFeatures="yes"/>
</Upgrade>
<CustomAction Id="ServiceRestarter"
Directory="ProductDirectory"
ExeCommand=""[SystemFolder]sc.exe" failure "$(var.ProductName)" reset= 60 actions= restart/0"
Impersonate="no" />
<InstallExecuteSequence>
<InstallExecute Before="RemoveExistingProducts" />
<RemoveExistingProducts Before="InstallFinalize" />
<Custom Action="ServiceRestarter" After="InstallFinalize"><![CDATA[NOT Installed]]></Custom>
</InstallExecuteSequence>
</Product>
</Wix>
在此之前,我尝试过:
<CustomAction Id="ServiceRestarter"
Property="QtExecCmdLine"
Value='"[SystemFolder]sc.exe" failure "$(var.ProductName)" reset= 60 actions= restart/0' />
这显然叫sc.exe
- 但什么也没改变......
在此之前我尝试过:
<ServiceInstall Id="SeviceInstall"
Name="$(var.ProductName)"
DisplayName="$(var.ProductName)"
Type="ownProcess"
Interactive="no"
Start="auto"
Vital="yes"
ErrorControl="normal"
Account="LOCALSYSTEM">
<ServiceConfig Id="ServiceConfig"
DelayedAutoStart="yes"
OnInstall="yes"
OnReinstall="yes"
OnUninstall="no"
FailureActionsWhen="failedToStopOrReturnedError" />
<ServiceConfigFailureActions Id="ServiceRestarter"
OnInstall="yes"
OnReinstall="yes"
OnUninstall="no"
ResetPeriod="0">
<Failure Action="restartService" Delay="0" />
<Failure Action="restartService" Delay="0" />
<Failure Action="restartService" Delay="0" />
</ServiceConfigFailureActions>
</ServiceInstall>
这不起作用,因为如果使用 < 5.0 的安装程序,该MsiServiceConfigFailureActions
表将不起作用,即使使用InstallerVersion="500"
我得到的唯一东西是错误:
无法配置服务“我的产品”(我的产品)。这可能是包或您的权限的问题。验证您是否有足够的权限来配置系统服务。
(是的,......我也试过InstallPrivilges="elevated"
- 但是......真正的问题是Action="restartService"
根据这个)
所以......使用 aCustomAction
是要走的路(或不是?)。
我有以下日志输出
MSI (s) (34:28) [13:56:46:914]: 注意: 1: 1722 2: ServiceRestarter 3: C:\Program Files (x86)\My Company\My Product\ 4: "C:\ Windows\SysWOW64\sc.exe" 失败 "我的产品" 重置 = 60 个操作 = 重新启动/0
MSI (s) (34:28) [13:56:46:914]: 注意: 1: 2205 2: 3: 错误
MSI (s) (34:28) [13:56:46:914]: 注意: 1: 2228 2: 3: 错误 4: SELECTMessage
FROMError
WHEREError
= 1722
MSI (c) (2C:0C) [13:56: 46:914]:字体已创建。字符集:Req=0,Ret=0,字体:Req=MS Shell Dlg,Ret=MS Shell Dlg错误 1722。此 Windows 安装程序包有问题。作为设置的一部分运行的程序未按预期完成。请联系您的支持人员或软件包供应商。Action ServiceRestarter,位置:C:\Program Files (x86)\My Company\My Product\,命令:“C:\Windows\SysWOW64\sc.exe”失败“我的产品”reset= 60 actions= restart/0
MSI ( s) (34:28) [13:56:48:849]: 注意: 1: 2205 2: 3: 错误
MSI (s) (34:28) [13:56:48:849]: 注意: 1: 2228 2:3:错误 4:Message
从Error
哪里选择Error
= 1709
MSI (s) (34:28) [13:56:48:849]:产品:我的产品 -- 错误 1722。此 Windows 安装程序包有问题。作为设置的一部分运行的程序未按预期完成。请联系您的支持人员或软件包供应商。Action ServiceRestarter,位置:C:\Program Files (x86)\My Company\My Product\,命令:“C:\Windows\SysWOW64\sc.exe”失败“My Product”reset=60 actions=restart/0操作于 13:56:48 结束:ServiceRestarter。返回值 3。
操作于 13:56:48 结束:安装。返回值 3。
有人可以帮帮我吗?
编辑
我使用了旧的ServiceConfig
扩展名:
<util:ServiceConfig xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
FirstFailureActionType="restart"
SecondFailureActionType="restart"
ThirdFailureActionType="restart"
ResetPeriodInDays="1"
RestartServiceDelayInSeconds="20" />
这给了我以下构建错误:
错误 CNDL0200:ServiceInstall 元素包含未处理的扩展元素“util:ServiceConfig”。请确保已提供“ http://schemas.microsoft.com/wix/UtilExtension ”命名空间中元素的扩展名。
我知道我可以-ext WixUtilExtension
通过命令行使用来解决此错误 - 但我想使用 Visual Studio 进行构建......那么我该如何调整构建命令?
唯一的机会是添加WixUtilExtension.dll
对我的项目的引用。