如何在同一项目下安装多个服务,在.NET Core Hosted Services中。

问题描述 投票:0回答:1

目前,我正在转换一个现有的 .NET Framework Windows service.NET Core 3+ 工服务。

在现有的windows服务项目中,同一个项目里面注册了多个服务。意味着服务被添加到列表中,并使用服务库运行,如下所示。

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

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

installutil.exe "<ProjectPackagePath>.exe"

这将安装两个服务,名字都是 service1service2

我如何才能在同一个项目下实现.NET Core托管服务包含多个服务的相同功能(无论是否自带发布)?

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

先谢谢你。

.net .net-core windows-services service-worker backgroundworker
1个回答
1
投票

为了帮助其他人试图找到解决这个问题的方法,我回答我自己的问题。

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

以下是我最终选择的方法


1. 发布

我的 AppSettings.json 包含定义服务是否应该被注册的配置。根据这个配置,服务将有条件地注册在 Program.cs -> ConfigureServices 方法。

我还希望我的服务是自成一体的,并且是单文件发布。此外,为了根据配置安装不同的服务,我不得不排除了 AppSettings.json 的单文件exe。为此,我添加了 ExcludeFromSingleFile 配置 .csproj 如下

<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

希望能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.