Files
lmxopcua/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Galaxy/libs/README.md
T
Joseph Doherty c2abbf45bd fix(driver-galaxy): align package versions + record vendored-DLL provenance
Driver.Galaxy-015, -016, -017, -018 resolution (one logical change set).

Driver.Galaxy-016 (Medium, Perf/Resource):
  Reconciled the csproj PackageReferences with what the vendored
  MxGateway.Client.dll was actually built against, verified by
  reflecting Assembly.GetReferencedAssemblies() on the DLL:
    - Polly 8.5.2  →  Polly.Core 8.6.6
      (most consequential — Polly v7 fluent API vs Polly.Core v8
       resilience-pipeline API are DIFFERENT packages; the DLL was
       built against Polly.Core so the prior Polly reference would
       have failed at runtime with MissingMethodException the first
       time the gateway client's retry pipeline ran)
    - Grpc.Net.Client 2.71.0  →  2.76.0  (matches sibling Server/Worker)
    - Microsoft.Extensions.Logging.Abstractions 10.0.0  →  10.0.7
  Google.Protobuf 3.34.1 and Grpc.Core.Api 2.76.0 already matched —
  left unchanged.

Driver.Galaxy-015 (re-triaged from Medium-Security → Low-Documentation):
  Original framing was a security concern about unknown-provenance
  binaries. User clarified the DLLs are their own code, built from
  their own mxaccessgw project, not third-party. Re-triaged to a
  documentation / audit-trail concern. Fix:
    - Added a Provenance section to libs/README.md recording the
      source-commit SHA (dd7ca1634e2d2b8a866c81f0009bf87ee9427750,
      extracted from the AssemblyInformationalVersion baked into
      both DLLs by the original build) and SHA-256 checksums.
    - Documented the re-verification recipe (sha256sum + ilspycmd
      | grep AssemblyInformationalVersion).
  Recommendations about .gitattributes and CI hash-check deferred —
  the DLLs are frozen until an unwinding path is taken, so adding
  LFS or CI infrastructure now would need removal at unwinding.

Driver.Galaxy-018 (Low, Documentation):
  Most of the recommendation folded into the libs/README.md rewrite
  (pointed at sibling Server/Worker csproj as the live version source
  rather than the deleted MxGateway.Client.csproj; recorded source
  commit + SHA-256). <SpecificVersion>false</SpecificVersion> on the
  <Reference> items intentionally not added — MSBuild's default for
  HintPath references with bare-name Include attributes is already
  SpecificVersion=false, so explicitly setting it would be cosmetic
  without changing behaviour.

Driver.Galaxy-017 (Low, Design) — Deferred:
  Recommendation part (b) (record mxaccessgw source-commit SHA in
  libs/README.md) is satisfied by Driver.Galaxy-015's resolution.
  Parts (a) and (c) — a GetVersion RPC at session-open and a parity
  test against the live gateway's proto descriptor — are substantial
  new RPC + plumbing work not in scope for this code-review sweep.
  The risk surface is bounded because either of the libs/README.md
  unwinding paths closes the vendoring + this concern naturally.
  Re-open if neither path is taken within the next quarter and the
  live gateway evolves its proto under the driver.

Verification:
  - Build clean (Driver.Galaxy.csproj 0 errors, 0 warnings).
  - Driver.Galaxy.Tests: 245/245 pass against the corrected
    package set.
  - Solution-wide build remains clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 17:45:24 -04:00

4.9 KiB

Vendored MxGateway client DLLs

This directory holds binary copies of MxGateway.Client.dll and MxGateway.Contracts.dll from the sibling mxaccessgw repo's last known-good build (May 2026). The DLLs are referenced from the driver's csproj as <Reference HintPath="…" /> items rather than ProjectReference.

Provenance

Both DLLs are built from this team's own mxaccessgw source tree — they are not third-party binaries. The build commit + checksums below are recorded so future readers can verify the artefacts match the expected source without needing to ask the original author.

File Source commit SHA-256
MxGateway.Client.dll dd7ca1634e2d2b8a866c81f0009bf87ee9427750 (mxaccessgw repo, pre-restructure) 3507f770adc8c1b27b2fc4645079c6e4e02d5c65b9545c12d637cd2a080a00bd
MxGateway.Contracts.dll dd7ca1634e2d2b8a866c81f0009bf87ee9427750 (mxaccessgw repo, pre-restructure) 437dc6cb6994c7c4d858c82f69af890732c7ffbfa0463fbd8a63ce7930d251b4

The build commit is the same for both DLLs and is embedded as AssemblyInformationalVersion inside each binary — re-verify by running: ilspycmd <dll> | grep AssemblyInformationalVersion.

To re-verify the checksums (e.g. after a clone):

sha256sum libs/MxGateway.Client.dll libs/MxGateway.Contracts.dll

If either SHA-256 or the embedded source commit no longer matches what's listed above, the artefact has been replaced — verify before trusting.

Why vendored

The sibling mxaccessgw repo restructured: the clients/dotnet/MxGateway.Client project the driver previously referenced via path-based ProjectReference no longer exists, and the proto contracts moved from the MxGateway.Contracts.Proto namespace to ZB.MOM.WW.MxGateway.Contracts.Proto. The driver's source still expects the pre-restructure namespace, so re-pointing at the new contracts would require a global namespace rename across ~19 driver files PLUS reimplementing the MxGatewayClient / MxGatewaySession / GalaxyRepositoryClient types the old client library provided (the sibling repo dropped the client library entirely, keeping only the contracts).

Vendoring the binaries unblocked the build in minutes instead of hours, freezes the gateway contract surface at a known-good version, and preserves the option to migrate properly later without an emergency rewrite.

What's vendored

File Built against
MxGateway.Client.dll net10.0, references MxGateway.Contracts.dll
MxGateway.Contracts.dll net10.0, proto namespace MxGateway.Contracts.Proto[.Galaxy]

The NuGet packages the vendored DLLs reference (verified by reflecting Assembly.GetReferencedAssemblies() against MxGateway.Client.dll) are declared as direct PackageReference in the driver csproj — when the dropped ProjectReference was in place those packages were transitively provided; with binary references the consumer must declare them explicitly:

Package Reason
Google.Protobuf 3.34.1 Proto message types in MxGateway.Contracts.dll
Grpc.Core.Api 2.76.0 Base gRPC client types in MxGateway.Client.dll
Grpc.Net.Client 2.76.0 HTTP/2 transport used by MxGatewayClient
Microsoft.Extensions.Logging.Abstractions 10.0.7 ILogger used by the client
Polly.Core 8.6.6 Retry pipeline used by MxGatewayClient

Versions match the sibling mxaccessgw repo's current Server / Worker projects (ZB.MOM.WW.MxGateway.Server.csproj, ZB.MOM.WW.MxGateway.Worker.csproj) so the runtime versions stay close to what the gateway team uses. The pre-Driver.Galaxy-016 declarations were incorrect — most visibly Polly 8.5.2 was declared where the DLL actually needs Polly.Core (a different package: Polly v7 is the older fluent API; Polly.Core v8 is the modern resilience-pipeline API the gateway client was built against). A Polly reference would have failed at runtime with MissingMethodException the first time a retry pipeline ran.

Decompiled-source archive

The vendored DLLs are byte-for-byte the build output. The full source can be recovered with ilspycmd MxGateway.Client.dll > MxGateway.Client.cs if a code review or audit needs it.

How to unwind

Either path closes the vendored-binary debt:

  1. Sibling repo restores MxGateway.Client.csproj (or publishes a NuGet package). Switch the csproj back to a ProjectReference / PackageReference, delete this directory.
  2. Driver migrates to the new ZB.MOM.WW.MxGateway.Contracts.Proto namespace. Global namespace rename across the ~19 consuming source files, plus re-implementing MxGatewayClient / MxGatewaySession / GalaxyRepositoryClient (≈2,200 LoC of behavioural client code) either inlined into this driver or as a fresh sibling library. Delete this directory.

Either way: when unwinding, also drop the five PackageReference lines added to the csproj alongside the <Reference> items — the new ProjectReference / PackageReference will provide them transitively again.