目前,我正在转换一个现有的 .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"
这将安装两个服务,名字都是 service1
和 service2
我如何才能在同一个项目下实现.NET Core托管服务包含多个服务的相同功能(无论是否自带发布)?
我知道PowerShell New-Service
命令或老式 sc.exe
命令来安装服务,但这些命令仅用于安装单个服务,并使用 ServiceName
属性。
先谢谢你。
为了帮助其他人试图找到解决这个问题的方法,我回答我自己的问题。
经过大量的研究,我无法找到一种方法,在其中,我可以只使用一个命令来安装多个服务的项目。
以下是我最终选择的方法
我的 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}
由于 Appsettings.json
是作为一个单独的文件发布的,我只是创建了相同的发布文件夹的副本,并改变配置文件,以实现不同的服务注册。
最后,为了安装每一个服务,我使用了下面的命令。
sc.exe create MyServiceName binpath="{FullExePath-WithExeName}" displayname="{MyServiceDisplayName}" start=auto
sc.exe description MyServiceName "MyServiceDescription"
sc.exe start MyServiceName
希望能帮到你。