我有一个应始终提供文件的WiX软件包,但只应在满足条件时卸载文件。如果安装了另一个版本的产品,则不应该卸载常见文件(我们不支持真正的升级,我们的升级是将文件安装到具有软件包版本的新文件夹并安装新版本的公共文件文件)。
我意识到这可以通过在组件之间使用相同的GUID或使用合并模块来实现,但我还必须考虑到我可以安装InstallShield的旧版软件包这一事实。不幸的是,这些软件包的设计者不知道安装程序发生了什么,他们将文件安装到临时目录,然后将它们复制到新位置,因此Windows Installer不知道文件已安装。
我尝试了几件不同的事情。
方法#1:
<Component Id="myfile.dll" Guid="{YOUR-GUID-HERE}" Transitive="yes" >
<Condition>OTHER_VERSIONS_PRESENT ~= "FALSE"</Condition>
<File Id="myfile.dll" KeyPath="yes" Source="$(var.PATH_TO_BIN_FILES)myfile.dll" />
</Component>
方法#2:
<Component Id="myfile.dll" Guid="{YOUR_GUID_HERE}" Permanent="yes" >
<File Id="myfile.dll" KeyPath="yes" Source="$(var.PATH_TO_BIN_FILES)myfile.dll" />
</Component>
<Component Id="myfile.dll_remove" Guid="{YOUR_GUID_HERE}" Transitive="yes" >
<RemoveFile Id="myfile.dll_remove" Name="myfile.dll" On="uninstall" />
<Condition>OTHER_VERSIONS_PRESENT ~= "FALSE"></Condition>
</Component>
其他信息
以下是我使用自定义操作和条件的属性:
<Property Id="OTHER_VERSIONS_PRESENT" Value="FALSE" />
以下是我设置OTHER_VERSIONS_PRESENT属性的自定义操作的计划。根据是否存在其他版本的产品,我已经验证它已正确设置为true或false。
<Custom Action="FindOtherVersionsOfProduct" After="CostFinalize" />
我也尝试过上述方法,CDATA包裹着条件,但这也失败了。另外,我尝试更改设置属性时的安装顺序。我尝试过不同的条件。但没有任何效果。
提前感谢您提供给我的任何支持。
编辑:方法1正在运行,但一旦我将其更改为
<Condition>NOT Installed OR ((REMOVE ~= "ALL") AND (OTHER_VERSIONS_PRESENT ~= "FALSE"))</Condition>
它不再有效。
答案 0 :(得分:0)
我的建议是这两种方法都可能不正确。在所有情况下使用的一般解决方案我可以想到两个包都需要将相同的文件安装到相同的公共位置。包含这些组件的公共合并模块可确保Windows Installer共享正常工作,因此卸载一个产品会使剩余产品留下文件(因为引用计数基于组件ID,并且只是在卸载产品时减少计数)。换句话说,它只是在没有传递性组件或条件的情况下工作。