【问题标题】:How do I conditionally uninstall shared object (Merge Module) files in WiX?如何有条件地卸载 WiX 中的共享对象(合并模块)文件?
【发布时间】:2021-07-25 13:12:17
【问题描述】:

我有一个通用合并模块作为 Wix 安装程序 MySetup1.msi 的一部分,它应该始终交付文件并安装服务,但只有在满足条件时才应卸载合并模块文件/服务。条件是只有在传递特定属性时才应卸载公共文件。 合并模块也是 MySetup2.msi 的一部分。

我知道这可以通过跨组件使用相同的 GUID 或使用合并模块来完成,但是 MySetup1.msi 不应卸载合并模块组件,如果通过特定 FLAG 则可以卸载预期案例模块,否则应通过 MySetup2 卸载合并模块

这里有点复杂,因为我们使用通用 GUID 共享组件,MSI 安装程序服务保持对共享对象的引用 如果我们在 MySetup1.MSI 中跳过卸载,我认为一个引用计数将处于未决状态。 在 MySetup2.msi 卸载时,此文件不会被删除,因为总会有 refcount 1。

任何提示线索都非常感谢, 我知道参考计数保存在注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\Component 但对操纵 reg 条目持怀疑态度。

这是我在原始安装程序中合并此模块的代码片段,但不幸的是没有真正得到任何帮助。

<Feature Id="MyMergedFeature" Title="My Merged Feature" Level="0" AllowAdvertise="no" Absent="disallow">
<MergeRef Id='MyModule' />
  <Condition Level="0">
    <![CDATA[REMOVE ~<> "ALL"]]>
  </Condition>
</Feature>

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    我很难理解这个问题。但您应该知道的是,合并模块一旦合并到 MSI 中就不存在了。它们只是与该功能相关的组件。如果一个合并模块在两个安装程序之间共享,那么它们只是共享组件。

    级别为 0 的条件元素只是在首次安装或更改操作中隐藏该功能不显示。在我的 InstallShield 日子里,我想我记得有一条规则说,如果你将它设置为 0,它可能会成为孤立的并且永远不会被卸载。不过,如果没有测试,我不确定那部分。

    我怀疑你想多了。默认情况下,组件引用计数将保持组件安装,直到最终产品被删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2019-09-26
      • 2018-07-26
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多