using System; using Serilog; using Topshelf; namespace ZB.MOM.WW.OtOpcUa.Host { internal static class Program { private static int Main(string[] args) { // Set working directory to exe location so relative log paths resolve correctly // (Windows services default to System32) Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory; Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.File( "logs/lmxopcua-.log", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 31) .CreateLogger(); try { var exitCode = HostFactory.Run(host => { host.UseSerilog(); host.Service(svc => { svc.ConstructUsing(() => new OpcUaService()); svc.WhenStarted(s => s.Start()); svc.WhenStopped(s => s.Stop()); }); host.SetServiceName("OtOpcUa"); host.SetDisplayName("LMX OPC UA Server"); host.SetDescription("OPC UA server exposing System Platform Galaxy tags via MXAccess."); host.RunAsLocalSystem(); host.StartAutomatically(); }); return (int)exitCode; } catch (Exception ex) { Log.Fatal(ex, "Host terminated unexpectedly"); return 1; } finally { Log.CloseAndFlush(); } } } }