实际上,这个问题是为了避免我不会解决的问题
当我安装产品一次并再次使用MSI时,将执行卸载过程。 但是,这不会从注册表中删除残留信息,必须使用“ Windows Installer清理”清理这些残留信息,并且在重新安装时,会发生注册表权限问题。
我看到了Checking for Oldies,但是发现FindRelatedProducts仅在首次安装时执行,也就是说,当我再次安装MSI时,FindRelatedProducts没有执行。
<Upgrade Id='YOURGUID-7349-453F-94F6-BCB5110BA4FD'>
<UpgradeVersion OnlyDetect='yes' Property='SELFFOUND'
Minimum='1.0.1' IncludeMinimum='yes'
Maximum='1.0.1' IncludeMaximum='yes' />
<UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND'
Minimum='1.0.1' IncludeMinimum='no' />
</Upgrade>
<CustomAction Id='AlreadyUpdated' Error='Foobar 1.0 has already been updated to 1.0.1 or newer.' />
<InstallExecuteSequence>
<Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom>
<Custom Action='NoDowngrade' After='FindRelatedProducts'>NEWERFOUND</Custom>
</InstallExecuteSequence>
所以我想问你们 安装MSI后,每次运行MSI时如何检查?是否安装了相同的版本,如果已经安装了相同的版本,请退出安装过程。
答案 0 :(得分:0)
再次运行“相同” MSI时,它将进入维护模式,通常只是维修。 Windows甚至不需要使用用于此“安装”的MSI,因为Windows使用原始MSI进行安装,该MSI可能是也可能不是您尝试再次安装的MSI。因此,尚不清楚您所说的“卸载过程”是什么意思,或者您期望运行相同的MSI实际要做什么。
FindRelatedProducts用于重大升级,但这意味着增加ProductVersion并更改ProductCode。运行相同的MSI不会引起重大升级(请参阅WiX MajorUpgrade元素)。
那么,再次运行同一MSI时,您期望发生什么?似乎您没有卸载它,因此它将使用原始MSI文件进入维护模式,因此您无法更改该行为,因为它已嵌入在已安装产品的MSI中。由于您显然没有卸载已安装的产品,因此它不会删除其注册表项。您应该说出这些残留注册表项是什么,以及如果实际上没有卸载产品,为什么要保留这些残留项。
答案 1 :(得分:0)
MSI压缩 :我不确定您到底做了什么-您似乎已经压缩了已安装的MSI-完全不建议这样做。它可能会导致严重的问题-注册表中甚至包括全部MSI数据库损坏。
但是,首先要注意的是:
主要升级元素 :您可以使用更方便的MajorUpgrade Element
来代替使用的较旧样式的元素。这是older-Style Upgrade Elements in use。以下是更现代的MajorUpgrade convenience element
的示例:
<MajorUpgrade Schedule="afterInstallInitialize"
DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."
AllowDowngrades="no" AllowSameVersionUpgrades="no" />
也许尝试使用此元素而不是您正在使用的元素。只需注释掉旧的,然后替换为这个简单的元素即可。如果正确执行此操作,则主要升级应“开箱即用”。确保在Product Element中指定 UpgradeCode 。参见documentation for major upgrades
相关链接:
我没有完全理解您的问题的这一部分 :“ 当我安装产品一次并再次使用MSI时,将执行卸载过程。但是,这不会从注册表中删除残留信息,必须使用“ Windows Installer清理”清理这些残留信息,并且在重新安装时,会发生注册表权限问题”。
Add / Remove programs
成功卸载吗?卸载失败了吗?重新安装时出现什么错误消息?您需要了解包装代码,产品代码和升级代码。包代码是为每个编译和构建自动生成的。您可以通过在product元素中将其设置为*来设置自动生成的产品代码,也可以对其进行硬编码并根据需要进行更改。定义后,升级代码应保持不变。请谷歌搜索这些不同代码之间的区别-我现在没有时间总结这个解释。