About 4.0.0
Dynamitey.Community 4.0.0 is the first release from this repository. The Dynamitey package on NuGet is still upstream's 3.0.3, and it does not contain this code.
Jay Tuley wrote Dynamitey. Upstream stopped at 3.0.3 in November 2023. The notes below are the difference between that tree, marked by the upstream-baseline tag, and this release.
.NET Framework
4.0.0 targets netstandard2.0 and net10.0. A .NET Framework 4.6.1 through 4.8.1 project references netstandard2.0. net40 is already gone, which is why this release is 4.0.0 and not 3.0.4.
This is the last release with that target. Later releases target the supported .NET LTS and STS lines. The plan for the next one is #95: net10.0, which is LTS through November 2028, and net11.0, which is STS. A Framework application stays on Dynamitey.Community 4.x.
On 6 May 2019 Microsoft wrote that .NET Framework 4.8 would be the last major version, and that new work on the runtime and the base class library would go to modern .NET. The post is ".NET Core is the Future of .NET". Framework is still serviced with Windows. 4.8.1 shipped on 9 August 2022 and is still that line. It does not get the newer BCL APIs, so this library has to drop netstandard2.0 before it can call them.
Tests and issues
The upstream tree had 219 tests. This release runs 852, with 0 failed, 0 skipped, and no category filter.
54 issues filed here are closed. Three are still open and are not in this release: publishing (#8), the roadmap (#10), and the target change after 4.0.0 (#95).
Six of the closed issues came from ekonbenefits/dynamitey. The oldest two were filed in 2014.
| Issue | Filed | What happened |
|---|---|---|
#11 InvokeConstructor above 14 arguments |
2014 | Fixed. Past the generated ceiling, a hand-written branch built the call site with the wrong return type. That included a constructor with a params array. |
#12 InvokeGet on a static field |
2014 | Fixed. A field has no get_ method, so the call falls back to reflection. The caller's context still decides what it may read. |
| #13 static context on nested private classes | 2018 | Fixed. The result used to depend on whether some earlier call had already warmed the shared cache. |
| #14 a generic method call | 2020 | Could not be reproduced. Explicit generic arguments are covered by tests now. |
#15 awaiting a ValueTask<T> |
2021 | Could not be reproduced, on current code or on a rebuild of the 3.0.3 sources. |
| #16 an async method on an internal class | 2022 | Fixed. await works when T is not visible to the caller. The call site stays as it was. |
The other closed issues were bugs found while updating the library. Static get and set of the same property in one process. List change notifications, and List.Remove(null). Dictionary and list equality, and Equals / GetHashCode on invocations. Static events. Named arguments and named index assignment. Curry and CacheableInvocation dropping a context or an argument count. Task<T> and ValueTask<T> results the caller cannot see. Protected access from a derived type. The path above 14 arguments depending on a package reference it had never declared.
The rest of the update
net40 is out and net10.0 is in. netstandard2.0 stays on this release only.
PackageId and AssemblyName are Dynamitey.Community. The root namespace is still Dynamitey, so a project changes the PackageReference and rebuilds. No using line moves.
GitVersion reads the version from the git tag. There is no version constant in the tree. Pushing the tag 4.0.0 is the release.
The package carries this repository's URL, the Apache-2.0 license, this README, Source Link, and a .snupkg. The strong-name key belongs to this fork. The copyright line still names Ekon Benefits, and it adds the community contributors.
Nullable reference types are enabled. The dynamic entry points are marked RequiresUnreferencedCode and RequiresDynamicCode. The public API is frozen in PublicAPI.Shipped.txt, and a change to that surface fails the build until the file changes with it.
CI builds and tests on Linux, macOS, and Windows. Coverage floors apply to the shipped assembly. CodeQL analyzes the library. NuGet packages are audited, dependency changes are reviewed, the DocFX site is built, Native AOT gets a smoke test, and the benchmarks compile. The old step that published to another organization's feed is gone. A release tag publishes with NuGet Trusted Publishing. The repository has no NuGet API key.
Tests are on NUnit 4. The 291 ClassicAssert calls now use Assert.That. Benchmarks are BenchmarkDotNet, and a slow wall-clock time no longer fails the build. The three process-wide call-site maps are concurrent dictionaries.
Cleanup
CodeMaid ran over the library, the tests, the benchmarks, and the support fixture. It removed 98 unused using directives and sorted the ones that stayed. That pass is the formatting of the tree. Two of its edits were put back. It had changed private protected to protected on the cross-assembly accessibility tests, and it had removed the attribution notes on the Clay factory tests and on List.Contains, IndexOf, and Insert.
DummmyNull, an unused internal type, is deleted. Four catch blocks that caught Exception now catch the exceptions those calls actually throw. Commented-out code and unused locals the analyzers flagged are gone, along with orphaned build files from the old tree.
Whatever is still in the analyzer backlog is written in Dynamitey.csproj, with a reason on each entry. Those stay because the fix would change behavior or the public API. One of them is CA1851 on a single-pass sequence in Tupler.