前言
服务程序,一般是指一些需要长期稳定运行,没有界面交互的程序,今天就来看一看怎么用C#在 netcore 平台来编写这类程序。
环境
以下是编写服务程序使用的工具和环境
- VisualStduio 2019
- .netcore 3.1
开始
1. 使用Woker Service 模板创建服务
启动VisualStudio 2019,选择创建新项目,在上方的搜索栏搜索service ,如下图。

或者使用 dotnet new worker 命令
这里我创建一个名为MyService的项目
1 | dotnet new worker -n MyService |
浏览一下项目文件,可以看见里面有两个主要的文件
1 | public static void Main(string[] args) |
1 | public class Worker : BackgroundService |
这两个文件中的代码都是简洁明了的。Program.cs 创建Host并对Worker进行托管。
那么我们先看一下Worker是什么?
  从Worker.cs中可见Worker只是继承自BackgroundService的子类。BackgroundService又是何方神圣呢?
 看一下MyService的项目依赖,依赖包里有Microsoft.Extensions.Hosting这一项,BackgroundService 就是源自于此。
2. 编写属于自己的Worker
新建 MyWorker.cs 文件,内容如下
1 | class MyWorker : BackgroundService |
除此之外,还需要将Worker 注入。services.AddHostedService<MyWorker>();
注释掉 services.AddHostedService<Worker>();,而只关注MyWorker
运行之后,就可以看到内容输出了。但是,为什么还会有控制台窗口,而不是一个无界面的服务呢?
嗯mm,因为现在它还是一个控制台程序。
那么,如和部署成服务呢?
3. 部署Windows 服务
首先,要做一些改动
为
MyService项目添加nuget包Microsoft.Extensions.Hosting.WindowsServices修改
Program.cs中的CreateHostBuilder函数,在最后加上UseWindowsService()
如下
1 | static IHostBuilder CreateHostBuilder(string[] args) |
接着
这里需要使用另一个工具 sc
打开cmd窗口(使用Powershell 也可以,但是低版本的Powershell 可能会出错)
1 | sc create MyService binpath=E:\full\path\to\yourbinaryfile.exe |
程序在控制台输出,所以安装成服务并不能看到效果。不过,总而言之,使用.netcore创建服务程序很是简单。你可能会想用这种方式用在.netframework上是不是也可以。可以自己尝试。
更新
2020年7月13日 补充
在.netframework 上使用也是没问题的,但是.netcore 可以跨平台食用
 更多创建服务的方式,可以点击下面的引用链接
引用
Creating Windows Services In .NET Core – Part 3 – The “.NET Core Worker” Way