我有一个包含服务项目的VS2008应用程序(我称之为ServiceProject)。我将安装项目(InstallationProject)设置为RemovePreviousVersions。此外,我为InstallationProject设置了自定义操作,从ServiceProject安装,提交,回滚和卸载主输出。
有时,当我构建新版本的安装程序时,我可以安装而不会出错。通常,当我到达设置服务的位置(在安装程序中输入用户名和密码)时 - 它会因错误而失败,“指定的服务已存在”。
我不知道为什么它不一致,虽然我认为可能有某种服务签名,如果服务未经修改,它可以成功删除它,但经过修改,它没有'认识到这项服务。但是,我很少对服务进行修改,所以我怀疑是不是。
如何在不出现此错误的情况下使安装程序成功更新服务?我的解决方法是手动进入控制面板,卸载以前的应用程序,然后运行安装程序。
答案 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;
}
}