问题
我有一个 MSI,它在安装期间创建和启动 Windows 服务,并在卸载期间停止和删除该服务。这在自行安装和卸载时工作正常,但在升级时,会显示Files in Use对话框(仅在 Vista 及更高版本上,由于新的Restart Manager),表明该服务正在使用中。
背景
Files in Use对话框在InstallExecute序列期间由InstallValidate自定义操作显示,该操作安排在RemoveExistingProducts自定义操作之前;这意味着之前的版本尚未卸载,因此应显示“正在使用的文件”对话框。
MSDN 文档指出必须在InstallValidate操作之后安排RemoveExistingProducts操作,并且我目前在InstallValidate操作之后立即安排了RemoveExistingProducts操作。
潜在解决方案
我想将RemoveExistingProducts自定义操作重新安排到InstallValidate自定义操作之前,以便之前的安装有机会在显示“正在使用的文件”对话框之前停止并删除该服务。我尝试重新安排这些操作,它似乎可以正常工作,没有不良副作用(尽管日志仍然表明InstallValidate操作在RemoveExistingProducts操作之前执行),但我很犹豫是否使用此解决方案,因为它违反了 MSDN 文档,并且可能会有我还没有看到的不利影响。
有没有人试过这个?我能想到的唯一其他选择是让新安装停止旧安装的服务,但这是不可取的,因为它要求安装具有有关它可以升级的所有旧安装的信息(停止此特定服务可能涉及更多不仅仅是简单地调用服务管理器来停止它)。