我有一个VS2008应用程序,其中包括一个服务项目(我称之为ServiceProject).我将安装项目(InstallationProject)设置为RemovePreviousVersions.此外,我为InstallationProject 设置了自定义操作,从ServiceProject安装,提交,回滚和卸载主输出.
有时,当我构建新版本的安装程序时,我可以安装而不会出错.通常,当我到达设置服务的位置(在安装程序中输入用户名和密码)时 - 它会因错误"指定的服务已存在"而失败.
我不知道为什么它不一致,虽然我认为可能有某种服务签名,如果服务未经修改,它可以成功删除它,但经过修改后,它无法识别服务.但是,我很少对服务进行修改,所以我怀疑是这样的.
如何在没有此错误的情况下使安装程序成功更新服务? 我的解决方法是手动进入控制面板,卸载以前的应用程序,然后运行安装程序.
除了确保文件版本不同,StingyJack提到你有另一个问题.来自VS文档(抱歉,不在线)
如果已在应用程序的安装项目中设置了安装和卸载自定义操作,并且已在Visual Studio 2005中启用了RemovePreviousVersions属性,则在升级期间将卸载以前版本的产品.但是,此行为在Visual Studio 2008中更改如下:
在Visual Studio 2005中,从v1.0.0升级到v1.0.1时,自定义操作的调用如下:
v1.0.0自定义操作卸载()
v1.0.1自定义操作Install()
在Visual Studio 2008中,未调用卸载操作,如下所示:
v1.0.1自定义操作Install()
如果您依赖于旧行为创建了自定义操作,则需要修改新行为的代码.此行为更改仅影响更新,而不影响卸载.
因此,您正在使用自定义操作安装服务 - 但是在升级时,未按预期调用卸载部件,并且您尝试在现有的正在运行的版本上进行安装.
我认为当它要求重启时,因为它无法在运行时更新服务文件.
两种选择: -
将代码添加到"安装/提交"自定义操作以停止服务,等待安装程序更换服务文件,然后重新启动服务.请参阅PonalSuper3在此主题中的答案
通过使用Orca将InstallExecuteSequence.RemoveExistingProducts更改为紧随其后的.InstallInitialize - 通常将.RemoveExistingProducts设置为1525,将VS2008的行为恢复到它在VS2005中的工作方式(在新版本安装之前调用旧版本卸载自定义操作)但请检查您的个人MSI.
我添加了一个脚本,而不是添加到构建过程中以更改MSI的InstallExecuteSequence
将"Not(已安装或PREVIOUSVERSIONSINSTALLED)"放入"自定义操作" - >"安装条件"属性中.