我有一个MSI,可以在安装过程中创建并启动Windows服务,并在卸载过程中停止并删除该服务。这在单独安装和卸载时工作正常,但在升级时,会显示正在使用的文件对话框(仅在Vista及更高版本,因为新的Restart Manager),表明该服务是正在使用。
InstallValidate 自定义操作在 InstallExecute 序列中显示正在使用的文件对话框,该操作将在之前安排 RemoveExistingProducts 自定义操作;这意味着尚未卸载以前的版本,因此应显示正在使用的文件对话框
。MSDN文档指出必须在 InstallValidate 操作后安排 RemoveExistingProducts 操作,并且我目前已立即安排 RemoveExistingProducts 操作 InstallValidate 操作。
我想将 RemoveExistingProducts 自定义操作重新安排到 InstallValidate 自定义操作之前,以便之前的安装有机会在之前停止并删除服务strong>显示正在使用的文件对话框。我尝试重新安排操作,它似乎正常工作,没有任何不良副作用(虽然日志仍然表明 InstallValidate 操作在 RemoveExistingProducts 操作之前执行),但我对使用此解决方案犹豫不决,因为它违反了MSDN文档,并且可能存在我尚未看到的负面影响。
有人试过吗?我能想到的唯一其他选择是让新安装停止旧安装的服务,但这是不可取的,因为它要求安装有关于它可以升级的所有旧安装的信息(停止此特定服务可能涉及更多而不只是简单地调用服务管理器来阻止它。)
答案 0 :(得分:6)
我实施了问题中列出的潜在解决方案,在 InstallValidate 之前安排 RemoveExistingProducts 。我还没有看到任何问题,但是我会在安装得到更多使用后再次发布。
<强>更新强>
我们的安装已经使用了一段时间了,我没有注意到任何不良影响。
答案 1 :(得分:1)
它已经内置到MSI / Windows Installer中...唯一的问题是.NET安装程序类不使用MSI“服务安装”功能。实际发生的是MSI正在尝试使用刚刚复制的文件安装文件并运行自定义命令(即所有Visual Studio都放入MSI中)。
要解决此问题,您可以使用ORCA编辑MSI并将以下行添加到 ServiceControl 表中:
1 ServiceName 170 1 C__489628C5CC1144CB47F43E8BE7F3F31D
您可以从FILES表中查找的组件ID ...我只选择了主EXE文件的组件ID。 170是一个位图,告诉Windows Installer在安装和卸载时停止并删除该服务。
这将清除.NET安装程序添加服务的道路,您可以使用ServiceController在通过自定义命令安装服务后启动该服务。
答案 2 :(得分:0)
一个潜在的问题是,如果用户在InstallValidate期间取消(例如由于没有足够的磁盘空间或正在使用的文件)或者在安装期间,那么回滚行为是什么。理想情况是应用程序状态与之前相同(例如,安装了先前的应用程序)。您可能正在尝试使用您的顺序,尽管回滚可能是您可以不用的功能。
答案 3 :(得分:0)
我认为这个会在不违反MSDN文档的情况下帮助您,并避免将来出现任何问题。 设置一个条件“已安装或上一个版本已安装”,因为在FindRelatedProducts期间在InstallValidate操作之前设置了属性PREVIOUSVERSIONSINSTALLED,您也可以升级。 我不知道为什么,但MSV中没有记录属性PREVIOUSVERSIONSINSTALLED,但它确实存在,对我来说非常有帮助。