在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运行时,它会转到并删除程序集。从安装程序的角度来看,组件仍在安装,但文件已不存在。