我在C#中开发了一个Windows服务。我的项目有Installer和Setup项目。
安装项目,安装服务非常好,它没有任何问题,但当我更改项目并创建其他设置时,新安装程序不会安装新服务,因为它已经存在!
是否可以创建卸载服务然后安装它的设置?
答案 0 :(得分:2)
问题是VS2008设置升级以及以后使用安装程序类和安装顺序,1)在旧产品上安装新产品,使用文件版本检查,运行安装自定义操作2)删除运行卸载自定义操作的旧产品并删除不再使用的文件。 VS 2005不是这样的。因此,当服务已存在时,安装服务的安装程序类自定义操作正在运行。有时您可以恢复到VS 2005升级机制,首先删除所有旧安装的文件,包括数据库等,所以请记住这一点。您可以通过使用Orca,InstallExecuteSequence表修改MSI文件,并在InstallValidate之后立即重新排序RemoveExistingProducts操作。否则做这两个:
始终将服务二进制文件安装到固定位置(这意味着不是可浏览的Program Files文件夹)。该服务的卸载自定义操作应具有NOT UPGRADINGPRODUCTCODE的条件,以便升级不会尝试卸载它(但直接卸载将)。它需要位于固定位置,因为此升级解决方案不会安装或卸载服务 - 它只是更新二进制文件 - 但显然您不希望服务条目引用已更改位置的服务。
在升级中,对于服务的安装自定义操作,条件为NOT PREVIOUSVERSIONSINSTALLED。这意味着它不会尝试重新安装服务(这就是为什么你会得到“已经存在”的错误)但如果你的文件版本增加了它会更新exe。
如果您在MSDN安装论坛http://social.msdn.microsoft.com/Forums/en-US/home?forum=winformssetup搜索PREVIOUSVERSIONSINSTALLED,那么很多帖子都与此问题有关,还有更多的讨论和解释。
编辑:安装程序类不是必需的,因为Windows Installer可以为您完成所有这些操作,这就是为什么这只是VS安装项目的问题。迁移到使用MSI ServiceInstall和ServiceControl表的工具将使您无需安装/卸载/停止/启动服务的任何代码。
答案 1 :(得分:-1)
您可以通过正确配置MSI属性来实现。单击安装程序项目,然后按 F4 查看MSI的属性窗口。
当您转到属性时,您可以看到两种类型的Upgrade code
和Product Code
属性。每次创建/发布新的Windows服务安装程序时,请确保保留相同的升级代码,但更改产品代码。
将DetectNewerInstalledVersions
属性更改为true
。
将RemovePreviousVersions
设为true
。
现在将version
号码更改为上一版本的更高版本,如果您之前的版本是1.0.2,请将新版本更改为1.0.3。
当您安装具有上述设置的MSI时,MSI将检查是否有任何其他产品安装了相同的升级代码,如果找到产品,那么它将检查新安装是否具有更高版本。如果满足所有条件,它将首先删除现有(较旧)版本并安装较新版本。