Fix service deployment: set working directory for correct log paths and use MasterNodeManager for Objects→ZB reference

Windows services default to System32 as working directory, causing logs to land in the wrong location. Set Environment.CurrentDirectory to AppDomain.CurrentDomain.BaseDirectory before Serilog init. Also fix ZB root folder not appearing under Objects folder — BuildAddressSpace runs after CreateAddressSpace completes so the externalReferences dict is already consumed; use Server.NodeManager.AddReferences instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Joseph Doherty
2026-03-25 10:57:18 -04:00
parent 09ed15bdda
commit 4351854754
2 changed files with 13 additions and 4 deletions

View File

@@ -85,12 +85,17 @@ namespace ZB.MOM.WW.LmxOpcUa.Host.OpcUa
rootFolder.NodeId = new NodeId("ZB", NamespaceIndex);
rootFolder.AddReference(ReferenceTypeIds.Organizes, true, ObjectIds.ObjectsFolder);
// Add reverse reference from Objects folder to our root
var extRefs = _externalReferences ?? new Dictionary<NodeId, IList<IReference>>();
AddExternalReference(ObjectIds.ObjectsFolder, ReferenceTypeIds.Organizes, false, rootFolder.NodeId, extRefs);
AddPredefinedNode(SystemContext, rootFolder);
// Add reverse reference from Objects folder → ZB root.
// BuildAddressSpace runs after CreateAddressSpace completes, so the
// externalReferences dict has already been consumed by the core node manager.
// Use MasterNodeManager.AddReferences to route the reference correctly.
Server.NodeManager.AddReferences(ObjectIds.ObjectsFolder, new List<IReference>
{
new NodeStateReference(ReferenceTypeIds.Organizes, false, rootFolder.NodeId)
});
// Create nodes for each object in hierarchy
var nodeMap = new Dictionary<int, NodeState>();