卸载升级时如何摆脱wix中未使用的dll

Posted

技术标签:

【中文标题】卸载升级时如何摆脱wix中未使用的dll【英文标题】:How to get rid off unused dll's in wix when upgrade is uninstalled 【发布时间】:2015-03-09 19:06:39 【问题描述】:

我的代码与以前的版本相比有一些变化。在更改期间,删除了一些 dll。我正在使用 wix 创建安装程序。所以现在,当我从旧版本升级到新版本时,当我卸载产品时,在产品文件夹中,我看到那些旧 dll 仍然存在。

从逻辑上讲,旧版本有这些文件是正确的。升级后,新版本会替换其新的 dll。卸载产品(此处为新版本)时,这些 dll 不是新版本的一部分,因此不会被删除。

如何更改我的新版本部署代码以解决此升级问题?

预期结果:卸载升级版本应该会从产品文件夹中删除所有 dll。

【问题讨论】:

【参考方案1】:

如果您删除组件,则必须使用主要升级。请参阅 Changing the Product Code 了解通过小升级无法完成的事情的列表。

【讨论】:

【参考方案2】:

实际上,这不合逻辑 :) 如果您 a) 确实成功地进行了重大升级,并且 b) 那些 Dll 仅在旧版本中而不是在您安装的较新升级中,那么它们根本就不应该存在。如果升级成功,旧产品将不再存在,并且没有旧版本具有这些文件 - 它已被升级卸载。如果您在 Programs&Features 中有两个条目,那么您没有进行正确的替换升级,并且仍然安装了旧产品。如果您在 Programs&Features 中只有一个条目,那么您对组件 ID 的使用很可能有问题。有时,这确实与这些ID有关。例如,如果您在升级中将相同的组件 ID 用于新升级中的其他内容,则 Windows Installer 无法将该 ID(与该旧 Dll 关联)归零并删除旧 DLL。确保那些旧 Dll 的组件 ID 不在新升级中。除此之外,如果您曾经将这些 Dll 标记为永久或 SharedLegacy,那么当升级删除旧产品时,它们将不会被卸载。

在决定做什么之前,你应该弄清楚到底发生了什么。您不能两次安装相同的 ProductCode,因此如果您没有进行升级并且没有安装新产品,您将进入某种维护模式。如果您想实际进行升级,请使用 WiX majorupgrade 元素。

【讨论】:

我不认为这是一个重大升级,因为产品 ID 没有改变。我对么?我检查了组件 ID,它没有在任何地方的新升级中使用。我在 Programs&Features 中只有一个条目。还有其他建议吗? 我想我可以使用自定义操作,但我还不知道要添加的每个属性的值。任何建议都会很棒.. 阅读我更新的答案。如果产品 ID 相同并且您刚刚安装了新的 MSI,那么您除了对已安装的产品进行维护修复之外什么也没做。您尚未安装新产品。 是的,你是对的,这不是重大升级。然后回到老问题:如何删除新版本中没有提到的那些dll? 在我的回答中,如果您进行了适当的主要升级,那么就不要在新的升级设置中包含 Dll。重大升级会卸载旧版本,应该与普通卸载旧产品没有什么不同。如果普通卸载没有留下 Dll,但升级确实如此,那么再次阅读答案的第一部分。【参考方案3】:

@Bob Arnson:我不想进行重大升级,因为我希望以前的版本不被卸载而是升级。所以我想出了一个修复方法,现在在这些组件下使用 RemoveFile 标记,指定在它们存在时要删除的那些文件 ID。

<RemoveFile Id = "id_to_be_removed" On = "uninstall" Name = "dll_name"/>

【讨论】:

你走错了方向——这不是升级的方法。听起来您需要创建一个补丁来更新现有已安装的应用程序。

以上是关于卸载升级时如何摆脱wix中未使用的dll的主要内容,如果未能解决你的问题,请参考以下文章

在wix中进行重大升级时如何只停止而不卸载Windows服务?

C++、Qt - 如何摆脱 dll 依赖项?

带有COM dll和服务的Wix安装程序

WiX 安装程序在卸载时删除文件,但在升级时不删除

无需卸载的 Wix 安装程序升级

如何实现 WiX 安装程序升级?