如何在 .NET Core 托管服务中的同一项目下安装多个服务

How to install multiple services under same project in .NET Core Hosted Services

目前我正在将现有的 .NET Framework Windows service 转换为 .NET Core 3+ Worker 服务。

在现有的windows服务项目中,同一个项目中注册了多个服务。含义服务已添加到列表中,并且 运行 使用如下服务基础

ServicesList sc = new List<ServiceBase>();
sc.Add(new Worker1());
sc.Add(new Worker2());
ServiceBase.Run(sc.ToArray());

为了安装这些服务,我们利用 .NET Framework 文件夹中的 installutil,如下所示。

installutil.exe "<ProjectPackagePath>.exe"

这将同时安装名称为 service1service2

的服务

我如何为包含同一项目下的多个服务的 .NET Core 托管服务实现相同的功能(是否独立发布)?

我知道 PowerShell New-Service 命令或老式的 sc.exe 命令可以安装服务,但这些仅用于安装具有 ServiceName 属性的单个服务。

提前致谢。

为了帮助其他人尝试找到解决此问题的方法,我正在回答我自己的问题。

经过大量研究,我找不到一种方法,我可以只使用一个命令在一个项目中安装多个服务

下面是我最终采用的方法


1。 发布

我的 AppSettings.json 包含定义 - 是否应注册服务的配置。基于此配置,然后在 Program.cs -> ConfigureServices 方法中有条件地注册服务。

我还希望我的服务是独立的,并且是单个文件发布。此外,要根据配置安装不同的服务,我必须从单个文件 exe 中排除 AppSettings.json。为此,我在 .csproj 中添加了 ExcludeFromSingleFile 配置,如下所示

<Content Update="appsettings.json">
   <CopyToPublishDirectory>Always</CopyToPublishDirectory>
   <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
</Content>

为了发布我使用了下面的命令

dotnet publish -r win-x64 -c Release --self-contained=true /p:PublishSingleFile=true /p:DebugType=None -o ${PublishPath}

2。安装

由于 Appsettings.json 是作为单独的文件发布的,我只是创建了同一发布文件夹的副本并更改了配置文件以启用不同服务的注册。

最后为了安装它们,我使用了以下命令。

sc.exe create MyServiceName binpath="{FullExePath-WithExeName}" displayname="{MyServiceDisplayName}" start=auto
sc.exe description MyServiceName "MyServiceDescription"
sc.exe start MyServiceName

希望这对您有所帮助。