【问题标题】:How do I create a tray-only windows service controller using .NET Core?如何使用 .NET Core 创建仅托盘的 Windows 服务控制器?
【发布时间】:2022-02-16 04:18:43
【问题描述】:

我想创建一个 Windows 服务工作者,如本演练中所述:https://docs.microsoft.com/en-us/dotnet/core/extensions/windows-service

我还希望用户看到一个托盘图标来操作服务。为此,我将创建第二个可执行文件,它在用户上下文中运行并与服务通信。

应用应如何与服务通信以执行检查服务状态、重启服务等操作?

显然,这可以使用 .NET Framework 通过在用户运行的应用程序中使用 ServiceController 与服务对话来完成(我猜它曾经是 ServiceBase 而不是 BackgroundService)。

当使用 .NET Core 的较新的 BackgroundService/service worker 模型时,等效的“ServiceController”类是什么? ServiceController 还能用吗?

【问题讨论】:

  • 我在说 Mathis 在下面所说的相同的东西,只是使用了不同的词。除了凭据和环境之外,服务和常规应用程序之间没有区别。通常,服务会在机器启动并使用系统帐户运行且没有环境变量时启动。因此,当服务失败时,是由于这两个项目之一不同。
  • 我的问题不清楚我到底在问什么,我已经编辑过了。我现在也相信 ServiceController 仍然可以使用更新的方式来编写服务,因为它们仍然是 Windows 服务,只是编写方式不同。如果这是真的,我稍后会回答我自己的问题。

标签: c# .net-core windows-services


【解决方案1】:

典型的模式是拥有两个应用程序。你真的不能这样做。由于服务在与登录用户不同的窗口站中运行,因此您不能为这些用户提供系统托盘图标。这是来自微软文档https://docs.microsoft.com/en-us/dotnet/framework/windows-services/introduction-to-windows-service-applications

Windows 服务应用程序在不同的窗口站中运行,而不是 登录用户的交互站。窗口站是一个 包含剪贴板、一组全局原子和一个 一组桌面对象。因为windows服务的站 不是一个互动站,从一个内部提出的对话框 将看不到 Windows 服务应用程序,并且可能会导致您的 程序停止响应。同样,应记录错误消息 在 Windows 事件日志中而不是在用户界面中引发。

.NET Framework 支持的 Windows 服务类不 支持与互动站互动,即登录 用户。 .NET Framework 也不包括代表 工作站和台式机。如果您的 Windows 服务必须与 其他站,您将需要访问非托管 Windows API。为了 更多信息,请参阅 Windows SDK 文档。

Windows 服务与用户或其他站点的交互 必须经过精心设计,以包括诸如没有 已登录的用户,或具有意外桌面集的用户 对象。在某些情况下,写一个 Windows 可能更合适 在用户控制下运行的应用程序。

这里有几个关于如何写入我在互联网和其他帖子上找到的系统托盘的链接。您将需要另一个应用程序来与该服务交互,因为该服务不能直接在 Windows 的系统托盘中有一个图标..

How can I make a .NET Windows Forms application that only runs in the System Tray?

http://msdotnetsupport.blogspot.com/2008/02/cnet-application-windows-system-tray.html

与windows服务的通信方式如下:

【讨论】:

  • 我也见过that answer :) 我的问题是如何创建服务控制器,而不是服务。 “你需要另一个应用程序”部分——我问的是其他应用程序在 .NET Core 中需要什么。
  • 您可以创建一个显示在托盘图标中的 windows 窗体,该窗体与 windows 服务通信。
  • 是的,我知道,我的问题是沟通是如何发生的。在 .NET Framework 中,答案似乎是“使用 ServiceController 类”。带有 BackgroundService 的 .NET Core 中的答案是否相同?
  • 我会更新我的答案。确定更新
猜你喜欢
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多