【问题标题】:It is possible to add Windows Service to an Existing project?可以将 Windows 服务添加到现有项目吗?
【发布时间】:2016-07-25 09:54:20
【问题描述】:

我在 C# 中创建了一个 Windows 窗体应用程序,并在其上添加了一个窗口服务。问题是每次我在安装后启动服务时,我总是得到Error 1053 the service did not respond to the start or control request。但是在创建一个新项目并选择 Windows 服务并安装并运行它之后,没有错误并且服务正在正确启动。

那么我是否必须为 Windows 服务创建一个单独的项目,或者我只是缺少一些东西?

我的目标框架是 4.5.2,我计划在我的 Windows 服务中添加 UDP 和 TCP 功能。

【问题讨论】:

  • “所以我必须为 Windows 服务创建一个单独的项目”。 “或者我只是错过了什么?” 是的
  • 我有什么需要配置的吗?你认为缺少什么?这是我第一次在 Windows 服务中工作。我根据找到的教程学习如何创建 Windows 服务。我总是得到关于 Windows 服务的教程,但没有关于 Windows 窗体应用程序的教程。
  • 我不知道。我们将如何重现您的问题?
  • 嗯.... 如果空项目工作正常... 服务开始时间有限。不记得了,30岁? 60年代?更难的算法转移到新线程。

标签: c# wcf visual-studio-2015 windows-services


【解决方案1】:

从 Main() 调用 ServiceBase.Run() 使应用程序成为服务而不是普通应用程序。如果您使用 Windows 服务模板创建了一个项目,但取消了对 ServiceBase.Run() 的调用,则结果将是一个普通的应用程序而不是一个服务。 (可能是一个损坏的应用程序,但仍然是一个应用程序。)

在后台,ServiceBase.Run() 调用 StartServiceCtrlDispatcher(),后者调用内部 ServiceBase.ServiceMainCallback() 函数,该函数调用您的 OnStart() 函数。所以如果你不调用 Run() 就不会调用 OnStart() 并且你的服务不会做任何事情。

StartServiceCtrlDispatcher() 函数还间接负责调用 OnStop() 和所有其他相关方法。基本上,它是服务的核心,没有它什么都不会起作用。另外,当然,如果你不调用它,Windows 最终会注意到控制调度程序还没有启动,假设进程已经挂起,然后杀死它。这就是错误 1053 的含义。

虽然可以将服务和应用程序合并到一个可执行文件中,但让它正常工作并非易事。这也是一种不寻常的方法,不经常使用。除非您有令人信服的理由避免这样做,否则我建议您为您的服务使用单独的项目。

【讨论】:

  • 那么,我需要创建 2 个项目吗?一个用于服务,一个用于 Windows 窗体。当涉及到 windows 服务时,是否真的建议创建一个单独的项目而不是将其添加到现有的 windows 窗体应用程序中?
  • 如果windows服务在一个单独的项目中,并且我有一些我想稍后调用的方法,我可以调用它吗?恐怕如果没有,我有一些函数可以调用我的服务。
  • 您可以将常用功能移至库中。
  • 对我来说越来越难了。好,谢谢!我会尝试这样做,如果完成,我会更新您并将您的答案标记为正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多