从.Net的角度来看Windows服务的体系结构

Ser*_*erG 8 .net c# windows service winapi

几个Windows服务可以共享一个进程.在C#中,他们将从以下开始:

ServiceBase.Run(new MyService1(), new MyService2());
Run Code Online (Sandbox Code Playgroud)

run方法的调用阻塞main()执行的线程.同时处理服务事件.那他们在哪里执行?

他们是否在"主要"流程中使用异步过程调用,该过程不仅被阻止,而且处于警报等待状态?如果是这样的话,共享多个服务的过程在性能上有缺陷.处理程序是否在单独的线程中运行?它们是否在包含Run()呼叫的进程之外执行?

ker*_*rem 0

在 Windows 中,多个服务可以使用SERVICE_WIN32_SHARE_PROCESS服务类型共享单个进程。.NET 必须使用此服务类型在 Windows 上的单个进程中注册多个服务。

每个注册的服务都有一个名称和一个由SERVICE_TABLE_ENTRY结构表示的本机入口点地址。SERVICE_TABLE_ENTRY.NET 将为传递给该方法的每个服务构造一个ServiceBase.Run,并StartServiceCtrlDispatcher使用这些信息调用函数。

要接收有关服务状态的通知,入口点(ServiceMainServiceBase类实现)必须调用RegisterServiceCtrlHandlerEx来接收通知。这些通知是使用 APC 发送的。附带说明一下,NotifyServiceStatusChange API 也使用 APC。