diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Host/Program.cs b/src/Server/ZB.MOM.WW.OtOpcUa.Host/Program.cs index 06af6df..d627f2d 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Host/Program.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Host/Program.cs @@ -33,6 +33,12 @@ var builder = WebApplication.CreateBuilder(args); // regardless of ASPNETCORE_ENVIRONMENT. builder.WebHost.UseStaticWebAssets(); +// Windows Service support: when the EXE is started by Service Control Manager (sc.exe), +// the host needs to call SetServiceStatus to keep the SCM happy. UseWindowsService() +// installs the WindowsServiceLifetime IFF WindowsServiceHelpers.IsWindowsService() is +// true at runtime — so it's safely a no-op when running as a console app or on Linux. +builder.Host.UseWindowsService(options => options.ServiceName = "OtOpcUaHost"); + // Per-role appsettings overlay: appsettings.{role}.json (single role) or appsettings.admin-driver.json // (both). Optional — base appsettings.json carries enough to boot if these don't exist. var roleSuffix = roles.Length == 0 ? null : string.Join('-', roles.OrderBy(r => r, StringComparer.Ordinal)); diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Host/ZB.MOM.WW.OtOpcUa.Host.csproj b/src/Server/ZB.MOM.WW.OtOpcUa.Host/ZB.MOM.WW.OtOpcUa.Host.csproj index 3b7e33b..bee4115 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Host/ZB.MOM.WW.OtOpcUa.Host.csproj +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Host/ZB.MOM.WW.OtOpcUa.Host.csproj @@ -16,7 +16,11 @@ - + + all runtime; build; native; contentfiles; analyzers; buildtransitive