WIX v4基于注册表搜索属性的组件条件安装失效求助
WIX v4 条件化组件安装问题解决
需求:三个组件,其中Gentor.exe和Punker.exe必装,Rogis.exe和Archa.exe需根据注册表HKLM\SOFTWARE\Promise\Agadir\Params\CtrlType的字符串值二选一安装。沿用WIX v3的条件写法无效,以下是原代码:
<Fragment> <Property Id="CTRLTYPE" Secure="yes"> <RegistrySearch Id="CTRLRInstalledSearch" Root="HKLM" Key="SOFTWARE\Promise\Agadir\Params" Name="CtrlType" <!--the registry string value to check--> Type="raw" /> </Property> <Directory Id="INSTALLFOLDER" Name="OperationRaf"> <Directory Id="dir_..." Name="Raf"> <Component Id="comp_....." Guid="...."> <File Id="file_..." Checksum="yes" KeyPath="yes" Source="..\\Release\Gentor.exe" /> </Component> <Component Id="comp_..." Guid="..."> <File Id="file_..." Checksum="yes" KeyPath="yes" Source="..\\Release\Punker.exe" /> </Component> <!-- if the registry string value is "Rogis" install component--> <Component Id="comp_..." Guid="...." Condition="CTRLTYPE=Rogis"> <File Id="file_..." Source="..\\Release\Rogis.exe" /> </Component> <!-- if the registry string value is "Archa" install component--> <Component Id="comp_..." Guid="..." Condition="CTRLTYPE=Archa"> <File Id="file_..." Source="..\\Release\Archa.exe" /> </Component> </Directory> </Directory> </Fragment>
问题排查与解决步骤:
修正注册表搜索类型
原代码中RegistrySearch的Type="raw"会返回二进制格式的注册表值,无法直接和字符串比较。改为Type="string"才能正确读取字符串类型的注册表值:<RegistrySearch Id="CTRLRInstalledSearch" Root="HKLM" Key="SOFTWARE\Promise\Agadir\Params" Name="CtrlType" Type="string" />条件表达式添加引号
WIX v4中字符串比较需要用引号包裹值,否则会被解析为属性名而非字符串。修正组件条件:<Component Id="comp_..." Guid="...." Condition='CTRLTYPE="Rogis"'> <Component Id="comp_..." Guid="..." Condition='CTRLTYPE="Archa"'>注意使用单引号包裹整个条件,避免和内部双引号冲突。
设置组件KeyPath
条件安装的组件必须指定KeyPath,否则Windows Installer无法正确判断组件是否需要安装。给条件组件的File添加KeyPath="yes":<File Id="file_..." KeyPath="yes" Source="..\\Release\Rogis.exe" /> <File Id="file_..." KeyPath="yes" Source="..\\Release\Archa.exe" />64位系统适配(若需)
如果目标系统是64位,且注册表项位于64位路径(HKLM\SOFTWARE\Wow6432Node之外),需给RegistrySearch添加Win64="yes"属性:<RegistrySearch Id="CTRLRInstalledSearch" Root="HKLM" Key="SOFTWARE\Promise\Agadir\Params" Name="CtrlType" Type="string" Win64="yes" />验证搜索执行时机
确保注册表搜索在组件条件判断前执行。默认情况下,Property内的RegistrySearch会在AppSearch序列中执行,此序列在组件Costing之前,无需额外配置。若仍有问题,可显式在InstallExecuteSequence中指定AppSearch的顺序:<InstallExecuteSequence> <AppSearch After="LaunchConditions" /> </InstallExecuteSequence>
修改后的完整代码示例:
<Fragment> <Property Id="CTRLTYPE" Secure="yes"> <RegistrySearch Id="CTRLRInstalledSearch" Root="HKLM" Key="SOFTWARE\Promise\Agadir\Params" Name="CtrlType" Type="string" /> </Property> <Directory Id="INSTALLFOLDER" Name="OperationRaf"> <Directory Id="dir_..." Name="Raf"> <Component Id="comp_....." Guid="...."> <File Id="file_..." Checksum="yes" KeyPath="yes" Source="..\\Release\Gentor.exe" /> </Component> <Component Id="comp_..." Guid="..."> <File Id="file_..." Checksum="yes" KeyPath="yes" Source="..\\Release\Punker.exe" /> </Component> <Component Id="comp_..." Guid="...." Condition='CTRLTYPE="Rogis"'> <File Id="file_..." KeyPath="yes" Source="..\\Release\Rogis.exe" /> </Component> <Component Id="comp_..." Guid="..." Condition='CTRLTYPE="Archa"'> <File Id="file_..." KeyPath="yes" Source="..\\Release\Archa.exe" /> </Component> </Directory> </Directory> </Fragment>
内容的提问来源于stack exchange,提问作者bugo tecx
相关产品推荐
相关产品推荐

