Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
64fa3fd
Support framework for the OPC UA Conformance Test (CTT) NUnit parity …
Copilot May 14, 2026
3d672db
UaLens: Avalonia desktop client for OPC UA
marcschier May 14, 2026
c9f8273
Merge branch 'master' into pisrapp
marcschier May 15, 2026
8617df1
Merge branch 'master' into cttunit-support
marcschier May 15, 2026
9cefaaa
Address review feedback (@romanett)
Copilot May 17, 2026
ab37139
Merge remote-tracking branch 'origin/master' into cttunit-support
Copilot May 17, 2026
a704997
UaLens: FileSystem plug-in + canonical OPC Foundation MIT headers
marcschier May 17, 2026
8ffd5eb
Move FileSystem to Opc.Ua.Server with provider abstraction + integrat…
Copilot May 17, 2026
bf44bed
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier May 17, 2026
d85aa16
Merge master into cttunit-support: resolve nullable conflicts
Copilot May 17, 2026
b032591
Re-apply nullable annotations on FileSystem + RoleBasedUserManagement
Copilot May 17, 2026
49736d3
UaLens: GDS sample parity, phases 1-2 (shared scaffolding + Discovery…
marcschier May 17, 2026
9ce7875
Split out FileSystem + LDS into a separate PR
Copilot May 17, 2026
ad41fd9
UaLens: Samples parity Phase A.1+A.6 - Find Node by path + Locale picker
marcschier May 17, 2026
654a679
UaLens: Samples + GDS phase 5 + dotnet-tool packaging - fleet batch
marcschier May 17, 2026
73c6e5d
UaLens: GDS phases 3 + 4 - issue+deliver + trust-list pull/push bridge
marcschier May 17, 2026
412c0ea
Merge branch 'master' into pisrapp
marcschier May 18, 2026
057aad6
Merge master into cttunit-support: FileSystem + LDS landed via #3776
Copilot May 18, 2026
83d07cc
UaLens: Phase B + P3 + P4 + C2 + E1 - fleet batch
marcschier May 18, 2026
5ca5355
UaLens: Path C feature drop + UI polish (8 fleet sub-agents)
marcschier May 18, 2026
006c9b4
UaLens: resizable Monitored items flyout + per-column drag-resize
marcschier May 18, 2026
8e63cec
UaLens: Subscription tab UX polish - label, chart toggles, node icons
marcschier May 18, 2026
2a5f032
UaLens: distinct node icons + wrapping plug-in toolbars
marcschier May 18, 2026
f7a7b38
UaLens: fix CertificateStoreDialog cross-thread FindControl crash
marcschier May 18, 2026
a21be99
UaLens: Connect dialog + Session menu restructure
marcschier May 18, 2026
59f3bec
UaLens: certificate manager UX polish + tree root label + cert handle…
marcschier May 18, 2026
02cba5f
UaLens: keyboard shortcuts for all add-tab plug-in menu entries
marcschier May 18, 2026
15aa08a
UaLens: switch Subscription shortcut to Ctrl+Shift+S; refresh cheat s…
marcschier May 18, 2026
91b995a
UaLens: plug-in toolbar alignment + menu icon alignment + collapsed d…
marcschier May 18, 2026
072651e
UaLens FileSystem columns resizable; ConsoleReferenceServer enables F…
marcschier May 18, 2026
c9373aa
Merge branch 'master' into pisrapp
marcschier May 18, 2026
b2e6b17
UaLens FileSystem: fix Flatten finding nothing + Filter->Settings rename
marcschier May 19, 2026
8a5e9b4
UaLens Historian: move update bar into modal dialog + Insert/Edit con…
marcschier May 19, 2026
3457f7a
UaLens EventView: dialog where-clause editor + resizable columns app-…
marcschier May 19, 2026
fe43af6
UaLens Performance: workload editor moved to Settings dialog + wrap t…
marcschier May 19, 2026
90104aa
UaLens: code-editor-style letter tiles for address-space tree icons
marcschier May 19, 2026
84fb538
UaLens: Historian dialog stacking + context menu gating + chart full-…
marcschier May 19, 2026
c8795a1
UaLens BrowserViewModel: expose type hierarchies under the Types branch
marcschier May 19, 2026
ab36e23
UaLens EventView: Trigger event button + auto-fire after Add Source
marcschier May 20, 2026
fcd8d32
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier May 20, 2026
9e172c8
UaLens: add Connect... button to the disconnected-tab placeholder
marcschier May 20, 2026
0c1d714
Merge master into cttunit-support: Part 17 + Part 18 landed upstream
Copilot May 20, 2026
31f7cfb
perf: benchmark DataValue class vs readonly struct (additive, no migr…
marcschier May 20, 2026
1080de8
UaLens: Connect... button must remain interactive while disconnected
marcschier May 20, 2026
c7f7813
UaLens EventView: Trigger replaces hardcoded NodeId with GeneratesEve…
marcschier May 20, 2026
d4b41a5
UaLens EventView: AddSource awaits subscription + uses flat picker
marcschier May 20, 2026
fe68270
Add SerializableDataValue + DataValueSurrogateProvider (PR-2 step 1/N)
marcschier May 20, 2026
a1443f1
Add With<Property>() mutators to DataValue (PR-2 step 2/N)
marcschier May 20, 2026
fa749a6
Switch decoders to With<Property>() chains (PR-2 step 3/N)
marcschier May 20, 2026
d02e19b
UaLens EventView: revert flat-picker swap + add source up-front
marcschier May 20, 2026
9c24b3f
Migrate Server aggregate / monitored-item mutations to With chains (P…
marcschier May 20, 2026
3c75929
Migrate CustomNodeManager / AsyncCustomNodeManager mutations to With …
marcschier May 20, 2026
b4c66b4
UaLens EventView: subscription / monitored-item state indicator
marcschier May 20, 2026
17bf539
Migrate PubSub mutations to With chains (PR-2 step 6/N)
marcschier May 20, 2026
6a28c2b
Migrate Quickstarts / sample apps mutations to With chains (PR-2 step…
marcschier May 20, 2026
d5e0140
Migrate test mutations to With chains (PR-2 step 8/N)
marcschier May 20, 2026
960b789
Drop duplicate Quickstarts AliasNameNodeManager / AliasNameWildcardMa…
Copilot May 20, 2026
ba01dd9
Fix forgotten hunk: remove dead Quickstarts AliasNameNodeManager regi…
Copilot May 20, 2026
b73a56e
UaLens: uniform toolbar height + center alignment across plug-ins
marcschier May 20, 2026
39b3c0b
Break ReadAttribute(Async) signatures: ref DataValue (sync) + ValueTa…
marcschier May 20, 2026
caaaf3f
UaLens: cross-thread fix for ObservableProperty setters after UI awaits
marcschier May 20, 2026
0ea5f9d
UaLens: standardize dialog outer margin to 16 (top = bottom)
marcschier May 20, 2026
2ae196e
UaLens: light and dark theme support via View menu
marcschier May 20, 2026
cf8e642
Remove [DataContract]/[DataMember] and public setters from DataValue
marcschier May 20, 2026
08c4f0b
Fix DurableMonitoredItem tests broken by DataValue value equality
marcschier May 20, 2026
6e2a4ab
Server FileSystem: set MethodDeclarationId so method calls resolve
marcschier May 21, 2026
591dab8
UaLens: post-review polish - sticky source-creation failure + minor c…
marcschier May 21, 2026
eaf85aa
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier May 21, 2026
7f24719
Split historian work out of cttunit-support (-> historianwork branch)
Copilot May 21, 2026
8cc833b
Add Role and User Management SDK + UaLens plugins (Part 18)
marcschier May 21, 2026
020d29b
UaLens: surface Role + User Management in the Tabs->Add+ menu
marcschier May 21, 2026
17e13ba
UaLens: drive Tabs->Add menu + cheat sheet + shortcuts from PluginReg…
marcschier May 21, 2026
9e3a006
PR-4.a: Flip DataValue from class to readonly struct + non-nullable e…
marcschier May 21, 2026
f50f78a
WIP PR-4.b/c: Remove Nullable<DataValue> from server APIs (encoders d…
marcschier May 21, 2026
1078524
PR-4.c: Complete server-side Nullable<DataValue> removal + TryGet pat…
marcschier May 21, 2026
cfff3ae
PR-4.d: PublishedValuesWrites uses TryReadPublishedDataItem
marcschier May 21, 2026
bcf069c
PR-4.d: PubSub data store API - TryReadPublishedDataItem + non-nullab…
marcschier May 21, 2026
5afd657
PR-4.e: Migrate PubSub tests + aggregate calculator tests + history A…
marcschier May 21, 2026
a6d5a33
PR-4.g: Final test assertion + client cast cleanup - full solution bu…
marcschier May 21, 2026
d00f4b3
PR-4.h: Simplify DataValue static helpers + fix test semantics
marcschier May 21, 2026
21e1b0a
PR-5: Cleanup - delete DataValueStruct sibling, transitional shims, _…
marcschier May 21, 2026
cc65d6d
Merge branch 'master' into dvstruct
marcschier May 22, 2026
6c526d9
Fix CI failures: encoder semantics for default DataValue + source gen…
marcschier May 22, 2026
4824809
UaLens: SubscriptionBench plug-in for subscription scale testing
marcschier May 22, 2026
c1b71ff
UaLens: hide tab body while disconnected so Connect... placeholder is…
marcschier May 22, 2026
35f46cd
UaLens: address-space context menu -> Subscription Bench
marcschier May 22, 2026
4bd7b82
UaLens: notify every plug-in of connect/disconnect transitions
marcschier May 22, 2026
fb8e2d5
UaLens: show legend on Subscription Bench chart
marcschier May 22, 2026
51ac596
PR review: DataValue.Null, IsGood/IsBad properties, cosmetic fixes
marcschier May 22, 2026
284c464
Obsolete static extension
marcschier May 22, 2026
c1392c8
PR review: reorder DataValue members; move readonly-struct comment to…
marcschier May 22, 2026
2355309
UaLens: two-axis scale-out for Subscription Bench
marcschier May 22, 2026
3bcaf4a
PR review: introduce IsNull sentinel on DataValue (default vs explici…
marcschier May 22, 2026
a0a9d44
UaLens: subscription + monitored-item settings on the bench
marcschier May 22, 2026
9066ed4
PR review: pass DataValue as 'in' parameter; remove redundant DataVal…
marcschier May 22, 2026
ec0b130
PR review: add DataValue migration section to the migration guide
marcschier May 22, 2026
f566f4d
Merge branch 'master' into dvstruct
marcschier May 22, 2026
5ae354f
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier May 22, 2026
79afcc2
fix: update pooling tests and benchmarks for DataValue readonly struct
marcschier May 22, 2026
6e772ec
Fix PooledNotificationDispatchTests for readonly struct DataValue
marcschier May 22, 2026
ccd85d7
Merge remote-tracking branch 'origin/dvstruct' into dvstruct
marcschier May 22, 2026
16bc6af
UaLens: initialize bench IsConnected at ctor time
marcschier May 22, 2026
70f7429
UaLens: switch Subscription Bench to V2 SubscriptionManager API
marcschier May 22, 2026
6ebb001
PR review: encoder/decoder construction efficiency + ValueChanged 'in…
marcschier May 22, 2026
c03818c
Import Opc.Ua.Conformance.Tests from cttunit (pre-split snapshot)
marcschier May 22, 2026
c9ceaeb
Pure git mv: move conformance into area projects + extract TestFramew…
marcschier May 22, 2026
b802b37
Restructure tests: content edits, server fixes, new projects, workflo…
marcschier May 22, 2026
d45d7e2
Merge remote-tracking branch 'origin/master' into dvstruct
marcschier May 23, 2026
bfa4b2d
Merge pull request #3798 from OPCFoundation/restructure-tests
marcschier May 23, 2026
314b3eb
Merge branch 'master' into cttunit-support
marcschier May 23, 2026
5571c38
Merge pull request #3796 from OPCFoundation/dvstruct
marcschier May 23, 2026
26d24d7
Merge remote-tracking branch 'origin/master' into cttunit-support
Copilot May 23, 2026
72ccf1e
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier May 23, 2026
a7ef472
UaLens: adapt to DataValue becoming a readonly struct (#3796)
marcschier May 23, 2026
a12222b
Fix MasterNodeManager.ReadAsync timestamp filtering after DataValue s…
marcschier May 23, 2026
066cf80
Relax FastKeepAliveCallbackAsync timing threshold (CI flake)
marcschier May 23, 2026
310c65c
Skip cert validation tests on Azure linux runner channel exhaustion
marcschier May 23, 2026
b466cf6
Skip ConnectToSecurePolicyAsync on transient channel errors
marcschier May 23, 2026
d7a99d8
Merge pull request #3767 from OPCFoundation/cttunit-support
marcschier May 24, 2026
20419e6
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier May 24, 2026
0b9741e
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier May 26, 2026
6d155ae
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier May 27, 2026
a4012e5
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier May 28, 2026
83171b1
Merge branch 'master' into pisrapp
marcschier May 28, 2026
4dd4577
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier Jun 1, 2026
f7da6dc
Merge branch 'pisrapp' of https://github.com/marcschier/UA-.NETStanda…
marcschier Jun 1, 2026
61980d6
Merge remote-tracking branch 'origin/master' into pisrapp
marcschier Jun 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .azurepipelines/preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ jobs:
dir /b /s Stack\Opc.Ua*.dll > .\list.txt
dir /b /s Tools\Opc.Ua*.dll >> .\list.txt
dir /b /s Libraries\Opc.Ua*.dll >> .\list.txt
dir /b /s Applications\McpServer\bin\Opc.Ua*.dll >> .\list.txt
dir /b /s Applications\Opc.Ua.Mcp\bin\Opc.Ua*.dll >> .\list.txt
dir /b /s .azurepipelines\*.* >> .\list.txt
type .\list.txt
- task: CmdLine@2
Expand Down
2 changes: 1 addition & 1 deletion .azurepipelines/signlistDebug.txt
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,4 @@ Libraries\Opc.Ua.WotCon.Server\bin\Debug\net48\Opc.Ua.WotCon.Server.dll
Libraries\Opc.Ua.WotCon.Server\bin\Debug\net8.0\Opc.Ua.WotCon.Server.dll
Libraries\Opc.Ua.WotCon.Server\bin\Debug\net9.0\Opc.Ua.WotCon.Server.dll
Libraries\Opc.Ua.WotCon.Server\bin\Debug\net10.0\Opc.Ua.WotCon.Server.dll
Applications\McpServer\bin\Debug\net10.0\Opc.Ua.Mcp.dll
Applications\Opc.Ua.Mcp\bin\Debug\net10.0\Opc.Ua.Mcp.dll
2 changes: 1 addition & 1 deletion .azurepipelines/signlistRelease.txt
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,4 @@ Libraries\Opc.Ua.WotCon.Server\bin\Release\net48\Opc.Ua.WotCon.Server.dll
Libraries\Opc.Ua.WotCon.Server\bin\Release\net8.0\Opc.Ua.WotCon.Server.dll
Libraries\Opc.Ua.WotCon.Server\bin\Release\net9.0\Opc.Ua.WotCon.Server.dll
Libraries\Opc.Ua.WotCon.Server\bin\Release\net10.0\Opc.Ua.WotCon.Server.dll
Applications\McpServer\bin\Release\net10.0\Opc.Ua.Mcp.dll
Applications\Opc.Ua.Mcp\bin\Release\net10.0\Opc.Ua.Mcp.dll
2 changes: 1 addition & 1 deletion .github/agents/opcua-interop-tester.agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ You are an expert OPC UA interoperability test engineer. Your role is to systema

## MCP Tools — Primary Test Method

This repository includes an **OPC UA MCP Server** (`Applications/McpServer`) that exposes all OPC UA Part 4 services as MCP tools. **Always prefer using the MCP tools over writing custom C# test code** — they are faster, require no compilation, and cover all standard services.
This repository includes an **OPC UA MCP Server** (`Applications/Opc.Ua.Mcp`) that exposes all OPC UA Part 4 services as MCP tools. **Always prefer using the MCP tools over writing custom C# test code** — they are faster, require no compilation, and cover all standard services.

### When to Use MCP Tools
- **Always** for initial connection, browsing, reading, writing, method calling, subscription testing
Expand Down
11 changes: 10 additions & 1 deletion Applications/ConsoleReferenceServer/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,16 @@ public static Task<int> Main(string[] args)
var sw = Stopwatch.StartNew();

// create the UA server
var server = new UAServer<ReferenceServer>(telemetry, t => new ReferenceServer(t))
var server = new UAServer<ReferenceServer>(
telemetry,
// The console reference server is the canonical
// host that exposes the full address space — turn
// FileSystem (Part 20) on by default so clients
// can browse Server.FileSystem without extra
// configuration. Unit-test fixtures construct
// ReferenceServer directly and keep the property
// at its default false.
t => new ReferenceServer(t) { EnableFileSystemNodeManager = true })
{
AutoAccept = autoAccept,
Password = password
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,19 +263,24 @@
<MaxQueryContinuationPoints>10</MaxQueryContinuationPoints>
<MaxHistoryContinuationPoints>100</MaxHistoryContinuationPoints>
<MaxRequestAge>600000</MaxRequestAge>
<MinPublishingInterval>50</MinPublishingInterval>
<MinPublishingInterval>1</MinPublishingInterval>
<MaxPublishingInterval>3600000</MaxPublishingInterval>
<PublishingResolution>50</PublishingResolution>
<PublishingResolution>1</PublishingResolution>
<MaxSubscriptionLifetime>3600000</MaxSubscriptionLifetime>
<MaxMessageQueueSize>100</MaxMessageQueueSize>
<MaxNotificationQueueSize>100</MaxNotificationQueueSize>
<MaxNotificationsPerPublish>1000</MaxNotificationsPerPublish>
<MinMetadataSamplingInterval>1000</MinMetadataSamplingInterval>
<AvailableSamplingRates>
<SamplingRateGroup>
<Start>5</Start>
<Increment>5</Increment>
<Count>20</Count>
<Start>1</Start>
<Increment>1</Increment>
<Count>10</Count>
</SamplingRateGroup>
<SamplingRateGroup>
<Start>10</Start>
<Increment>10</Increment>
<Count>9</Count>
</SamplingRateGroup>
<SamplingRateGroup>
<Start>100</Start>
Expand Down
140 changes: 140 additions & 0 deletions Applications/Opc.Ua.Lens/AdapterRaceProbe.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
/* ========================================================================
* Copyright (c) 2005-2025 The OPC Foundation, Inc. All rights reserved.
*
* OPC Foundation MIT License 1.00
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* The complete license agreement can be found here:
* http://opcfoundation.org/License/MIT/1.00/
* ======================================================================*/

using System;
using System.Diagnostics;
using System.Diagnostics.Metrics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Opc.Ua;
using UaLens.Connection;
using UaLens.Subscriptions;

namespace UaLens;

/// <summary>
/// Adapter-lifecycle race stress test: spawns many tasks that create +
/// forget adapters concurrently with a disconnect. Asserts that
/// <see cref="ConnectionService.ForgetAdapter"/>'s new bool return value
/// correctly differentiates "you own disposal" vs "Disconnect already
/// owned it" so no zombies leak through either path.
/// </summary>
internal static class AdapterRaceProbe
{
public static async Task<int> RunAsync(string endpointUrl, CancellationToken ct = default)
{
var telemetry = new ConsoleTelemetry();
Console.WriteLine("== AdapterRace probe ==");
Console.WriteLine($" endpoint: {endpointUrl}");

var conn = new ConnectionService(telemetry);
await using (conn.ConfigureAwait(false))
{
await conn.ConnectAsync(new ConnectionOptions
{
EndpointUrl = endpointUrl,
Engine = SubscriptionEngineKind.ChannelV2
}, ct).ConfigureAwait(false);

const int N = 24;
var adapters = new ISubscriptionAdapter[N];
for (int i = 0; i < N; i++)
{
adapters[i] = conn.CreateAdapter();
}

// Pre-disconnect: each adapter should be forget-able exactly once.
int forgottenCount = 0;
for (int i = 0; i < N / 2; i++)
{
if (conn.ForgetAdapter(adapters[i]))
{
forgottenCount++;
await adapters[i].DisposeAsync().ConfigureAwait(false);
}
}
if (forgottenCount != N / 2)
{
Console.WriteLine($"FAIL: expected {N / 2} ForgetAdapter=true, got {forgottenCount}");
return 1;
}

// Disconnect — should dispose the remaining N/2 adapters that are
// still tracked; ForgetAdapter for any of those AFTER disconnect
// must return false (already disposed).
Task disconnectTask = conn.DisconnectAsync();

// Race: try ForgetAdapter on the not-yet-forgotten adapters
// concurrently with the disconnect. Outcome must be EITHER:
// - ForgetAdapter returns true → caller disposes (no double dispose).
// - ForgetAdapter returns false → DisconnectInternalAsync is/was disposing.
int doubleDisposalAttempts = 0;
var forgotAfter = new bool[N];
Parallel.For(N / 2, N, i =>
{
forgotAfter[i] = conn.ForgetAdapter(adapters[i]);
if (forgotAfter[i])
{
try
{
adapters[i].DisposeAsync().AsTask().Wait();
}
catch (Exception)
{
Interlocked.Increment(ref doubleDisposalAttempts);
}
}
});

await disconnectTask.ConfigureAwait(false);

Console.WriteLine($" forgot pre-disconnect : {forgottenCount}");
Console.WriteLine($" forgot during disconn : {forgotAfter.Skip(N / 2).Count(b => b)}");
Console.WriteLine($" double-dispose excepts: {doubleDisposalAttempts}");

if (doubleDisposalAttempts > 0)
{
Console.WriteLine("FAIL: double-disposal detected.");
return 1;
}
Console.WriteLine("ADAPTER RACE PROBE PASS");
return 0;
}
}

private sealed class ConsoleTelemetry : ITelemetryContext
{
public ILoggerFactory LoggerFactory { get; } = NullLoggerFactory.Instance;
public Meter CreateMeter() => new("UaLens.AdapterRaceProbe");
public ActivitySource ActivitySource { get; } = new("UaLens.AdapterRaceProbe");
}
}
133 changes: 133 additions & 0 deletions Applications/Opc.Ua.Lens/App.axaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
<!-- ========================================================================
Copyright (c) 2005-2025 The OPC Foundation, Inc. All rights reserved.

OPC Foundation MIT License 1.00

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

The complete license agreement can be found here:
http://opcfoundation.org/License/MIT/1.00/
======================================================================== -->
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="UaLens.App"
RequestedThemeVariant="Dark">
<Application.Resources>
<ResourceInclude x:Key="ThemeDictionary" Source="avares://UaLens/Themes/DarkNavy.axaml" />
</Application.Resources>
<Application.Styles>
<FluentTheme />

<!-- Toolbar styles (apply to every WrapPanel / StackPanel / Border whose
Classes attribute carries "toolbar"). Forces a single 28 px height
on every interactive control inside the strip and vertically centres
all content + labels so action bars look tidy across plug-ins. -->
<Style Selector="WrapPanel.toolbar Button">
<Setter Property="Height" Value="28"/>
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="10,0"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style Selector="WrapPanel.toolbar ToggleButton">
<Setter Property="Height" Value="28"/>
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="10,0"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style Selector="WrapPanel.toolbar ComboBox">
<Setter Property="Height" Value="28"/>
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Padding" Value="8,0"/>
</Style>
<Style Selector="WrapPanel.toolbar CheckBox">
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style Selector="WrapPanel.toolbar TextBox">
<Setter Property="Height" Value="28"/>
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style Selector="WrapPanel.toolbar TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style Selector="WrapPanel.toolbar StackPanel">
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>

<!-- Same rules for toolbars where the strip is a horizontal StackPanel. -->
<Style Selector="StackPanel.toolbar Button">
<Setter Property="Height" Value="28"/>
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="10,0"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style Selector="StackPanel.toolbar ToggleButton">
<Setter Property="Height" Value="28"/>
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="10,0"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style Selector="StackPanel.toolbar ComboBox">
<Setter Property="Height" Value="28"/>
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Padding" Value="8,0"/>
</Style>
<Style Selector="StackPanel.toolbar CheckBox">
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style Selector="StackPanel.toolbar TextBox">
<Setter Property="Height" Value="28"/>
<Setter Property="MinHeight" Value="28"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style Selector="StackPanel.toolbar TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</Application.Styles>
</Application>
Loading
Loading