dotnet 10 build cleanup - #305
Merged
Merged
Conversation
FreeAndNil
added a commit
that referenced
this pull request
Aug 4, 2026
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. Correct the reason given in BUILDING.md and the changelog.
FreeAndNil
added a commit
that referenced
this pull request
Aug 4, 2026
- Utils.IsMono and Utils.InconclusiveOnMono are gone, along with all 15 call sites. The net462 tests run only on Windows now and the net10.0 tests run on .NET 10, so the guard could never fire. - SystemInfo.IsMono in the library is deliberately untouched: it detects the runtime executing log4net, which can still be Mono.
FreeAndNil
force-pushed
the
Feature/305-dotnet-10-build-cleanup
branch
from
August 4, 2026 22:20
87bb3d2 to
68b9a4d
Compare
FreeAndNil
added a commit
that referenced
this pull request
Aug 4, 2026
Utils.IsMono and Utils.InconclusiveOnMono are gone, along with all 15 call sites. The net462 tests run only on Windows now and the net10.0 tests run on .NET 10, so the guard could never fire. SystemInfo.IsMono in the library is deliberately untouched: it detects the runtime executing log4net, which can still be Mono.
FreeAndNil
force-pushed
the
Feature/305-dotnet-10-build-cleanup
branch
from
August 4, 2026 22:26
68b9a4d to
6dee635
Compare
The sources use C# 14, so a .NET 10 SDK is now required. Test and integration-test projects move from net8.0 to net10.0; the shipped log4net assembly keeps net462;netstandard2.0.
Remove MonoForFramework.targets and its FrameworkPathOverride handling. The net462/net472 targets compile against the Microsoft.NETFramework.ReferenceAssemblies packages that the .NET SDK already references implicitly, so Mono is only needed to run .NET Framework assemblies - not to build them (and mono is now deprecated by Microsoft).
Replace ubuntu:20.04 + dotnet-install.sh with mcr.microsoft.com/dotnet/sdk:10.0-noble - Ubuntu 24.04 with the SDK preinstalled. Drops the Mono packages, the apt-key/stable-focal repo, wget, tree and the DOTNET_ROOT/PATH handling, leaving no apt layer at all. Ubuntu 20.04 left standard support in April 2025.
$ErrorActionPreference does not apply to native commands, so a failing dotnet, git, zip, gpg or mvnw was ignored and the artifacts were packaged, signed and tagged anyway. Both scripts now set $PSNativeCommandUseErrorActionPreference (PowerShell 7.3+). Also fix build-preview.ps1 outside Windows, where the artifact paths handed to gpg used backslashes.
PackageReadmeFile requires the readme at the package root, so packing README.md without a PackagePath failed with NU5039. Matches the pattern already used in log4net.csproj.
Dispose disposed the TcpClient while the reader was blocked in stream.Read, so teardown always aborted the socket and dumped an IOException with a stack trace, even on a passing run. Shut the socket down first, so the read returns 0 and the loop ends normally, and only report exceptions that arrive before disposal. Progress chatter removed; the test now prints nothing unless it fails. Two things this fixes beyond the noise: - The cancellation token never actually stopped the loop. The check ran only after a successful read, so the reader could only be broken by disposing the socket under it. Now Shutdown(SocketShutdown.Both) ends the stream and the loop exits through its normal condition. - Diagnostics are preserved for real failures. log is still wired to TestContext.Out.WriteLine, gated on !_disposing - so a genuine client error still surfaces, and Assert.Fail on timeout still reports what was received.
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. Correct the reason given in BUILDING.md and the changelog.
Utils.IsMono and Utils.InconclusiveOnMono are gone, along with all 15 call sites. The net462 tests run only on Windows now and the net10.0 tests run on .NET 10, so the guard could never fire. SystemInfo.IsMono in the library is deliberately untouched: it detects the runtime executing log4net, which can still be Mono.
FreeAndNil
force-pushed
the
Feature/305-dotnet-10-build-cleanup
branch
from
August 4, 2026 22:30
6dee635 to
98742f2
Compare
fluffynuts
reviewed
Aug 5, 2026
fluffynuts
approved these changes
Aug 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The sources already use C# 14 (the
fieldkeyword inSmtpAppender's property accessors), whichrequires 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.
log4netstill targetsnet462;netstandard2.0andlog4net.Ext.Mailstill targetsnetstandard2.0. Nothing here affects consumers.Changes
net8.0→net10.0; CIdotnet-version: 10MonoForFramework.targetsand its two importsubuntu:20.04+dotnet-install.sh→mcr.microsoft.com/dotnet/sdk:10.0-noble$PSNativeCommandUseErrorActionPreferencein both scripts, plus a pathNU5039Mono is no longer needed to build net4x
MonoForFramework.targetssetFrameworkPathOverrideto Mono's4.6.2-apidirectory on Unix. Thatis obsolete: the .NET SDK already adds an implicit
PackageReferencetoMicrosoft.NETFramework.ReferenceAssemblies.<tfm>for net4x targets, and those packages werealready in the restore graph.
net462 tests are now Windows-only
VSTest hosts net4x tests through
TestHostNetFramework/testhost.exe, a .NET Framework executable,so
dotnet testaborts withTESTRUNABORTon Linux and macOS.log4net.Testsnow conditions itsTargetFrameworkson'$(OS)' != 'Windows_NT', so no unrunnable test assembly is produced. Thenet462library is still built on every platform; only the test target is gated.This also fixes the
ubuntu-22.04andmacos-14CI jobs, which ran a baredotnet testagainst anet462target 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 failingdotnet,git,zip,gpgormvnwwas therefore ignored, andartifacts were packaged, signed and tagged anyway. Both scripts now set
$PSNativeCommandUseErrorActionPreference(PowerShell 7.3+).This was not theoretical:
NU5039made thelog4net.Ext.Mailpack fail, no.nupkgwas produced,and
build-preview.ps1went on to gpg-sign files that did not exist.build-preview.ps1also builtits artifact paths with backslashes, which are not path separators outside Windows.
TelnetAppender test noise
SimpleTelnetClient.Dispose()disposed theTcpClientwhile the reader was blocked instream.Read, so teardown aborted the socket and dumped anIOExceptionwith a stack trace onevery 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 warningsdotnet test ./src/log4net.sln- 292 total, 0 failed, 281 succeeded, 11 skipped (Windows-only)net462andnet472compile withMonoForFramework.targetsdeletedlog4net.Tests.Signing.AssemblyShouldBeSignedpasses - strong naming survives thereference-assembly switch
./mvnw siteworksFor reviewers to weigh
Nothing tests on the .NET 8 runtime any more.
netstandard2.0consumers on .NET 8 (LTS untilNovember 2026) are still supported but no longer exercised.
The MCR image reference is fully qualified, so it needs no registry configuration and no login.