This is an automated email from the ASF dual-hosted git repository. FreeAndNil pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/logging-log4net.git
commit 9a64f95270ff1d0ff84bc02e2e3d757ae5076d44 Merge: d6fdd180 98742f23 Author: Jan Friedrich <[email protected]> AuthorDate: Wed Aug 5 08:51:08 2026 +0200 dotnet 10 build cleanup (#305) ## Why The sources already use C# 14 (the `field` keyword in `SmtpAppender`'s property accessors), which requires the .NET 10 SDK. Nothing in the repo declared that: the test projects targeted `net8.0`, CI installed .NET 8 and the Dockerfile fetched the 8.0 channel, so a clean checkout could not compile - it failed with `CS0501: 'SmtpAppender.To.get' must declare a body`. This PR makes the required toolchain explicit and cleans up the surrounding build, which turned up several unrelated defects along the way. **The shipped surface is unchanged.** `log4net` still targets `net462;netstandard2.0` and `log4net.Ext.Mail` still targets `netstandard2.0`. Nothing here affects consumers. ## Changes | Commit | What | |---|---| | Target .NET 10 / C# 14 | test and integration-test projects `net8.0` → `net10.0`; CI `dotnet-version: 10` | | Build net4x without Mono | delete `MonoForFramework.targets` and its two imports | | Container image from the .NET 10 SDK image | `ubuntu:20.04` + `dotnet-install.sh` → `mcr.microsoft.com/dotnet/sdk:10.0-noble` | | Stop the release scripts on failed steps | `$PSNativeCommandUseErrorActionPreference` in both scripts, plus a path fix | | Fix the log4net.Ext.Mail package readme | `NU5039` | | Quieten the TelnetAppender test | graceful socket shutdown | | Update BUILDING.md | document what the build actually is | ### Mono is no longer needed to build net4x `MonoForFramework.targets` set `FrameworkPathOverride` to Mono's `4.6.2-api` directory on Unix. That is obsolete: the .NET SDK already adds an implicit `PackageReference` to `Microsoft.NETFramework.ReferenceAssemblies.<tfm>` for net4x targets, and those packages were already in the restore graph. ### net462 tests are now Windows-only VSTest hosts net4x tests through `TestHostNetFramework/testhost.exe`, a .NET Framework executable, so `dotnet test` aborts with `TESTRUNABORT` on Linux and macOS. `log4net.Tests` now conditions its `TargetFrameworks` on `'$(OS)' != 'Windows_NT'`, so no unrunnable test assembly is produced. The `net462` **library** is still built on every platform; only the test target is gated. This also fixes the `ubuntu-22.04` and `macos-14` CI jobs, which ran a bare `dotnet test` against a `net462` target they could not host. ### Run CI on the latest runner images macos-14 and ubuntu-22.04 are superseded by macos-latest (macOS 26) and ubuntu-latest (Ubuntu 24.04). Neither new image ships Mono, so net4x tests cannot run there - which is why log4net.Tests restricts net462 to Windows. ### Release scripts continued after failed steps `$ErrorActionPreference = 'Stop'` does not apply to native commands — they only set `$LASTEXITCODE`. A failing `dotnet`, `git`, `zip`, `gpg` or `mvnw` was therefore ignored, and artifacts were packaged, signed and tagged anyway. Both scripts now set `$PSNativeCommandUseErrorActionPreference` (PowerShell 7.3+). This was not theoretical: `NU5039` made the `log4net.Ext.Mail` pack fail, no `.nupkg` was produced, and `build-preview.ps1` went on to gpg-sign files that did not exist. `build-preview.ps1` also built its artifact paths with backslashes, which are not path separators outside Windows. ### TelnetAppender test noise `SimpleTelnetClient.Dispose()` disposed the `TcpClient` while the reader was blocked in `stream.Read`, so teardown aborted the socket and dumped an `IOException` with a stack trace on every passing run. The cancellation token never actually broke the loop — it was only checked after a successful read. Now the socket is shut down first, the read returns 0, and the loop exits normally. Exceptions arriving after disposal starts are not reported; genuine failures still are. ## Verification On Linux (Ubuntu-based, .NET SDK 10.0.110, self-built Mono present but unused by the build): - `dotnet build ./src/log4net.sln` - succeeds, 0 warnings - `dotnet test ./src/log4net.sln` - **292 total, 0 failed, 281 succeeded**, 11 skipped (Windows-only) - `net462` and `net472` compile with `MonoForFramework.targets` deleted - `log4net.Tests.Signing.AssemblyShouldBeSigned` passes - strong naming survives the reference-assembly switch - `./mvnw site` works - both scripts parse under pwsh 7.6.4; the native-error behaviour was verified directly ## For reviewers to weigh **Nothing tests on the .NET 8 runtime any more.** `netstandard2.0` consumers on .NET 8 (LTS until November 2026) are still supported but no longer exercised. **The MCR image reference is fully qualified**, so it needs no registry configuration and no login. .github/workflows/build.yaml | 4 +- Dockerfile | 33 ++++-------- doc/BUILDING.md | 63 ++++++++++------------ scripts/build-preview.ps1 | 12 ++++- scripts/build-release.ps1 | 4 ++ src/MonoForFramework.targets | 20 ------- .../3.4.0/305-build-net4x-without-mono.xml | 17 ++++++ src/changelog/3.4.0/305-docker-sdk-image.xml | 13 +++++ .../3.4.0/305-fix-ext-mail-package-readme.xml | 12 +++++ src/changelog/3.4.0/305-fix-release-scripts.xml | 15 ++++++ src/changelog/3.4.0/305-target-dotnet-10.xml | 13 +++++ .../log4net-611-main/log4net-611-main.csproj | 2 +- .../log4net-672/log4net-672.csproj | 2 +- .../log4net-673/log4net-673.csproj | 2 +- .../log4net-681/log4net-681.csproj | 2 +- .../log4net.Ext.Mail.Tests.csproj | 2 +- src/log4net.Ext.Mail/log4net.Ext.Mail.csproj | 2 +- .../Appender/Internal/SimpleTelnetClient.cs | 47 +++++++++++----- .../Appender/RollingFileAppenderTest.cs | 10 ---- .../Appender/SmtpPickupDirAppenderTest.cs | 3 -- src/log4net.Tests/Appender/TelnetAppenderTest.cs | 5 -- src/log4net.Tests/Core/LoggingEventTest.cs | 2 - src/log4net.Tests/Utils.cs | 19 ------- src/log4net.Tests/log4net.Tests.csproj | 9 ++-- src/log4net/log4net.csproj | 1 - 25 files changed, 168 insertions(+), 146 deletions(-)
