安装后Windows服务未出现在服务列表中

61

我使用Visual Studio 2008用C#创建了一个Windows服务,基本上按照下面的步骤进行操作:

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

我像文章中所述创建了一个安装程序,并运行它...安装程序将我的服务安装到C:\Program Files\Product etc....,但是它却没有出现在服务列表中。

我还漏掉了什么吗?


没有更多的信息很难猜测。如果您按照文章中描述的步骤进行了操作并安装了服务,它应该是可用的。 - Foxfire
你尝试刷新服务控制台了吗?控制台中的列表不会自动更新。如果在安装服务时已经打开了控制台,请尝试刷新它(或重新启动它)。 - Matt Davis
太晚了,但值得一提:在安装程序中添加“自定义操作”,并确保Installer类是“public”。 - Sarvesh Mishra
9个回答

118
您链接的文章中最重要的部分在这里:

如何将自定义操作添加到安装程序项目

1. 在解决方案资源管理器中,右键单击安装程序项目,指向“查看”,然后选择“自定义操作”。出现“自定义操作编辑器”。

2. 在“自定义操作编辑器”中,右键单击“自定义操作”节点,选择“添加自定义操作”,打开“项目中选择项”对话框。

3. 在列表框中双击应用程序文件夹以打开它,选中“MyNewService(Active)”下的主要输出,并单击“确定”。主要输出添加到所有四个自定义操作节点-安装、提交、回滚和卸载。

4. 构建安装程序项目。

如果您跳过这些步骤,您的安装程序项目将构建并将文件复制到正确的目录;但是,如果不执行上述步骤,您的二进制文件将不会被注册为服务。


我还需要注意的是,这对于早期版本的 Visual Studio(带有内置的 Setup/Deployment 项目模板)有效。新版本的 Visual Studio 有不同的设置/部署项目(一些需要第三方软件)。

我建议您了解 WiX 工具集,并在此处查看 WiX 安装 Windows 服务。


2
有没有办法在安装过程中启动服务?我知道可以将StartType配置为自动,但这只会在重新启动后启动服务。 - Taylor Leese
1
非常感谢@Nate。当我按照你的指示进行时,我想起来上次我也是这样做的。 - m.edmondson
1
非常准确!谢谢,它帮助了我。 - hakuna

8

我被这个问题搞崩了,所以我把解决方法放在这里,以防其他人也遇到同样的问题。

如果你按照指南中的说明操作,但仍然无法安装,请确保你的Installer类是公有的(public),内部的(internal)不行。


哦,谢谢。我觉得这太疯狂了!我变得自大,认为“啊,这只是一个安装程序——为什么要费心让类包装器公开?”结果我没经过思考就把它删除了——问题就出现了。 - Alexandru

6

我遇到过类似的问题,后来发现我从未为ServiceInstaller设置过父级。

双击项目安装程序,在设计器中应该显示一个Service Installer和Process Installer。当你点击其中任何一个并查看属性时,你应该注意到父级属性必须都设置为Project Installer类名。

或者,如果你在代码中实现,一定要确保设置:

serviceInstaller.Parent = this;

并且。
serviceProcessInstaller.Parent = this;

谢谢!这个帮了我很多。 - amaters

3
安装服务时,我强烈建议使用NSSM,它对于我所有的WinService需求都很好用。它可以将任何可执行文件(即使是.bat或.cmd)安装为服务,并保证您的服务始终处于运行状态。
使用这个工具:
  1. 这里下载

  2. 并按照这里的说明操作

然后检查服务列表,应该会显示该服务已经被启动并运行。

0
这是一篇来自CodeProject.com的tgeek001的好教程,对我很有帮助。它包括了几个在上面的帖子中没有看到的东西: 1. 在卸载服务之前停止服务的事件处理程序代码 2. 在自定义操作代码中设置的特定条件和属性,以防止失败(这些修复了我在按照上面接受的答案的说明时遇到的错误1001) 3. 将Win Service属性“删除先前版本”下拉菜单设置为true

http://www.codeproject.com/Tips/575177/Window-Service-Deployment-using-VS

以下是自定义操作设置教程(大小写敏感):
  • 安装时,将条件属性设置为以下内容:“NOT (Installed or PREVIOUSVERSIONSINSTALLED)”
  • 卸载时,将条件属性设置为:“NOT UPGRADINGPRODUCTCODE”
  • 提交时:将“Custom Action Data”字段设置为:/OldProductCode="[PREVIOUSVERSIONSINSTALLED]"
最后,在WinService项目中,请确保将下拉菜单“删除先前版本”设置为true。
谢谢。

0

0

在搜索之前,请记得检查您所命名的服务名称。(右键单击 -> 属性 -> 检查服务名称)


0

3
这个链接已经过时了。 - andrepaulo
这是与微软所有文档链接有关的问题。他们经常删除自己的信息,这会导致链接到他们网站的链接失效。真的很遗憾。 - Ro Yo Mi

0
我发现您的安装程序类必须与服务在同一个项目中。安装程序不能存在于由服务引用的库项目中。

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