1

我在 WinXP 上使用 Wix3 卸载共享的 win32 SxS 程序集时遇到问题。我的 wix 文件看起来很像http://n2.nabble.com/Tutorial-How-to-install-files-into-WinSxS-td841475.html中描述的文件。

问题是,如果程序集中的模块正在使用中,卸载程序会以成功错误代码完成,但程序集处于损坏状态:清单和安全目录已被删除,但程序集目录仍然存在,其中包含我的 dll . DLL 在重新启动后仍然存在,因此不会以任何方式标记为删除。MSI 日志文件中没有明显的错误。

如果我尝试重新安装软件包,它会跳过程序集的安装。这些组件不再注册,所以我无法让安装程序再次尝试卸载。以下显示在后续安装的 msi 日志中:

MSI (c) (98:44) [11:46:56:263]:跳过装配组件的安装:{26A273E7-7F9A-4F77-9FA8-5E413A155BEC},因为装配已经存在

除了手动删除我的程序集目录之外,我找不到将 SxS 恢复到良好状态的方法,此时该目录不再受 XP 系统还原的保护。

虽然我的实际安装程序要复杂得多,但我已经能够使用一个非常基本的安装程序来重现它,该安装程序具有包含单个组件的单个功能。该组件包含一个 dll、一个清单和一个安全目录。dlls <File> 元素设置了 KeyPath、Assembly 和 AssemblyManifest 属性。安装后,我可以通过在 MSVS 中打开 DLL 来模拟加载程序集的过程。

我应该在卸载时调用额外的操作来检测和防止这种情况吗?或者,即使 WinSXS 中已经存在 DLL,是否有强制执行安装操作的方法?

有点相关,如果我尝试升级安装了该程序集的软件包,如果程序集没有更改,我也会遇到问题。安装程序决定它不需要重新安装程序集(因为它没有更改),但是当 SxsUninstallCA 运行时,它会继续并删除程序集。从安装程序的角度来看,组件仍然安装,但文件已消失。

4

1 回答 1

2

我正在做一些我相信我会遇到同样问题的东西。

在这一点上,我的假设是,我必须使用HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperationsregkey 中的一点魔力来解决这个问题,并且可能需要一点文件权限(如果文件仍然被锁定)。

当然,这需要重新启动。

当然,在您的安装程序中,您可以检查密钥是否存在并阻止安装,直到它们消失。(即“您需要重新启动”)。

于 2009-09-29T22:58:33.450 回答