Wix v4自定义元素条件中无法引用Feature操作状态
Wix v4中Feature操作状态引用导致构建失败的问题解决
在Wix v4中为自定义操作的Install Execute Sequence设置条件时,直接用&引用Feature的操作状态会触发构建错误。
问题重现
相关代码片段:
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> <Package Name="New App" Manufacturer="Coder" Version="1.0.0.0" Scope="perMachine" UpgradeCode="56858172-dbce-452f-855c-2c24cc44a192"> <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" /> <MediaTemplate EmbedCab="true"/> <Property Id="POWERSHELL" Value="powershell.exe"/> <CustomAction Id="PsInstallSkdTasks" Property="POWERSHELL" Return="asyncNoWait" ExeCommand="-File "[INSTALLFOLDER]\InstallScheduledTasks.ps1"" /> <InstallExecuteSequence> <Custom Action="PsInstallSkdTasks" OnExit="success" Condition="(?CompPsIns = 3) AND ((!Main = 3) OR (&Main = 3))" /> </InstallExecuteSequence> <Feature Id="Main" Level="1" AllowAdvertise="false" Display="expand" Title="Main App" Description="Descr..."> <ComponentGroupRef Id="CompGrpMain" /> </Feature> </Package> </Wix>
构建时出现错误:
error WIX0104: Not a valid source file; detail: ' ' is an unexpected token. The expected token is ';'.
如果将&Main改为&Main;,则会提示:
该实体未定义
问题原因
XML语法中,&是实体引用的起始标记,直接写&Main会被XML解析器视为未完成的实体引用(缺少结尾的;),从而触发语法错误;而写成&Main;时,XML解析器会尝试查找名为Main的预定义实体,但Wix并未定义该实体,因此同样报错。
解决办法
在Wix的Condition属性中,将引用Feature操作状态的&替换为XML转义字符&。XML解析器会先将&解析为&,之后Wix在处理条件逻辑时就能正确识别Feature的操作状态引用。
修改后的Condition代码:
<Custom Action="PsInstallSkdTasks" OnExit="success" Condition="(?CompPsIns = 3) AND ((!Main = 3) OR (&Main = 3))" />
这样修改后,构建就能正常通过,同时条件逻辑保持原有功能。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

