2014-09-28 222 views
0

我在C#中开发了一个windows服务。我的项目有安装程序和安装项目。
安装项目,安装服务非常好,它没有任何问题,但是当我更改项目并创建其他设置时,新安装程序不会安装新服务,因为它已经存在! 是否可以通过任何方式创建安装程序,然后将其卸载并安装它?如何创建安装Windows服务以卸载然后安装服务?

回答

-1

您可以通过正确配置MSI属性来实现。点击安装程序项目并按F4查看MSI的属性窗口。

  1. 当你进入属性,你可以看到两个类型是Upgrade codeProduct Code属性。每当您创建/发布新的Windows服务安装程序时,请务必保持相同的升级代码,但更改产品代码。

  2. 更改DetectNewerInstalledVersions财产至true

  3. RemovePreviousVersions设置为true

  4. 现在将version号码更改为先前版本的更高版本(如果您以前的发行版本是1.0.2,请将新版本更改为1.0.3)。

当您安装MSI与上述设置,微星会检查是否有相同的升级代码安装任何其他产品,如果它发现一个产品,那么它会检查新安装具有更高版本。如果所有条件都满足,它将首先删除现有的(较早的)版本并安装较新的版本。

+0

但安装有错误: 指定的服务已存在。 我想要这个安装卸载服务并安装相同名称的服务的新版本 – nabegheh95 2014-09-28 12:48:39

+0

您将需要添加一个安装程序类到您的项目,在安装方法内停止现有的服务。 – Kurubaran 2014-09-28 13:12:43

1

问题是升级VS2008设置和后来使用安装程序类和安装顺序是1)安装较旧的产品,较旧的产品,使用文件版本检查,运行安装自定义操作2)删除旧产品运行卸载自定义行动和摆脱不再使用的文件。 VS 2005不是这样的。因此,当服务已经存在时,安装该服务的安装程序类自定义操作正在运行。有时你可以恢复到VS 2005的升级机制,首先删除所有旧的安装文件,包括数据库等,所以请记住。您可以通过使用Orca,InstallExecuteSequence表修改MSI文件并在InstallValidate之后立即重新排序RemoveExistingProducts操作来完成此操作。否则,做这两个:

  1. 务必安装服务二进制到一个固定的位置(也就是说,不能阅览Program Files文件夹)。该服务的卸载自定义操作应具有NOT UPGRADINGPRODUCTCODE的条件,以便升级不会尝试卸载它(但是会直接卸载)。它需要位于固定位置,因为此升级解决方案不会安装或卸载服务 - 它只会更新二进制文件 - 但显然您不希望服务条目引用已更改位置的服务。

  2. 在升级中,对服务的安装自定义操作的条件为NOT PREVIOUSVERSIONSINSTALLED。这意味着它不会尝试重新安装服务(这就是为什么你会得到“已存在”错误),但是如果你增加了它的文件版本,它会更新exe文件。

如果你搜索的MSDN论坛设置为http://social.msdn.microsoft.com/Forums/en-US/home?forum=winformssetup许多PREVIOUSVERSIONSINSTALLED的职位都与这个问题做的,有更多的讨论和解释。

编辑:安装程序类不是必需的,因为Windows安装程序可以为你做所有这些,这就是为什么这只是VS安装项目的问题。转移到使用MSI的ServiceInstall和ServiceControl表的工具将使您无需任何代码来安装/卸载/停止/启动服务。

+0

是否可以纯粹使用Windows Installer(而不是Wix)来更新Windows服务? – Kurubaran 2015-01-26 18:04:42

+0

我不知道是什么意思。 WiX和VS 2008安装程序都生成MSI文件,并且都可以构建Windows Installer升级。问题是VS 2008提供的用于安装服务的安装程序类在VS升级的唯一类型升级过程中很难处理 - 使用RemovePreviousVersions进行的主要升级 – PhilDW 2015-01-27 00:57:55