我已经进入了一个状态,我的WiX Bootstrapper版本已经出现在现场,并且很难看到我如何能够解决新版本的问题。
基本上,那里的版本有几个安装SQL CLR&的MSIPackage元素。 SMO使用Mircosoft的标准MSI(SQLSysClrTypes.msi& SharedManagementObjects.msi) - 但不幸的是它们是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,那么产品是UNINSTALLED - 这显然不是我想要的。
我从来没有希望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;然后我不想做任何事情......当然不想用MSALackages调用它们,因为这会卸载它们。
我已经用各种各样的想法绞尽脑汁,但是在某些情况下,他们都会因为installCondition评估为false而最终删除了SMO。我想也许我可以有一些逻辑,在64位PC上安装x64版本,在32位PC上安装x86版本,但即使这样,至少有一个MSIPackage的安装条件会评估为假并最终删除一个版本!!
任何对此的帮助都会感激不尽!
干杯,
大克里斯。
答案 0 :(得分:0)
MsiPackage
has a property Permanent
声明是否可以卸载程序包。将其设置为&#34;是&#34;将阻止捆绑包尝试卸载它。
但是,我不确定将该属性添加到新捆绑包是否会阻止旧捆绑包卸载它。