问题
我有一个MSI,它在安装期间创建和启动Windows服务,并在卸载期间停止和删除该服务。这本身在安装和卸载时工作良好,但升级时会显示Files in Use对话框(仅在Vista上,随后由于新的重启管理器),这表明服务正在使用。
背景
在InstallExecute序列期间,InstallValidate自定义操作会显示“正在使用的文件”对话框,该操作安排在RemoveExistingProducts自定义操作之前;这意味着上一个版本尚未卸载,因此应显示“使用中的文件”对话框。
MSDN文档表明,RemoveExistingProducts操作必须排在InstallValidate操作之后,而且我目前在InstallValidate操作之后立即调度了RemoveExistingProducts操作。
势解
我想将RemoveExistingProducts自定义操作重新安排到InstallValidate自定义操作之前,以便在显示文件在使用对话框之前,以前的安装有机会停止和删除服务。我试着重新安排操作的时间,它似乎正常工作,没有不良副作用(尽管日志仍然表明InstallValidate操作在RemoveExistingProducts操作之前执行),但是我不太愿意使用这个解决方案,因为它违反了MSDN文档,而且可能有一些我还没有看到的负面影响。
有人试过这个吗?我唯一能想到的其他选择是让新安装停止旧安装的服务,但这是不可取的,因为它要求安装包含有关它可以升级的所有旧安装的信息(停止这个特定的服务可能不仅仅是简单地调用service Manager来停止它)。
发布于 2010-02-16 15:13:10
我实现了问题中列出的潜在解决方案,即将RemoveExistingProducts排在InstallValidate.之前我还没有看到任何问题,但我会在安装得到更多的使用后再发帖。
更新
我们的安装已经使用了一段时间,我没有注意到任何不良影响。
发布于 2011-04-07 04:58:05
它已经内置到MSI / Windows安装程序..。唯一的问题是.NET安装程序类不使用MSI“服务安装”特性。实际发生的情况是,MSI试图使用刚刚复制的文件安装文件并运行自定义命令(即Visual在MSI中所放的全部文件)。
要解决这个问题,可以使用ORCA编辑MSI,并将下面的行添加到ServiceControl表中:
1 ServiceName 170 1 C__489628C5CC1144CB47F43E8BE7F3F31D您可以从文件表中查找的组件ID .我只是选择了主EXE文件的组件ID。170是一个位图,它告诉Windows安装程序在安装和卸载时停止和删除服务。
这将为.NET安装程序添加服务扫清道路,您可以在通过自定义命令安装服务之后使用ServiceController启动服务。
发布于 2010-01-28 22:24:00
一个潜在的问题是,如果用户在InstallValidate (例如,由于没有足够的磁盘空间或正在使用的文件)或安装期间取消,回滚行为是什么。理想的情况是,应用程序状态与以前相同(例如,安装了之前的应用程序)。您可能会放弃排序,尽管回滚可能是您可以不使用的特性。
https://stackoverflow.com/questions/2057936
复制相似问题