如果没有RegistryValue或RegistryValue低于1.3.44,则在WiX中生成LaunchCondition

时间:2012-07-22 19:53:31

标签: c# .net wix registry windows-installer

我需要让它直接用于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>
  • 我认为 AppAlreadyInstalled 目前从未设置,因为它位于不同文件的片段中。
  • 然后,如果找不到注册表值/不存在注册表值,我实际上希望继续安装。
  • 但如果确实存在,我希望只有在注册表值低于某个值时才能继续安装。仅当 AppAlreadyInstalled&lt; 44年3月1日;这听起来很难实现,因为注册表值存储为一个包含两个句号/句点的字符串。
  • 请注意,注册表检查不是要安装的应用程序,已由DowngradeErrorMessage处理。

1 个答案:

答案 0 :(得分:2)

WixUtilExtension:RegistrySearch仅适用于捆绑包。您需要WiX名称空间中的普通RegistrySearch。您可以使用RegistrySearchRef从单独的片段中提取RegistrySearch

但是,你认为版本比较存在问题是正确的:MSI会进行序数字符串比较,因此1.2 > 1.10。如果安装目录位于注册表中,那么最好使用RegistrySearchDirectorySearch以及FileSearchFileSearch可以使用MinVersion属性按版本进行搜索,因此,如果文件中包含可用于检测产品的版本,则它比字符串比较更可靠。