Wix 4补丁未修改注册表值却被还原至初始值的问题咨询
Wix 4 补丁注册表值异常还原问题解析
问题现象
- 初始安装:部署由Wix 4构建的应用,其中包含注册表项
MyComments,值为XXX - 补丁A安装:正常将
MyComments值修改为YYY - 补丁B安装:仅修改其他文件组件,未改动该注册表项,但安装完成后
MyComments被还原为XXX - 特殊场景:若补丁B中主动将
MyComments修改为ZZZ,则无异常 - 临时解决方案:将包含该注册表的
CMP_SetReg组件移至单独的Feature中,问题不再出现
原因解析
这个问题的本质是Windows Installer组件修复机制与Wix补丁PatchFamily的作用范围共同导致的:
- 注册表组件
CMP_SetReg与被补丁B修改的文件组件同属MainFeature。当安装补丁B时,Windows Installer会校验该Feature下所有组件的版本一致性。由于补丁B的PatchFamily未包含CMP_SetReg,Installer判定该组件的当前版本(被补丁A修改后的版本)与补丁B对应的基线版本不匹配,触发自动修复,将组件恢复到基线状态(即初始的XXX值)。 - 当把
CMP_SetReg移至独立Feature后,补丁B的修改范围不涉及该Feature,Installer不会对这个Feature下的组件进行校验和修复,因此注册表值得以保留。 - 若补丁B的
PatchFamily包含CMP_SetReg并更新值为ZZZ,Installer会将该组件升级到补丁B的版本,不会触发还原行为。
临时解决前的主安装包Wix代码
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui"> <Package Name="App" Language="1033" Version="2.0.0.8" Manufacturer="Develop" UpgradeCode="{E0EC963D-82A9-410E-93BA-11243A15E534}" InstallerVersion="500" ProductCode="{596EF69B-157C-4C02-A566-1ED06C68B67B}"> <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /> <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" /> <DirectoryRef Id="APPDIR"> <Component Id="CMP_SetReg" Guid="{F0BD26A4-D356-4F17-BF60-4AC3EE7B820A}"> <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]" Action="write" Name="MyComments" Type="string" Value="XXX" KeyPath="yes"/> </Component> <Component Id="CMP_fileA" Guid="1307a453-6683-479f-a1be-f0fdc0d22cd5"> <File Id="FILE_fileA" Source="$(var.Path)..\app.exe" KeyPath="yes" /> </Component> . . </DirectoryRef> <Feature Id="Main" Display="hidden" Level="1" ConfigurableDirectory="APPDIR" Title="Main program" > <ComponentRef Id="CMP_SetReg" /> <ComponentRef Id="CMP_fileA" /> . . </Feature> <Feature Id="Optional" Level="1" Title="Services"> <Feature Id="Service1" Level="1" Title="Service1" > <ComponentRef Id="..." /> </Feature> . . </Feature> <CustomAction Id=... . . </Package> </Wix>
补丁代码
<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> <Patch AllowRemoval="yes" Classification="Update" DisplayName=".." Manufacturer=".." MoreInfoURL=".."> <Media Id="1000" Cabinet="MyPatch.cab"> <PatchBaseline Id="MyPatch" BaselineFile="Setup.wixpdb" UpdateFile="SetupNew.wixpdb" /> </Media> <PatchFamily Id="MyPatchFamily" Version="2.0.0.9" Supersede="yes"> <ComponentRef Id="..." /> . . </PatchFamily> </Patch> </Wix>
内容的提问来源于stack exchange,提问作者pumaikar
相关产品推荐
相关产品推荐

