卸载升级时如何摆脱wix中未使用的dll
How to get rid off unused dll's in wix when upgrade is uninstalled
我有一个代码与以前的版本相比有一些变化。在更改期间,删除了一些 dll。我正在使用 wix 来创建安装程序。所以现在,当我从旧版本升级到新版本并卸载产品时,在产品文件夹中,我看到那些旧的 dll 仍然存在。
从逻辑上讲,这是正确的,因为旧版本有这些文件。升级后,新版本会替换其新的 dll。在卸载产品(此处为新版本)时,这些 dll 不是新版本的一部分,因此不会被删除。
如何更改我的新版本部署代码来解决此升级问题?
预期结果:卸载升级版本应该会从产品文件夹中删除所有 dll。
实际上,这不合逻辑 :) 如果您 a) 确实完成了一次成功的重大升级,并且 b) 这些 Dll 仅在旧版本中,而不在您安装的较新升级中,那么它们根本不应该存在.如果升级成功,旧产品将不再存在,并且没有旧版本具有这些文件 - 它已通过升级卸载。如果您在 Programs&Features 中有两个条目,那么您没有进行正确的替换升级,并且仍然安装了旧产品。如果您在 Programs&Features 中只有一个条目,那么您对组件 ID 的使用很可能有问题。有时真的是关于那些ID。例如,如果您在升级中将相同的组件 ID 用于新升级中的其他组件,则 Windows 安装程序无法将该 ID(与旧 DLL 相关联)重新计数为零并删除旧 DLL。确保那些旧 Dll 的组件 ID 不在新升级中。除此之外,如果您曾经将这些 Dll 标记为 Permanent 或 SharedLegacy,那么当升级删除旧产品时,它们将不会被卸载。
在决定做什么之前,您应该弄清楚到底发生了什么。您不能两次安装相同的 ProductCode,因此如果您没有进行升级并且没有安装新产品,您将进入某种维护模式。如果您想实际进行升级,请使用 WiX majorupgrade 元素。
如果删除组件,则必须使用主要升级。请参阅 Changing the Product Code 以了解无法通过次要升级完成的事情列表。
@Bob Arnson:我不想进行重大升级,因为我希望以前的版本不是卸载而是升级。所以我现在想出了一个修复方法,在这些组件下使用 RemoveFile 标签,指定那些文件 ID,以防它们存在。
<RemoveFile Id = "id_to_be_removed" On = "uninstall" Name = "dll_name"/>
我有一个代码与以前的版本相比有一些变化。在更改期间,删除了一些 dll。我正在使用 wix 来创建安装程序。所以现在,当我从旧版本升级到新版本并卸载产品时,在产品文件夹中,我看到那些旧的 dll 仍然存在。
从逻辑上讲,这是正确的,因为旧版本有这些文件。升级后,新版本会替换其新的 dll。在卸载产品(此处为新版本)时,这些 dll 不是新版本的一部分,因此不会被删除。
如何更改我的新版本部署代码来解决此升级问题?
预期结果:卸载升级版本应该会从产品文件夹中删除所有 dll。
实际上,这不合逻辑 :) 如果您 a) 确实完成了一次成功的重大升级,并且 b) 这些 Dll 仅在旧版本中,而不在您安装的较新升级中,那么它们根本不应该存在.如果升级成功,旧产品将不再存在,并且没有旧版本具有这些文件 - 它已通过升级卸载。如果您在 Programs&Features 中有两个条目,那么您没有进行正确的替换升级,并且仍然安装了旧产品。如果您在 Programs&Features 中只有一个条目,那么您对组件 ID 的使用很可能有问题。有时真的是关于那些ID。例如,如果您在升级中将相同的组件 ID 用于新升级中的其他组件,则 Windows 安装程序无法将该 ID(与旧 DLL 相关联)重新计数为零并删除旧 DLL。确保那些旧 Dll 的组件 ID 不在新升级中。除此之外,如果您曾经将这些 Dll 标记为 Permanent 或 SharedLegacy,那么当升级删除旧产品时,它们将不会被卸载。
在决定做什么之前,您应该弄清楚到底发生了什么。您不能两次安装相同的 ProductCode,因此如果您没有进行升级并且没有安装新产品,您将进入某种维护模式。如果您想实际进行升级,请使用 WiX majorupgrade 元素。
如果删除组件,则必须使用主要升级。请参阅 Changing the Product Code 以了解无法通过次要升级完成的事情列表。
@Bob Arnson:我不想进行重大升级,因为我希望以前的版本不是卸载而是升级。所以我现在想出了一个修复方法,在这些组件下使用 RemoveFile 标签,指定那些文件 ID,以防它们存在。
<RemoveFile Id = "id_to_be_removed" On = "uninstall" Name = "dll_name"/>