代码之家  ›  专栏  ›  技术社区  ›  Martin

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

  •  1
  • Martin  · 技术社区  · 15 年前

    在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、一个清单和一个安全目录。dlls<file>元素设置了keypath、assembly和assemblymanifest属性。安装后,我可以通过在MSV中打开DLL来模拟加载程序集的过程。

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

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

    1 回复  |  直到 15 年前
        1
  •  2
  •   Garrett Serack    15 年前

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

    我现在的假设是我必须用一点来自 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations regkey,可能还有一点文件权限漏洞(如果文件仍然被锁定)。

    当然,这需要重新启动。

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