(我需要让它直接用于Product / .msi,而不是使用Bundle / Burn 。)
(我正在使用WiX 3.6。)
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<?include $(sys.CURRENTDIR)Deployment\Data\Statics.wxi ?>
<Fragment>
<util:RegistrySearch Root="HKCU" Key="$(var.Line.Reg.Path)" Value="Version" Variable="AppAlreadyInstalled" />
</Fragment>
</Wix>
<Product Name="$(var.App.Title)" Manufacturer="!(loc.Company)" Language="!(loc.Lang)" Id="*" Version="$(var.VersionNumber)" UpgradeCode="$(var.App.UpgradeCode)">
<Package Id="*" InstallerVersion="300" Compressed="yes" InstallScope="$(var.App.Elevation)" InstallPrivileges="limited" />
<DirectoryRef Id="TARGETDIR" />
<MajorUpgrade Schedule="afterInstallValidate" DowngradeErrorMessage="!(loc.Msi.NewerVersionInstalled)" />
<Property Id='DiskPrompt' Value="$(var.App.Title) Installation Media" />
<Media Id="1" Cabinet="Media.cab" EmbedCab="yes" DiskPrompt="#1" />
<Icon Id="AppIcon" SourceFile="$(var.Icon.Path)" />
<Condition Message="Newer version already installed.">
<![CDATA[Installed OR AppAlreadyInstalled]]>
</Condition>
<Feature Id="ProductFeature" Level="1">
...
</Feature>
</Product>
答案 0 :(得分:2)
WixUtilExtension:RegistrySearch
仅适用于捆绑包。您需要WiX名称空间中的普通RegistrySearch
。您可以使用RegistrySearchRef从单独的片段中提取RegistrySearch。
但是,你认为版本比较存在问题是正确的:MSI会进行序数字符串比较,因此1.2 > 1.10
。如果安装目录位于注册表中,那么最好使用RegistrySearch和DirectorySearch以及FileSearch。 FileSearch
可以使用MinVersion
属性按版本进行搜索,因此,如果文件中包含可用于检测产品的版本,则它比字符串比较更可靠。