【问题标题】:How do I conditionally uninstall files in WiX?如何有条件地卸载 WiX 中的文件?
【发布时间】:2015-05-13 04:14:17
【问题描述】:

我有一个应该始终传送文件的 WiX 包,但只有在满足条件时才应卸载文件。条件是,如果安装了另一个版本的产品,则不应卸载公共文件(我们不支持真正的升级,我们的升级是将文件安装到具有该软件包版本的新文件夹并安装新版本的公共文件)。

我意识到这可以通过跨组件使用相同的 GUID 或使用合并模块来实现,但我还必须考虑到我有可以安装的 InstallShield 遗留包这一事实。不幸的是,这些包的设计者不知道安装程序发生了什么,他们将文件安装到临时目录,然后将它们复制到新位置,因此 Windows Installer 不知道文件已安装。

我尝试了几种不同的方法。

方法一:

<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>

它不再起作用了。

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    我的建议是这两种方法可能都不正确。在所有情况下使用的通用解决方案我可以想到两个软件包都需要将相同的文件安装到相同的公共位置。包含这些组件的通用合并模块可确保 Windows Installer 共享正常工作,因此卸载一个产品会留下剩余产品的文件(因为引用计数基于组件 ID,并且在卸载产品时只会减少计数)。换句话说,它只是在没有传递组件或条件的情况下工作。

    【讨论】:

    • 在我看来,这似乎是正确的答案,但是当文件被没有引用计数的产品使用时会发生什么?请记住,我有可以安装的旧包,它们没有注册组件。他们在 InstallShield 中编写它,并将文件传送到临时目录,然后将它们复制到正确的位置。所以他们真的把我搞砸了。
    • 如果文件是由 InstallShield 安装到该位置,而不仅仅是一个副本,那么它就可以正常工作,因为 IS ref 以 Windows Installer 知道的方式(SharedDllRefCount 注册表)计数,这就是它的交互方式与旧版安装。卸载其他 IS 产品是否会删除它们?在不知道卸载可能会做什么的情况下,我无法说出您可能会被搞砸的程度。
    • 这太糟糕了,他们甚至没有卸载。他们的卸载只是删除一些他们本该从不做的事情。但是由于我们正在修复该软件包,因此新的软件包支持卸载。这可能就是他们在安装过程中出现如此多缺陷的原因,我们被要求修复它。
    • 所有你能说的就是这样做的不正确,如果他们想要解决这个烂摊子,他们需要迁移到你的 MSI 方式的 dolng。我认为他们希望正确修复此问题!我的倾向是将所有文件无条件地安装到该共享位置,以最佳实践方式每个组件一个文件。然后,如果他们删除了这些文件,他们可以进行修复以从您的 MSI 中恢复它们。
    • 好吧,不幸的是,我们有客户已经安装了他们的旧包,我们不能要求他们全部迁移东西。我们现在正在考虑 1)如果安装了旧版本,您无法卸载我们的软件包,2)更新 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\s-1-5-18\Components\ 和 HKCR \Installer\Features\,因此看起来文件正在被其组件使用,3) 根本没有卸载,或 4) 使用自定义操作删除文件
    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 2019-09-26
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2011-02-07
    • 2010-09-16
    相关资源
    最近更新 更多