卸载正在使用的共享程序集,使WinSxs处于错误状态

时间:2009-09-15 06:09:31

标签: windows-xp wix wix3 winsxs

我在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 System Restore的保护。

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

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

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

1 个答案:

答案 0 :(得分:2)

我正在研究一些我认为会遇到同样问题的事情。

我在这一点上的假设是,我必须通过HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations regkey中的一点mojo来解决这个问题,并且可能会有一些文件权限(如果文件仍然被锁定)。

当然需要重启。

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