Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this

## [Unreleased]

## [1.4.0] - 2026-02-26

### Changed
- **⬆️ .NET 10 upgrade** — The entire solution is now built on .NET 10
- SDK pinned to `10.0.102` via `global.json` (`rollForward: latestFeature`)
- Library projects (`FunctionalStateMachine.Core`, `FunctionalStateMachine.CommandRunner`) now ship `netstandard2.0` and `net10.0` builds (previously `net8.0`)
- Test and sample projects target `net10.0` (previously `net9.0`)
- `Microsoft.Extensions.DependencyInjection.Abstractions` updated `2.2.0` → `10.0.0`
- `Microsoft.Extensions.DependencyInjection` updated `9.0.0` → `10.0.0`

## [1.3.0] - 2026-02-23

### Added
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ This project adheres to a Code of Conduct that all contributors are expected to

### Prerequisites

- [.NET 9.0 SDK](https://dotnet.microsoft.com/download) or later
- [.NET 10.0 SDK](https://dotnet.microsoft.com/download) or later
- Git
- A code editor (Visual Studio, VS Code, Rider, etc.)

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -488,9 +488,9 @@ Explore complete, runnable examples in the `/samples` directory:

## Advanced Topics

This library targets both `netstandard2.0` (broad compatibility) and `net8.0` (AOT/trim-ready). Both NativeAOT and `PublishTrimmed` publishing are supported with zero runtime reflection.
This library targets both `netstandard2.0` (broad compatibility) and `net10.0` (AOT/trim-ready). Both NativeAOT and `PublishTrimmed` publishing are supported with zero runtime reflection.

- **[Target framework compatibility](docs/Target-Framework-Compatibility.md)** — .NET Standard 2.0 vs .NET 8+, what each target provides
- **[Target framework compatibility](docs/Target-Framework-Compatibility.md)** — .NET Standard 2.0 vs .NET 10+, what each target provides
- **[AOT and trim compatibility](docs/AOT-and-Trim-Compatibility.md)** — NativeAOT, `PublishTrimmed`, how source generators eliminate reflection

---
Expand Down
8 changes: 4 additions & 4 deletions docs/AOT-and-Trim-Compatibility.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# AOT and Trim Compatibility

The `net8.0` build of `FunctionalStateMachine.Core` and `FunctionalStateMachine.CommandRunner` is fully compatible with:
The `net10.0` build of `FunctionalStateMachine.Core` and `FunctionalStateMachine.CommandRunner` is fully compatible with:

- **NativeAOT** (`PublishAot=true`) — compiled ahead of time to a self-contained native binary
- **Trimming** (`PublishTrimmed=true`) — unused code removed at publish time to reduce binary size
Expand All @@ -10,8 +10,8 @@ The `net8.0` build of `FunctionalStateMachine.Core` and `FunctionalStateMachine.

| Package | `IsAotCompatible` | Reflection-free | Trim-safe |
|---|---|---|---|
| `FunctionalStateMachine.Core` | ✅ (`net8.0+`) | ✅ | ✅ |
| `FunctionalStateMachine.CommandRunner` | ✅ (`net8.0+`) | ✅ | ✅ |
| `FunctionalStateMachine.Core` | ✅ (`net10.0`) | ✅ | ✅ |
| `FunctionalStateMachine.CommandRunner` | ✅ (`net10.0`) | ✅ | ✅ |
| `FunctionalStateMachine.Diagrams` | N/A (build-time only) | N/A | N/A |
| `FunctionalStateMachine.Core.Generator` | N/A (build-time only) | N/A | N/A |
| `FunctionalStateMachine.CommandRunner.Generator` | N/A (build-time only) | N/A | N/A |
Expand All @@ -28,7 +28,7 @@ Add `<PublishTrimmed>true</PublishTrimmed>` to your `.csproj`:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
</Project>
Expand Down
6 changes: 3 additions & 3 deletions docs/Target-Framework-Compatibility.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
| Target framework | Gets |
|---|---|
| `netstandard2.0` | Broadest compatibility — .NET Framework 4.6.1+, .NET Core 2.0+, Xamarin, Unity |
| `net8.0` | AOT-compatible build with full trim analysis |
| `net10.0` | AOT-compatible build with full trim analysis |

When you reference the NuGet package from a `net8.0` or `net9.0` project, NuGet automatically selects the `net8.0` build. When you reference it from a `netstandard2.0`-compatible target, NuGet selects the `netstandard2.0` build.
When you reference the NuGet package from a `net10.0` project, NuGet automatically selects the `net10.0` build. When you reference it from any other target (including `net8.0`, `net9.0`, or `netstandard2.0`-compatible targets), NuGet selects the `netstandard2.0` build.

## Feature comparison

All state machine features are identical across both targets. The only difference is in the internals:

| Feature | `netstandard2.0` | `net8.0+` |
| Feature | `netstandard2.0` | `net10.0` |
|---|---|---|
| Full fluent API | ✅ | ✅ |
| Guards, conditionals | ✅ | ✅ |
Expand Down
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Welcome to the Functional State Machine docs. Each guide introduces a feature, w

## Advanced

- [Target framework compatibility (.NET Standard 2.0 vs .NET 8+)](Target-Framework-Compatibility.md)
- [Target framework compatibility (.NET Standard 2.0 vs .NET 10+)](Target-Framework-Compatibility.md)
- [AOT and trim compatibility](AOT-and-Trim-Compatibility.md)

## For Contributors
Expand Down
5 changes: 2 additions & 3 deletions test/FunctionalStateMachine.Benchmarks/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Results will be saved to `BenchmarkDotNet.Artifacts/results/` including:

## Typical Results

*Benchmarks run on .NET 9.0*
*Benchmarks run on .NET 10.0*

| Method | Mean | Allocated |
|---------------------------- |----------:|----------:|
Expand Down Expand Up @@ -63,8 +63,7 @@ Use BenchmarkDotNet's built-in analysis:

```bash
# Compare different .NET versions
dotnet run -c Release -f net8.0
dotnet run -c Release -f net9.0
dotnet run -c Release -f net10.0

# Memory profiling
dotnet run -c Release --filter *Fire*
Expand Down
Loading