如何创建最佳的.NET Windows服务安装程序?

4
我刚刚创建了一个简单的.NET Windows服务。我的用户应该从我的网站下载它并在他们的计算机上安装。因此,从各种论坛帖子(包括此站点)中,我知道为了做到这一点,我需要一个安装程序。或者我可以只给他们服务文件并指导他们如何安装。我开始创建设置项目,并能够编译自己的.msi安装程序。但是有一个用户抱怨他现在无法卸载它。我进行了研究,发现.msi格式存在一些问题,主要与GAC中引用计数方式有关。不过帮助他修复他的计算机非常容易。通过与用户的交谈,我知道训练他们使用sc.exe或installutil.exe几乎是不可能的。我还发现了一个服务http://installer.codeeffects.com,可以为我的服务构建安装程序而不需要任何代码,但我不确定我的安装程序应该是msi还是exe。所以,很明显我完全困惑了 :) 请大家帮帮忙,任何一般或详细的建议都将不胜感激。

WiX - RailRhoad
5个回答

6

让您的服务接受参数以将其注册为服务:

MyService.exe /i

在您的服务中,您需要检查是否存在该参数,如果存在,则让服务进行注册:
ManagedInstallerClass.InstallHelper(args);

请查看我的答案这个问题以获取更多细节。通过命令行,您可以让用户简单地自行注册服务。

如果对于您的用户来说仍然太复杂,您可以使用Environment.UserInteractive来检查用户是否双击了服务。如果是,则安装/卸载服务。如果不是,则启动服务(这将是在服务应用程序和机器启动时启动服务的路线)。


2
为什么不使用VS内置的安装程序?我用了好几年了。
问题(也是你可能认为它无法工作的原因)在于,对于Windows服务,您必须添加一些自定义操作以使服务注册。
看一下这个,并转到“向设置项目添加自定义操作”部分:

http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx


尽管在当时是一个很好的答案,但截至撰写本文时,“Setup Project”模板已在VS2012中被删除,并在VS2013中仍然缺失。 - user585968

0

我的建议是使用MSI将文件安装到所需的位置,包括执行installutil.exe的批处理文件。然后进行后安装步骤,执行批处理文件。

卸载时,采用相同的方法 - 执行批处理文件作为预卸载步骤,然后进行卸载。我以前也做过类似的事情。我知道这很痛苦。


0

-1

我认为您可能希望将服务与应用程序解耦。让服务调用一个可执行文件来实现实际的应用程序逻辑,这样您就可以维护可执行文件并多次重新安装它,而不必卸载/重新安装应用程序的服务部分。

这是来自一个厌倦处理微软安装程序的人的建议。您可能会从经验丰富的安装程序专家那里得到更好的答案。我不确定,我在等待它。我有一个类似的问题,这可能是我的解决方案 相关问题


这受到“先有鸡还是先有蛋”的困境的困扰。为了拥有一个“永不需要更新的服务”,仍然必须至少安装一次,而这通常需要安装程序 - user585968
@Micky,当您在生产环境上拥有一个无法安装或卸载的服务时(就像我遇到的情况),希望可执行文件一开始就被分离出来。如果您有时间投入到学习服务安装程序过程中的所有问题中,那么这可能会很好。当然,需要对此和所有建议持谨慎态度。 - Arturo Hernandez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接