From c8f986587f849c2bdd448c74159b1b245e2de07b Mon Sep 17 00:00:00 2001 From: John Campion Jr <1094820+JohnCampionJr@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:33:12 -0400 Subject: [PATCH 01/11] Adopt .NET 10 with multitargeting Multi-target net8.0;net10.0 for the tool and tests, bump the SDK and CI to .NET 10, and run the tests on both runtimes. AnalysisLevel tracks the TFM now; fixed the findings it surfaced (CA1515 -> internal types with InternalsVisibleTo for Moq, CA1872 -> Convert.ToHexString). --- .changeset/adopt-dotnet-10.md | 5 +++++ .github/workflows/ci.yml | 4 +++- .github/workflows/codeql.yml | 2 +- Directory.Build.props | 9 ++++----- global.json | 2 +- .../Commands/Add/IProjectFileNamesLocator.cs | 2 +- .../Commands/Publish/Services/DotnetService.cs | 2 +- .../Commands/Publish/Services/GitService.cs | 2 +- .../Commands/Publish/Services/IDotnetService.cs | 2 +- .../Commands/Publish/Services/IGitService.cs | 2 +- src/SolarWinds.Changesets/Shared/BumpType.cs | 2 +- src/SolarWinds.Changesets/Shared/ChangesetConfig.cs | 2 +- src/SolarWinds.Changesets/Shared/ChangesetFile.cs | 2 +- src/SolarWinds.Changesets/Shared/Constants.cs | 2 +- .../Shared/IChangesetsRepository.cs | 2 +- .../Shared/IConfigurationService.cs | 2 +- src/SolarWinds.Changesets/Shared/IProcessExecutor.cs | 2 +- .../Shared/InitializationException.cs | 2 +- src/SolarWinds.Changesets/Shared/ProcessExecutor.cs | 2 +- src/SolarWinds.Changesets/Shared/ProcessOutput.cs | 2 +- src/SolarWinds.Changesets/Shared/ResultCodes.cs | 2 +- src/SolarWinds.Changesets/SolarWinds.Changesets.csproj | 2 ++ .../SolarWinds.Changesets.Tests.csproj | 1 + .../Version/CsProjectsRepositoryTests.cs | 2 +- 24 files changed, 34 insertions(+), 25 deletions(-) create mode 100644 .changeset/adopt-dotnet-10.md diff --git a/.changeset/adopt-dotnet-10.md b/.changeset/adopt-dotnet-10.md new file mode 100644 index 0000000..cc7186c --- /dev/null +++ b/.changeset/adopt-dotnet-10.md @@ -0,0 +1,5 @@ +--- +"SolarWinds.Changesets": Minor +--- + +Adopt .NET 10 with multi-targeting. The tool and tests now target net8.0 and net10.0, the SDK and CI use .NET 10, and the test suite runs against both runtimes. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f724d3f..f3d9486 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,9 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.406 + dotnet-version: | + 8.0.x + 10.0.x - name: Restore dependencies run: dotnet restore --packages ./packages diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 9b059ba..f38fd12 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -33,7 +33,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.406 + dotnet-version: 10.0.x - name: Initialize CodeQL uses: github/codeql-action/init@v3 diff --git a/Directory.Build.props b/Directory.Build.props index 3cea168..10c2aa3 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,9 +3,8 @@ - net8.0 - - 12.0 + 12.0 + 14.0 @@ -25,8 +24,8 @@ true false true - - 8 + 8 + 10 all true diff --git a/global.json b/global.json index 952b4c4..34cc7a1 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.406", + "version": "10.0.300", "rollForward": "latestFeature" } } diff --git a/src/SolarWinds.Changesets/Commands/Add/IProjectFileNamesLocator.cs b/src/SolarWinds.Changesets/Commands/Add/IProjectFileNamesLocator.cs index 05140d3..3462df8 100644 --- a/src/SolarWinds.Changesets/Commands/Add/IProjectFileNamesLocator.cs +++ b/src/SolarWinds.Changesets/Commands/Add/IProjectFileNamesLocator.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Commands.Add; /// /// Defines a contract for locating project file names within a specified directory. /// -public interface IProjectFileNamesLocator +internal interface IProjectFileNamesLocator { /// /// Retrieves project file names located in the specified directory. diff --git a/src/SolarWinds.Changesets/Commands/Publish/Services/DotnetService.cs b/src/SolarWinds.Changesets/Commands/Publish/Services/DotnetService.cs index 3a318e2..b81fab8 100644 --- a/src/SolarWinds.Changesets/Commands/Publish/Services/DotnetService.cs +++ b/src/SolarWinds.Changesets/Commands/Publish/Services/DotnetService.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Commands.Publish.Services; /// -public sealed class DotnetService : IDotnetService +internal sealed class DotnetService : IDotnetService { private readonly IProcessExecutor _processExecutor; diff --git a/src/SolarWinds.Changesets/Commands/Publish/Services/GitService.cs b/src/SolarWinds.Changesets/Commands/Publish/Services/GitService.cs index afb837e..7030e70 100644 --- a/src/SolarWinds.Changesets/Commands/Publish/Services/GitService.cs +++ b/src/SolarWinds.Changesets/Commands/Publish/Services/GitService.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Commands.Publish.Services; /// -public sealed class GitService : IGitService +internal sealed class GitService : IGitService { private readonly IProcessExecutor _processExecutor; diff --git a/src/SolarWinds.Changesets/Commands/Publish/Services/IDotnetService.cs b/src/SolarWinds.Changesets/Commands/Publish/Services/IDotnetService.cs index 4d5e495..c7bda24 100644 --- a/src/SolarWinds.Changesets/Commands/Publish/Services/IDotnetService.cs +++ b/src/SolarWinds.Changesets/Commands/Publish/Services/IDotnetService.cs @@ -5,7 +5,7 @@ namespace SolarWinds.Changesets.Commands.Publish.Services; /// /// Provides functionality to interact with the .NET CLI for operations such as packing and publishing NuGet packages. /// -public interface IDotnetService +internal interface IDotnetService { /// /// Packs a .NET project into a NuGet package. diff --git a/src/SolarWinds.Changesets/Commands/Publish/Services/IGitService.cs b/src/SolarWinds.Changesets/Commands/Publish/Services/IGitService.cs index 1b3e79a..9527b00 100644 --- a/src/SolarWinds.Changesets/Commands/Publish/Services/IGitService.cs +++ b/src/SolarWinds.Changesets/Commands/Publish/Services/IGitService.cs @@ -5,7 +5,7 @@ namespace SolarWinds.Changesets.Commands.Publish.Services; /// /// Provides Git-related services, such as retrieving file differences. /// -public interface IGitService +internal interface IGitService { /// /// Retrieves a list of file names that have changed in the specified source path. diff --git a/src/SolarWinds.Changesets/Shared/BumpType.cs b/src/SolarWinds.Changesets/Shared/BumpType.cs index 92d795e..73fa3fd 100644 --- a/src/SolarWinds.Changesets/Shared/BumpType.cs +++ b/src/SolarWinds.Changesets/Shared/BumpType.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Shared; /// /// Specifies the type of version bump to apply. /// -public enum BumpType +internal enum BumpType { /// /// No version bump. diff --git a/src/SolarWinds.Changesets/Shared/ChangesetConfig.cs b/src/SolarWinds.Changesets/Shared/ChangesetConfig.cs index 944bb8f..f23e72d 100644 --- a/src/SolarWinds.Changesets/Shared/ChangesetConfig.cs +++ b/src/SolarWinds.Changesets/Shared/ChangesetConfig.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Shared; /// /// Changeset config. /// -public sealed class ChangesetConfig +internal sealed class ChangesetConfig { /// /// Specify the relative path from the changeset command's execution folder to the location of the projects. diff --git a/src/SolarWinds.Changesets/Shared/ChangesetFile.cs b/src/SolarWinds.Changesets/Shared/ChangesetFile.cs index ad45086..1236d07 100644 --- a/src/SolarWinds.Changesets/Shared/ChangesetFile.cs +++ b/src/SolarWinds.Changesets/Shared/ChangesetFile.cs @@ -6,4 +6,4 @@ namespace SolarWinds.Changesets.Shared; /// Changed module names. /// Bump type. /// Description. -public sealed record ChangesetFile(ICollection ChangedModuleNames, BumpType BumpType, string Description); +internal sealed record ChangesetFile(ICollection ChangedModuleNames, BumpType BumpType, string Description); diff --git a/src/SolarWinds.Changesets/Shared/Constants.cs b/src/SolarWinds.Changesets/Shared/Constants.cs index ff78376..0b6c48d 100644 --- a/src/SolarWinds.Changesets/Shared/Constants.cs +++ b/src/SolarWinds.Changesets/Shared/Constants.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Shared; /// /// Provides application-wide constant values of file names and file path. /// -public static class Constants +internal static class Constants { /// /// The file name of the changelog file. diff --git a/src/SolarWinds.Changesets/Shared/IChangesetsRepository.cs b/src/SolarWinds.Changesets/Shared/IChangesetsRepository.cs index f2f4d69..a50e49b 100644 --- a/src/SolarWinds.Changesets/Shared/IChangesetsRepository.cs +++ b/src/SolarWinds.Changesets/Shared/IChangesetsRepository.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Shared; /// /// Defines methods for accessing and managing changesets. /// -public interface IChangesetsRepository +internal interface IChangesetsRepository { /// /// Creates changeset file in the changeset working directory. diff --git a/src/SolarWinds.Changesets/Shared/IConfigurationService.cs b/src/SolarWinds.Changesets/Shared/IConfigurationService.cs index 9d627d4..9708e11 100644 --- a/src/SolarWinds.Changesets/Shared/IConfigurationService.cs +++ b/src/SolarWinds.Changesets/Shared/IConfigurationService.cs @@ -7,7 +7,7 @@ namespace SolarWinds.Changesets.Shared; /// This service allows creating a default configuration file and retrieving an existing configuration file. /// It uses JSON serialization and deserialization to handle the configuration data. /// -public interface IConfigurationService +internal interface IConfigurationService { /// diff --git a/src/SolarWinds.Changesets/Shared/IProcessExecutor.cs b/src/SolarWinds.Changesets/Shared/IProcessExecutor.cs index caf8188..e23aab4 100644 --- a/src/SolarWinds.Changesets/Shared/IProcessExecutor.cs +++ b/src/SolarWinds.Changesets/Shared/IProcessExecutor.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Shared; /// /// Executes external processes and captures their output and exit code. /// -public interface IProcessExecutor +internal interface IProcessExecutor { /// /// Executes a process with the specified executable, arguments, and working directory. diff --git a/src/SolarWinds.Changesets/Shared/InitializationException.cs b/src/SolarWinds.Changesets/Shared/InitializationException.cs index c6270fd..3048300 100644 --- a/src/SolarWinds.Changesets/Shared/InitializationException.cs +++ b/src/SolarWinds.Changesets/Shared/InitializationException.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Shared; /// /// Represents errors that occur during the initialization phase. /// -public sealed class InitializationException : Exception +internal sealed class InitializationException : Exception { /// /// Initializes a new instance of the class diff --git a/src/SolarWinds.Changesets/Shared/ProcessExecutor.cs b/src/SolarWinds.Changesets/Shared/ProcessExecutor.cs index bd1ed31..86b68cb 100644 --- a/src/SolarWinds.Changesets/Shared/ProcessExecutor.cs +++ b/src/SolarWinds.Changesets/Shared/ProcessExecutor.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Shared; /// -public class ProcessExecutor : IProcessExecutor +internal class ProcessExecutor : IProcessExecutor { /// public async Task Execute(string executable, string arguments, string workingDirectoryPath) diff --git a/src/SolarWinds.Changesets/Shared/ProcessOutput.cs b/src/SolarWinds.Changesets/Shared/ProcessOutput.cs index 70b3242..bf3bb03 100644 --- a/src/SolarWinds.Changesets/Shared/ProcessOutput.cs +++ b/src/SolarWinds.Changesets/Shared/ProcessOutput.cs @@ -5,4 +5,4 @@ namespace SolarWinds.Changesets.Shared; /// /// The list of output lines from the process. /// The exit code of the process. -public record ProcessOutput(ICollection Output, int ExitCode); +internal record ProcessOutput(ICollection Output, int ExitCode); diff --git a/src/SolarWinds.Changesets/Shared/ResultCodes.cs b/src/SolarWinds.Changesets/Shared/ResultCodes.cs index 7608d5d..92b50a7 100644 --- a/src/SolarWinds.Changesets/Shared/ResultCodes.cs +++ b/src/SolarWinds.Changesets/Shared/ResultCodes.cs @@ -3,7 +3,7 @@ namespace SolarWinds.Changesets.Shared; /// /// Defines command result codes with documentation. /// -public static class ResultCodes +internal static class ResultCodes { #region Success Codes diff --git a/src/SolarWinds.Changesets/SolarWinds.Changesets.csproj b/src/SolarWinds.Changesets/SolarWinds.Changesets.csproj index 1a47387..351aaeb 100644 --- a/src/SolarWinds.Changesets/SolarWinds.Changesets.csproj +++ b/src/SolarWinds.Changesets/SolarWinds.Changesets.csproj @@ -2,6 +2,7 @@ + net8.0;net10.0 SolarWinds.Changesets .NET Changesets changeset @@ -41,6 +42,7 @@ + diff --git a/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj b/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj index 87d24dc..bf6b94f 100644 --- a/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj +++ b/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj @@ -1,6 +1,7 @@  + net8.0;net10.0 false true diff --git a/tests/SolarWinds.Changesets.Tests/Version/CsProjectsRepositoryTests.cs b/tests/SolarWinds.Changesets.Tests/Version/CsProjectsRepositoryTests.cs index 54eb16a..36486c7 100644 --- a/tests/SolarWinds.Changesets.Tests/Version/CsProjectsRepositoryTests.cs +++ b/tests/SolarWinds.Changesets.Tests/Version/CsProjectsRepositoryTests.cs @@ -125,6 +125,6 @@ private static string ComputeFileHash(string path) using FileStream stream = File.OpenRead(path); byte[] hashBytes = sha256.ComputeHash(stream); - return BitConverter.ToString(hashBytes).Replace("-", "", StringComparison.Ordinal).ToUpperInvariant(); + return Convert.ToHexString(hashBytes); } } From 747d22779c1452ae312bc3cb82814e178e5777c7 Mon Sep 17 00:00:00 2001 From: John Campion Jr <1094820+JohnCampionJr@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:33:12 -0400 Subject: [PATCH 02/11] Support macOS in ProcessExecutorTests --- tests/SolarWinds.Changesets.Tests/ProcessExecutorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/SolarWinds.Changesets.Tests/ProcessExecutorTests.cs b/tests/SolarWinds.Changesets.Tests/ProcessExecutorTests.cs index 8dc65fe..280e6ab 100644 --- a/tests/SolarWinds.Changesets.Tests/ProcessExecutorTests.cs +++ b/tests/SolarWinds.Changesets.Tests/ProcessExecutorTests.cs @@ -21,7 +21,7 @@ public void SetUp() _executable = "cmd"; _argumentsTemplate = '/'; } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { _executable = "/bin/bash"; _argumentsTemplate = '-'; From bf308ad06abb50ef607f372c65deb471b144ade7 Mon Sep 17 00:00:00 2001 From: John Campion Jr <1094820+JohnCampionJr@users.noreply.github.com> Date: Mon, 8 Jun 2026 15:38:14 -0400 Subject: [PATCH 03/11] Relax global.json SDK to a band-agnostic floor Use 10.0.100 with rollForward latestFeature so any installed .NET 10 feature band satisfies it, instead of requiring 10.0.300 or higher. --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index 34cc7a1..512142d 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "10.0.300", + "version": "10.0.100", "rollForward": "latestFeature" } } From 365bccdbda69e37cd747dcaf7fcf7f9777de52aa Mon Sep 17 00:00:00 2001 From: Jan Vilimek Date: Thu, 9 Jul 2026 15:45:04 +0200 Subject: [PATCH 04/11] Simplified lang and analysis version for both .net versions only one lang and analysis should be supported (we will develop in .net 10, yet compile for .net 8-10) --- Directory.Build.props | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 10c2aa3..ae0f994 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,8 +3,8 @@ + 14.0 12.0 - 14.0 @@ -24,8 +24,7 @@ true false true - 8 - 10 + 10 all true From 0a92f9dd7a492ab2a87bd2e8d7ef8da40369d9cb Mon Sep 17 00:00:00 2001 From: Jan Vilimek Date: Thu, 9 Jul 2026 15:45:39 +0200 Subject: [PATCH 05/11] Update target frameworks to include net9.0 --- .../SolarWinds.Changesets.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj b/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj index bf6b94f..b19f568 100644 --- a/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj +++ b/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj @@ -1,7 +1,7 @@  - net8.0;net10.0 + net8.0;net9.0;net10.0 false true From a036d0ffe5b0f69c455d2ecce55190843ecea9c8 Mon Sep 17 00:00:00 2001 From: Jan Vilimek Date: Thu, 9 Jul 2026 15:46:03 +0200 Subject: [PATCH 06/11] Remove LangVersion condition for net8.0 --- Directory.Build.props | 1 - 1 file changed, 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index ae0f994..0b80681 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,7 +4,6 @@ 14.0 - 12.0 From 269dd9d45f19981e8b85a68c68c2a8893f003f09 Mon Sep 17 00:00:00 2001 From: Jan Vilimek Date: Thu, 9 Jul 2026 15:47:23 +0200 Subject: [PATCH 07/11] Add target frameworks net8.0, net9.0, and net10.0 to directory.build.props --- Directory.Build.props | 1 + 1 file changed, 1 insertion(+) diff --git a/Directory.Build.props b/Directory.Build.props index 0b80681..66bc774 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,6 +3,7 @@ + net8.0;net9.0;net10.0 14.0 From 88cbdca1a75b3a9f55dcbea0518766808977b297 Mon Sep 17 00:00:00 2001 From: Jan Vilimek Date: Thu, 9 Jul 2026 15:48:07 +0200 Subject: [PATCH 08/11] Deleted target frameworks in project file as it was moved to directory.build.props Removed net10.0 from the target frameworks. --- .../SolarWinds.Changesets.Tests.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj b/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj index b19f568..87d24dc 100644 --- a/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj +++ b/tests/SolarWinds.Changesets.Tests/SolarWinds.Changesets.Tests.csproj @@ -1,7 +1,6 @@  - net8.0;net9.0;net10.0 false true From f0bb4dba88122850610570eef8702a2c3541b8ce Mon Sep 17 00:00:00 2001 From: Jan Vilimek Date: Thu, 9 Jul 2026 15:48:58 +0200 Subject: [PATCH 09/11] Deleted target frameworks in project file as it was moved to directory.build.props --- src/SolarWinds.Changesets/SolarWinds.Changesets.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SolarWinds.Changesets/SolarWinds.Changesets.csproj b/src/SolarWinds.Changesets/SolarWinds.Changesets.csproj index 351aaeb..64cb23d 100644 --- a/src/SolarWinds.Changesets/SolarWinds.Changesets.csproj +++ b/src/SolarWinds.Changesets/SolarWinds.Changesets.csproj @@ -2,7 +2,6 @@ - net8.0;net10.0 SolarWinds.Changesets .NET Changesets changeset From 654346d8365dc800f65bc51fb02b97b210781846 Mon Sep 17 00:00:00 2001 From: Jan Vilimek Date: Thu, 9 Jul 2026 15:58:15 +0200 Subject: [PATCH 10/11] Update .NET version to 10.0.x in CI workflow for building all .net 8-10 we just need the .net 10 sdk --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f3d9486..860222e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,9 +19,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: | - 8.0.x - 10.0.x + dotnet-version: 10.0.x - name: Restore dependencies run: dotnet restore --packages ./packages From 544bf54393ed0ff6f565752ae4d41a090f5d8cce Mon Sep 17 00:00:00 2001 From: Jan Vilimek Date: Fri, 10 Jul 2026 09:38:33 +0200 Subject: [PATCH 11/11] Update adopt-dotnet-10.md --- .changeset/adopt-dotnet-10.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/adopt-dotnet-10.md b/.changeset/adopt-dotnet-10.md index cc7186c..d72e657 100644 --- a/.changeset/adopt-dotnet-10.md +++ b/.changeset/adopt-dotnet-10.md @@ -2,4 +2,4 @@ "SolarWinds.Changesets": Minor --- -Adopt .NET 10 with multi-targeting. The tool and tests now target net8.0 and net10.0, the SDK and CI use .NET 10, and the test suite runs against both runtimes. +Adopt .NET 10 with multi-targeting. The tool and tests now target `net8.0`, `net9.0` and `net10.0`, the SDK and CI use .NET 10.