WIX MSI perMachine 安装程序将已安装属性写入 HKCU 而不是 HKLM。
症状之一是我用来检测安装旧版本产品的尝试的原始逻辑失败了,因为我依赖 Installed 属性在之前执行安装的系统上进行定义。为了清楚起见,这种逻辑在过去是有效的,但现在我正在做回归测试,但它失败了。
我用 orca 编辑了 msi 并修改了测试这个的启动条件。我将启动条件更改为“已安装”并将消息更改为“未安装”,然后在安装了我们的应用程序的几个系统上运行安装程序。如果 Installed 为真,则安装程序将运行,但在每种情况下,安装程序都会显示消息框,这意味着它找不到注册表项。
我查看了所有这些系统,“已安装”注册表项位于 HKCU/Software/company/product/installed=1 而不是 HKLM。
这也是一个 64 位安装程序,当我运行安装程序时,它会进入 UI,我查看任务管理器以确保它运行的是 64 位版本的 msiexec。
这是停止工作的相关 WIX 片段。见第一个启动条件。我正在添加 Product ... 部分的开头。
<Product Id="*"
Name="$(var.ProductDisplayName)"
Language="1033"
Version="$(var.OurVersion)"
Manufacturer="$(var.ProductAuthor)"
UpgradeCode="$(var.ProductUpgradeCode)">
<Product Id="*"
Name="$(var.ProductDisplayName)"
Language="1033"
Version="$(var.VayTekVersion)"
Manufacturer="$(var.ProductAuthor)"
UpgradeCode="$(var.ProductUpgradeCode)"
>
<Package
Description="$(var.ProductDisplayName)"
Comments="$(var.ProductDisplayComment)"
Manufacturer="$(var.ProductAuthor)"
InstallerVersion="301" Compressed="yes"
Platform="$(var.Platform)"
InstallScope="perMachine"
InstallPrivileges="elevated"/>
<Upgrade Id="$(var.ProductUpgradeCode)">
<UpgradeVersion Minimum="$(var.OurVersion)"
IncludeMinimum="no"
OnlyDetect="yes"
Property="NEWERPRODUCTFOUND" />
<UpgradeVersion
Minimum="07.01.01001" IncludeMinimum="yes"
Maximum="$(var.OurVersion)" IncludeMaximum="no"
Property="PREVIOUSVERSIONSINSTALLED"/>
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallFinalize"/>
</InstallExecuteSequence>
<Condition
Message="A later version of the product is already installed. Setup will now exit.">
(NOT NEWERPRODUCTFOUND) OR (NOT Installed)
</Condition>
在我盯着代码一会儿后,我删除了“未安装”逻辑并离开了
NOT NEWERPRODUCTFOUND
这并不理想,但它适用于大多数情况。
任何人都知道为什么注册表项被放置在错误的配置单元中?