当我安装新版本的软件时,如何消除“指定的服务已存在”?

时间:2009-01-16 19:10:09

标签: visual-studio windows-services installer

我有一个包含服务项目的VS2008应用程序(我称之为ServiceProject)。我将安装项目(InstallationProject)设置为RemovePreviousVersions。此外,我为InstallationProject设置了自定义操作,从ServiceProject安装,提交,回滚和卸载主输出。

有时,当我构建新版本的安装程序时,我可以安装而不会出错。通常,当我到达设置服务的位置(在安装程序中输入用户名和密码)时 - 它会因错误而失败,“指定的服务已存在”

我不知道为什么它不一致,虽然我认为可能有某种服务签名,如果服务未经修改,它可以成功删除它,但经过修改,它没有'认识到这项服务。但是,我很少对服务进行修改,所以我怀疑是不是。

如何在不出现此错误的情况下使安装程序成功更新服务?我的解决方法是手动进入控制面板,卸载以前的应用程序,然后运行安装程序。

5 个答案:

答案 0 :(得分:19)

除了确保文件版本不同之外,StingyJack提到你还有另外一个问题。从VS文档(对不起,不在线)

  

如果您同时设置了安装和   卸载中的自定义操作   应用程序的安装项目,和你   已经启用了   RemovePreviousVersions属性   Visual Studio 2005,以前的版本   卸载了该产品的版本   在升级期间。但是,这个   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's answer in this thread

Put the VS2008 behaviour back to how it worked in VS2005(在新版本安装之前调用旧版本卸载自定义操作)使用Orca将InstallExecuteSequence.RemoveExistingProducts更改为紧跟在.InstallInitialize之后 - 通常将.RemoveExistingProducts设置为1525但是检查你的个人MSI。

我添加了script than you can add to your build process to change the MSI's InstallExecuteSequence

答案 1 :(得分:8)

在“自定义操作” - >“安装条件”属性中输入“Not(已安装或PREVIOUSVERSIONSINSTALLED)”。

答案 2 :(得分:4)

在部署每个新安装程序包时,请确保更改服务的程序集版本和GUID(在AssemblyInfo.vb / cs中)。如果它检测到相同版本,则更新失败。

答案 3 :(得分:2)

可能有所帮助,但上述任何与Ryan的答案无关的内容都没有说明。在我这样做之前,同样的问题发生在我身上:在Orca中打开.msi并找到升级表。如果previousversion安装的行(是我的第一个条目)是,您应该看到升级代码。找到当前安装的程序的.msi(要升级的程序),找到升级代码(可以在orca中执行),然后将其复制并粘贴到新的.msi的升级表中。这对我有用。

答案 4 :(得分:0)

在安装程序类中尝试此代码。我希望它能解决你的问题。

protected override void OnBeforeInstall(IDictionary savedState)
        {
            if (LaunchOnBeforeInstall())
            {
                base.OnBeforeInstall(savedState);
            }
            else
            {
                throw new Exception("You cancelled installation");
            }
        }
        public bool LaunchOnBeforeInstall()
        {
            Form2 frm2 = new Form2();
            DialogResult result = frm2.ShowDialog();
            if (result == DialogResult.Cancel)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

并且还说“NOTPREVIOUSVERSIONSINSTALLED” As SJown in Trail Image