【问题标题】:c# windows servicec# windows服务
【发布时间】:2011-04-08 13:19:06
【问题描述】:

我有一个正在运行的 windows 服务。我想从 windows 服务监控一个 c# 控制台应用程序。我的 c# 控制台应用程序在控制台中读取和写入总和、乘法。 我想使用我的 Windows 服务打开并使用我的控制台应用程序。为了正确执行我的 c# 代码,我应该在 OnStart() 方法 中写什么。

我确实从控制台应用程序代码中将 exe 文件 (Process.start()) 放入 Windows 服务,但出现错误:控制台应用程序停止工作。为什么?请帮我:)。 我知道 Windows 服务不适用于 GUI 应用程序。但我只想从我的 Windows 服务打开另一个应用程序(我的 exe 包含我的控制台应用程序)。谢了

有人可以给我一个有效的 eq 吗?:)。谢谢

【问题讨论】:

  • 要打开控制台调试吗?还是只打开一个外部应用程序?
  • 您是否调试了控制台应用程序以确保 那个 正常运行?
  • Windows 服务可能有一些 UI。您需要确保该服务已通过“允许服务与桌面交互”设置。
  • 是的。控制台应用程序正常运行。我已经测试过了。
  • @tomas:不,这是不可能的。该复选框在 Windows XP 中停止工作。那是 10 多年前的事了。

标签: c# windows-services


【解决方案1】:

不仅仅是 GUI 应用程序不能与 Windows 服务一起使用。控制台应用程序也有同样的问题。它们仍然作为用户模式进程运行,Windows 服务无权访问。服务在称为 Session 0 的完全隔离的进程空间中运行。它们无权访问任何用户帐户的桌面,也无法与在这些桌面上运行的应用程序进行交互。

除此之外,控制台应用程序仍会显示用户界面。屏幕上弹出的命令提示符窗口仍然很重要,即使它不是图形的。从 Windows 服务启动,它无处弹出。

这是 Windows Vista 及更高版本的安全功能。 “启用与桌面交互的服务”复选框不再起作用,并且自 Windows XP 以来就不再起作用。你也不应该在那里使用它。隔离保护 Windows 服务免受源自应用程序代码的攻击。

就像我几乎每次看到人们问这样的问题一样,不清楚为什么首先需要使用 Windows 服务。更简单的选择是创建一个不显示任何表单的 Windows 应用程序,并在后台运行它。这会产生非常类似于 Windows 服务的效果,但没有您遇到的限制。因为它仍在当前用户的空间中运行,所以它可以启动和控制其他用户态应用程序。

相关阅读:

【讨论】:

  • 但是在没有人登录的情况下无法运行。
  • 我需要一个 Windows 服务来监控我的应用程序。
  • @Dont:对,没有人登录时应用程序无法运行。Windows 服务无法与登录用户交互。电脑关机后什么都做不了。这个问题无解。
  • 您可以通过让服务和不可见的表单应用程序进行通信来解决前两个问题,例如通过 wcf
【解决方案2】:

您的控制台应用程序是否记录任何错误?也许尝试检查错误日志以查看控制台应用程序问题的可能原因。这个问题可能会引导您找到答案/修复:

Avoid Program Stopped Working in C#

【讨论】:

    【解决方案3】:

    您的问题有一些问题,正如您所提到的,大多数 Windows 服务器阻止服务直接访问 GUI,并且服务作为其自己的用户实例运行,而不是任何登录的用户实例。因此,访问用户运行应用程序即使不是不可能也很困难(就像它看不到您的用户目录一样)

    反之更可行。

    如果您有一个您的控制台应用希望与之交互的服务,它可以宣布它的到来,然后在连接时,该服务可以回复您的控制台应用执行的指令。但是,您需要设计一种结构性的方法来做到这一点。

    【讨论】:

    • @elisa 您可以让服务通过命名管道启动 wcf 服务。
    • 请指导我...:) 一个简短的 eq 和一些解释会有很大帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2020-04-19
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多