注释
本文不适用于 .NET 中的托管服务。 有关使用 Microsoft.Extensions.Hosting.BackgroundService 和工作服务模板的 Windows 服务的最新内容,请参阅:
- .NET 中的工作服务
使用 创建 Windows 服务
Microsoft Windows 服务(以前称为 NT 服务)使你能够创建在其自己的 Windows 会话中运行的长时间运行的可执行应用程序。 当计算机启动时,可以自动启动这些服务,可以暂停和重启,并且不显示任何用户界面。 这些功能使服务非常适合在服务器上使用,或者每当需要长时间运行的功能时,这些功能不会干扰处理同一台计算机的其他用户。 还可以在与登录用户或默认计算机帐户不同的特定用户帐户的安全上下文中运行服务。 有关服务和 Windows 会话的详细信息,请参阅 Windows SDK 文档。
可以通过创建作为服务安装的应用程序轻松创建服务。 例如,假设你想要监视性能计数器数据并响应阈值。 可以编写一个 Windows 服务应用程序,该应用程序侦听性能计数器数据、部署应用程序并开始收集和分析数据。
将服务创建为Microsoft Visual Studio 项目,定义其中的代码,用于控制哪些命令可以发送到服务,以及在收到这些命令时应采取哪些作。 可以发送到服务的命令包括启动、暂停、恢复和停止服务;还可以执行自定义命令。
创建并生成应用程序后,可以通过运行命令行实用工具 InstallUtil.exe 并将路径传递给服务的可执行文件来安装该应用程序。 然后,可以使用 服务控制管理器 启动、停止、暂停、恢复和配置服务。 还可以在服务器资源管理器中的“服务”节点中或使用ServiceController类完成其中许多相同的任务。
服务应用程序与其他 Visual Studio 应用程序
服务应用程序在多种方式上与许多其他项目类型不同:
服务应用程序项目创建的已编译可执行文件必须安装在服务器上,然后项目才能以有意义的方式运行。 无法通过按 F5 或 F11 调试或运行服务应用程序;无法立即运行服务或单步执行其代码。 相反,必须安装和启动服务,然后将调试器附加到服务的进程。 有关详细信息,请参阅 如何:调试 Windows 服务应用程序。
与某些类型的项目不同,必须为服务应用程序创建安装组件。 安装组件在服务器上安装和注册服务,并使用 Windows 服务控制管理器为服务创建一个条目。 有关详细信息,请参阅 如何将安装程序添加到您的服务应用程序。
您的服务应用程序中的
Main
方法必须为项目中包含的服务执行“运行”命令。 该方法Run
将服务加载到相应服务器上的 服务控制管理器 中。 如果使用 Windows 服务 项目模板,则会自动编写此方法。 请注意,加载服务与启动服务不同。 有关详细信息,请参阅下面的“服务生存期”。Windows 服务应用程序在与登录用户的交互式工作站不同的窗口工作站中运行。 窗口工作站是一个安全对象,其中包含剪贴板、一组全局原子和一组桌面对象。 由于 Windows 服务的工作站不是交互式工作站,因此不会看到从 Windows 服务应用程序中引发的对话框,并可能导致程序停止响应。 同样,应在 Windows 事件日志中记录错误消息,而不是在用户界面中引发。
.NET Framework 支持的 Windows 服务类不支持与交互式工作站(即登录用户)交互。 .NET Framework 还不包括表示工作站和桌面的类。 如果 Windows 服务必须与其他工作站交互,则需要访问非托管 Windows API。 有关详细信息,请参阅 Windows SDK 文档。
Windows 服务与用户或其他终端的交互必须经过精心设计,以包括例如没有用户登录或用户拥有意外的桌面对象集合等情形。 在某些情况下,编写在用户控制下运行的 Windows 应用程序可能更合适。
Windows 服务应用程序在其自己的安全上下文中运行,并在用户登录到安装它们的 Windows 计算机之前启动。 应仔细规划要在其中运行服务的用户帐户;在系统帐户下运行的服务具有比用户帐户更多的权限和权限。
服务生存期
服务在其生存期内经历多个内部状态。 首先,该服务将安装到将运行它的系统上。 此过程执行服务项目的安装程序,并将服务加载到该计算机的 服务控制管理器 中。 服务控制管理器是 Windows 提供的用于管理服务的中心实用工具。
加载服务后,必须启动该服务。 启动服务可以使其开始运行。 可以通过调用方法,从服务控制管理器、Start或代码启动服务。 Start 方法将处理传递给应用程序的 OnStart 方法,并执行您在那里定义的任何代码。
一个正在运行的服务可以无限期地存在于此状态中,直到它停止或暂停或计算机关闭为止。 服务可以存在于以下三种基本状态之一:Running或PausedStopped。 该服务还可以报告挂起命令的状态:ContinuePending、PausePending、StartPending或StopPending。 这些状态表示已发出命令,例如用于暂停正在运行的服务的命令,但尚未执行。 可以查询 Status 以确定服务处于什么状态,或者在出现这些状态时,使用 WaitForStatus 执行相应的操作。
可以从 服务控制管理器、 服务器资源管理器或通过调用代码中的方法暂停、停止或恢复服务。 其中每个作都可以调用服务(OnStop或OnPauseOnContinue)中的关联过程,在该过程中可以定义在服务更改状态时要执行的附加处理。
服务类型
可以使用 .NET Framework 在 Visual Studio 中创建两种类型的服务。 为进程中唯一服务的服务分配类型 Win32OwnProcess。 将与另一个服务共享进程的服务指定为类型 Win32ShareProcess。 可以通过查询 ServiceType 属性来检索服务类型。
如果查询 Visual Studio 中未创建的现有服务,则偶尔可能会看到其他服务类型。 有关这些内容的详细信息,请参阅 ServiceType。
服务和 ServiceController 组件
该 ServiceController 组件用于连接到已安装的服务并操作其状态;使用 ServiceController 组件可以启动和停止服务,暂停和继续服务的运行,并向服务发送自定义命令。 但是,创建服务应用程序时不需要使用 ServiceController 组件。 事实上,在大多数情况下,你的 ServiceController 组件应存在于一个独立于定义服务的 Windows 服务应用程序之外的应用程序中。
有关详细信息,请参阅 ServiceController。
要求
必须在 Windows 服务 应用程序项目或其他启用了 .NET Framework 的项目中创建服务,以便在生成和继承类 ServiceBase 时创建 .exe 文件。
包含 Windows 服务的项目必须具有项目及其服务的安装程序组件。 可以从 “属性” 窗口轻松完成此作。 有关详细信息,请参阅 如何将安装程序添加到您的服务应用程序。