C# 15 preview ships union types with real compiler-checked exhaustiveness, no more hand-rolled
sealed hierarchies for a Result type. The catch: it is a union of pre-existing types, not
F#-style discriminated cases, and value-type cases box unless you write non-boxing boilerplate
yourself. The quieter sibling feature, closed hierarchies, may be the safer bet for enterprise
teams right now.
NetEvolve.Analyzer enforces null-check idioms and file organization on other people’s code, but had never run against its own. Fixing that surfaced 39 warnings, a silent Visual Studio MEF failure, and a follow-up NE0008 bug where DateOnly and TimeOnly got flagged blind to which target framework actually has them, the same multi-targeting blindness in a different corner of the codebase.
The EU Cyber Resilience Act’s headline deadline is December 2027, but the
reporting clock starts more than a year earlier. Article 14 vulnerability
reporting applies from September 2026. Here is the engineering map I built
for my own NuGet release pipeline: what the CRA regulates, the 24/72-hour
cadence, SBOM tooling for .NET, and where the open-source carve-out holds.
Parts 1 through 3 of this series made the generator correct, incremental, and proven by tests. None of it reaches a single consumer if the NuGet package is laid out wrong — and the failure modes are silent: a DLL in lib/ instead of analyzers/dotnet/cs simply never loads, a missing dependency throws only inside the compiler, and a marker attribute delivered carelessly breaks InternalsVisibleTo in ways users cannot diagnose. This final part covers the packaging contract: the netstandard2.0 rule, the package layout, dependency bundling, attribute delivery, debugging the shipped bits, and the analyzer hygiene rules that keep you honest.
You followed the equality rules, you shaped the pipeline correctly, and your generator still might be re-running on every keystroke — because nobody ever asked the driver. Roslyn records exactly why each pipeline step re-executed, and you can assert against those reasons in a plain xUnit test. This is the test that turns “my generator is incremental” from a claim into a regression-protected fact, plus the catalog of anti-patterns it catches in the wild.