【发布时间】:2012-07-22 19:53:30
【问题描述】:
(我需要让它直接用于 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 时才继续安装;这听起来很难实现,因为注册表值存储为带有两个句点/句点的字符串。
- 请注意,注册表检查不是要安装的应用程序,这已由 DowngradeErrorMessage 处理。
【问题讨论】:
标签: c# .net wix registry windows-installer