我有以下.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>
哪个不起作用,因为如果使用安装程序&lt; MsiServiceConfigFailureActions
table不起作用5.0,即使使用InstallerVersion="500"
我唯一得到的是错误:
无法配置Serivce“我的产品”(我的产品)。这可以 是包或您的权限的问题。验证你 拥有足够的权限来配置系统服务。
(是的,......我也尝试了InstallPrivilges="elevated"
- 但......根据this,真正的问题是Action="restartService"
所以...使用CustomAction
是要走的路(或不是?)。
我有以下日志输出
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“失败”我的产品“reset = 60 actions = restart / 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 Installer程序包存在问题。作为设置的一部分运行的程序没有按预期完成。请联系您的支持人员或包装供应商。操作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:SELECTMessage
FROMError
WHEREError
= 1709
MSI(s)(34:28)[13:56:48:849]:产品:我的产品 - 错误1722.此Windows Installer程序包存在问题。作为设置的一部分运行的程序没有按预期完成。请联系您的支持人员或包装供应商。操作ServiceRestarter,位置:C:\ Program Files(x86)\ My Company \ My Product \,命令:“C:\ Windows \ SysWOW64 \ sc.exe”失败“我的产品”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进行构建......那么我该如何调整build-command?
只有机会在我的项目中添加对WixUtilExtension.dll
的引用。
答案 0 :(得分:20)
我可以看到你只尝试了MSI 5.0附带的ServiceConfig元素。但是,another ServiceConfig element in UtilExtension已存在很长一段时间,而the thread you mention in your question confirms似乎有效。
util:ServiceConfig元素包含您要使用的3个参数:FirstFailureActionType
,SecondFailureActionType
和ThirdFailureActionType
,所有参数都接受相同的值枚举 - {{1} },none
,reboot
和restart
。
尝试一下,如果它有效,那么它比自定义动作更好。
答案 1 :(得分:11)
对于使用VS2015构建的WIX V 4.0,以下工作:
1:确保WIX项目引用了WixUtilExtension.dll程序集。
2:将http://wixtoolset.org/schemas/v4/wxs/util ns添加到根Wix元素。请注意,这是WIX 4.0的正确NS(与先前版本不同,为http://schemas.microsoft.com/wix/UtilExtension)。
<Wix
xmlns="http://wixtoolset.org/schemas/v4/wxs"
xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"
>
3:确保ServiceConfig元素的前缀是正确的命名空间参考。
<ServiceInstall
Id="MyService"
Type="ownProcess"
Name="MyService"
DisplayName="MyService"
Description="My Service"
Start="auto"
Account="[SERVICEACCOUNT]"
Password="[SERVICEPASSWORD]"
ErrorControl="normal"
>
<util:ServiceConfig
FirstFailureActionType='restart'
SecondFailureActionType='restart'
ThirdFailureActionType='restart'
RestartServiceDelayInSeconds='30'
ResetPeriodInDays='1'/>
</ServiceInstall>
答案 2 :(得分:0)
在Visual Studio中,为避免在CLI中使用-ext,您可以执行以下操作:
当然,您添加了资源:<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
然后,在解决方案资源管理器中 - &gt;参考文献 - &gt;加.. WixUtilExtension.dll
之后,一切都像魅力一样。 (wix 3.10)
当然,如果您确实使用了utils中的第二个ServiceConfig。与<util:ServiceConfig blablabla