【发布时间】:2017-06-02 22:19:36
【问题描述】:
我用 C# 开发了一个 Windows 服务。我的项目有安装程序和安装项目。
安装项目,安装服务很好,没有任何问题,但是当我更改项目并创建其他安装时,新安装不安装新服务,因为它已经存在!
有什么方法可以创建卸载服务然后安装它的设置?
【问题讨论】:
标签: c# windows-installer installation
我用 C# 开发了一个 Windows 服务。我的项目有安装程序和安装项目。
安装项目,安装服务很好,没有任何问题,但是当我更改项目并创建其他安装时,新安装不安装新服务,因为它已经存在!
有什么方法可以创建卸载服务然后安装它的设置?
【问题讨论】:
标签: c# windows-installer installation
问题在于 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 表的工具将使您不再需要任何代码来安装/卸载/停止/启动服务。
【讨论】:
您可以通过正确配置 MSI 属性来实现。点击 Installer 项目并按 F4 以查看 MSI 的属性窗口。
当您转到属性时,您会看到两种类型的属性,即Upgrade code 和Product Code。每次创建/发布新的 Windows 服务安装程序时,请确保保留相同的升级代码,但更改产品代码。
将DetectNewerInstalledVersions 属性更改为true。
将RemovePreviousVersions 设置为true。
现在将version 编号从上一版本更改为更高版本,如果您之前的版本是 1.0.2,请将新版本更改为 1.0.3。
当您安装具有上述设置的 MSI 时,MSI 将检查是否有任何其他产品安装了相同的升级代码,如果找到产品,它将检查新安装的版本是否更高。如果满足所有条件,它将首先删除现有(旧)版本并安装新版本。
【讨论】: