我有.net核心控制台应用程序,该应用程序托管为Windows服务。
如果用户注销/关闭计算机,我想捕获一个事件。
我已经找到了在.net框架(here和here)中捕获此事件的方法。
但是我不知道如何在.net核心中实现这一目标。
要创建服务,我正在使用“ ServiceBase”类。示例代码如下:
public class MyService : ServiceBase
{
readonly string LogPath = "D:\\TestAppService.txt";
#region Constructors
public MyService()
{
this.CanShutdown = true;
}
#endregion
#region Protected Functions
protected override void OnStart(string[] args)
{
//your code here
// call the base class so it has a chance
// to perform any work it needs to
base.OnStart(args);
}
protected override void OnStop()
{
//your code here
// Call the base class
base.OnStop();
}
protected override void OnShutdown()
{
using (StreamWriter sw = File.AppendText(LogPath))
{
sw.WriteLine("shutdown == true");
}
//your code here
base.OnShutdown();
}
#endregion
}
正在调用OnStop和OnStart方法。
但是,当我关闭计算机时,不会调用OnShutdown方法。
答案 0 :(得分:0)
根据aspisof.net,您应该可以使用SessionEnding API。这是因为它被列为windows Compatibility Pack中公开的-在NuGet here上可用。
docs.microsoft.com上的This article显示了如何将其包含在.NET Core应用程序中。
tl; dr
需要注意的一件事:最初是为了将Windows特定的.NET代码移植到.NET Core上的临时修复程序。
更受认可的仅实现Windows功能的方法是将尽可能多的代码移至.NET Standard libraries,并在为该平台构建代码时使用conditional compilation directives包括平台特定的代码。
答案 1 :(得分:0)
通过设计,dotnet核心与平台特定的内容不“友好” (就像在我看来听注销事件一样。)
here描述了我在Windows托管服务之一中使用的解决方案。
当操作系统在关闭时被迫关闭应用程序域时-有使用AppDomain事件处理程序的空间。