Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序
Posted
技术标签:
【中文标题】Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序【英文标题】:Wix/Burn - condition to not run MSIPackage and thus not uninstall app 【发布时间】:2017-05-23 17:42:20 【问题描述】:我的 WiX Bootstrapper 版本已经投入使用,我已经进入了一些状态,我正在努力寻找如何解决新版本的问题。
基本上,现有的版本有几个 MSIPackage 元素,它们使用 Mircosoft 的标准 MSI(SQLSysClrTypes.msi 和 SharedManagementObjects.msi)安装 SQL CLR 和 SMO - 但不幸的是它们是 x64 版本。现在这对于 64 位 PC 来说没问题(因为我们的应用程序可以使用 64 位版本)等等这些 PC 都可以。但很明显,当有人尝试在 32 位机器上安装它时,它会失败。
那么,我希望新的 setup.exe 做什么;是检测是否安装了 64 位版本及其版本(我通过注册表搜索进行);如果是,则不要执行任何操作(即不要安装 x86 版本)。还检测是否安装了 x86 版本及其版本(我可以再次这样做) - 然后只安装 x86 版本;如果未安装 x86 或 x64 版本(或者它们不是正确的版本 - 在本例中为 v13.0.1601.5)
我的逻辑是:
<util:RegistrySearch Id="IsSMOInstalledx86"
Root="HKLM"
Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion"
Value="Version"
Result="value"
Variable="SMOVersionx86"/>
<util:RegistrySearch Id="IsSMOInstalledx64"
Root="HKLM"
Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion"
Value="Version"
Win64="yes"
Result="value"
Variable="SMOVersionx64"/>
和
<MsiPackage SourceFile="$(var.DependenciesPath_Microsoft)\System CLR Types for SQL Server 2016\v13.0.1601.5\SQLSysClrTypes.msi"
Id="SQLCLR"
DisplayName="System CLR Types for SQL Server 2016"
Visible="yes"
InstallCondition="(SMOVersionx86 <> "13.0.1601.5") AND (SMOVersionx64 <> "13.0.1601.5")"
SuppressSignatureVerification="yes"/>
<MsiPackage SourceFile="$(var.DependenciesPath_Microsoft)\Shared Management Objects\v13.0.1601.5\SharedManagementObjects.msi"
Id="SQLSMO"
After="SQLCLR"
DisplayName="Shared Management Objects for SQL Server 2016"
Visible="yes"
InstallCondition="(SMOVersionx86 <> "13.0.1601.5") AND (SMOVersionx64 <> "13.0.1601.5")"
SuppressSignatureVerification="yes"/>
但我的问题是,当它在 64 位 PC(已安装 SMO)上运行时 - InstallCondition 评估为 FALSE 并且正如 WiX 文档明确指出的那样;如果它的评估结果为 FALSE,则该产品已卸载 - 这显然不是我想要的。
从不存在我希望 InstallCondition 评估为 FALSE 的情况,即我永远不应该卸载 SMO(如果没有其他原因,用户可能已经安装了它以供其他应用程序使用,即不是我们的应用程序)。我可以删除 installCondition,然后它只会在 32 位和 64 位机器上安装 x86 版本 - 这很好;但有点不合时宜。
所以,我想用伪代码做的是:
If SMOVersionx86 <> "13.0.1601.5" AND SMOVersionx64 <> "13.0.1601.5"
then
call the MSIPackages (with no installcondition or always TRUE) to INSTALL
else
don't call the MSIPackages"
Endif
即如果条件结果为 FALSE;那么我不想做任何事情......当然不想用 FALSE 调用 MSIPackages,因为这会卸载它们。
我绞尽脑汁想出了各种各样的想法,但在某些情况下,它们都最终导致 installCondition 评估为 false,因此最终删除了 SMO。我想也许我可以有一些逻辑,在 64 位 PC 上安装 x64 版本,在 32 位 PC 上安装 x86 版本,但即便如此,至少 MSIPackage 的安装条件之一将评估为假并最终删除一个版本!
我们将不胜感激地收到任何帮助!
干杯,
大克里斯。
【问题讨论】:
【参考方案1】:MsiPackage
has a property Permanent
声明是否可以卸载包。将其设置为“yes”将阻止捆绑包尝试卸载它。
但是,我不确定将该属性添加到新包中是否会阻止旧包卸载它。
【讨论】:
以上是关于Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序的主要内容,如果未能解决你的问题,请参考以下文章