Skip to content

deps: upgrade from .NET 9 to .NET 10#499

Merged
tylerkron merged 4 commits intomainfrom
claude/stupefied-darwin-1eab6b
Apr 25, 2026
Merged

deps: upgrade from .NET 9 to .NET 10#499
tylerkron merged 4 commits intomainfrom
claude/stupefied-darwin-1eab6b

Conversation

@tylerkron
Copy link
Copy Markdown
Contributor

Summary

  • Bumps TargetFramework to net10.0 / net10.0-windows across all 8 projects
  • Upgrades EF Core packages (Microsoft.EntityFrameworkCore, .Sqlite, .Tools) from 9.0.1410.0.7
  • Upgrades EFCore.BulkExtensions.Sqlite from 9.0.210.0.1
  • Updates both global.json files (root and Daqifi.Desktop.Setup) to require SDK 10.0.0 minimum

Closes #498 — Dependabot's PR only bumped the Tools package to v10 while leaving the runtime packages on v9, which would have caused a version mismatch. This PR completes the full upgrade together.

Test plan

  • Install .NET 10 SDK locally (winget install Microsoft.DotNet.SDK.10 on Windows or brew install --cask dotnet-sdk on macOS)
  • dotnet build succeeds with no errors
  • dotnet test passes all existing tests
  • Run app on Windows and verify device connectivity still works

🤖 Generated with Claude Code

- Bumps TargetFramework to net10.0 / net10.0-windows across all projects
- Upgrades EF Core packages (Core, Sqlite, Tools) from 9.0.14 → 10.0.7
- Upgrades EFCore.BulkExtensions.Sqlite from 9.0.2 → 10.0.1
- Updates global.json SDK minimum from 9.0.0 → 10.0.0 (both root and Setup)

Closes #498 — which was a mismatched partial bump of only the Tools package.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@tylerkron tylerkron requested a review from a team as a code owner April 25, 2026 19:49
@qodo-code-review
Copy link
Copy Markdown
Contributor

Review Summary by Qodo

Upgrade .NET framework and dependencies from 9.0 to 10.0

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Upgrade all 8 projects from .NET 9.0 to .NET 10.0 target framework
• Update EF Core packages (Core, Sqlite, Tools) from 9.0.14 to 10.0.7
• Upgrade EFCore.BulkExtensions.Sqlite from 9.0.2 to 10.0.1
• Update global.json SDK minimum version to 10.0.0 in both locations
Diagram
flowchart LR
  A["All 8 Projects<br/>net9.0 → net10.0"] --> B["Target Framework Updated"]
  C["EF Core Packages<br/>9.0.14 → 10.0.7"] --> D["Dependencies Upgraded"]
  E["EFCore.BulkExtensions<br/>9.0.2 → 10.0.1"] --> D
  F["global.json SDK<br/>9.0.0 → 10.0.0"] --> G["SDK Requirement Updated"]
  B --> H["Complete .NET 10 Migration"]
  D --> H
  G --> H
Loading

Grey Divider

File Changes

1. Daqifi.Desktop.Common.Test/Daqifi.Desktop.Common.Test.csproj ⚙️ Configuration changes +1/-1

Update target framework to net10.0

Daqifi.Desktop.Common.Test/Daqifi.Desktop.Common.Test.csproj


2. Daqifi.Desktop.Common/Daqifi.Desktop.Common.csproj ⚙️ Configuration changes +1/-1

Update target framework to net10.0

Daqifi.Desktop.Common/Daqifi.Desktop.Common.csproj


3. Daqifi.Desktop.DataModel.Test/Daqifi.Desktop.DataModel.Test.csproj ⚙️ Configuration changes +1/-1

Update target framework to net10.0

Daqifi.Desktop.DataModel.Test/Daqifi.Desktop.DataModel.Test.csproj


View more (7)
4. Daqifi.Desktop.DataModel/Daqifi.Desktop.DataModel.csproj ⚙️ Configuration changes +1/-1

Update target framework to net10.0

Daqifi.Desktop.DataModel/Daqifi.Desktop.DataModel.csproj


5. Daqifi.Desktop.IO.Test/Daqifi.Desktop.IO.Test.csproj ⚙️ Configuration changes +1/-1

Update target framework to net10.0

Daqifi.Desktop.IO.Test/Daqifi.Desktop.IO.Test.csproj


6. Daqifi.Desktop.IO/Daqifi.Desktop.IO.csproj ⚙️ Configuration changes +1/-1

Update target framework to net10.0

Daqifi.Desktop.IO/Daqifi.Desktop.IO.csproj


7. Daqifi.Desktop.Test/Daqifi.Desktop.Test.csproj ⚙️ Configuration changes +1/-1

Update target framework to net10.0-windows

Daqifi.Desktop.Test/Daqifi.Desktop.Test.csproj


8. Daqifi.Desktop/Daqifi.Desktop.csproj Dependencies +5/-5

Update framework and upgrade EF Core dependencies

Daqifi.Desktop/Daqifi.Desktop.csproj


9. Daqifi.Desktop.Setup/global.json ⚙️ Configuration changes +1/-1

Update SDK minimum version to 10.0.0

Daqifi.Desktop.Setup/global.json


10. global.json ⚙️ Configuration changes +1/-1

Update SDK minimum version to 10.0.0

global.json


Grey Divider

Qodo Logo

@qodo-code-review
Copy link
Copy Markdown
Contributor

qodo-code-review Bot commented Apr 25, 2026

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (1) 📎 Requirement gaps (0)

Grey Divider


Action required

1. Tab-indented <TargetFramework> line 📘 Rule violation ✧ Quality
Description
The modified <TargetFramework> line is indented with a tab character instead of 4 spaces. This
violates the repository indentation rule and can cause inconsistent formatting across
editors/linters.
Code

Daqifi.Desktop.Common/Daqifi.Desktop.Common.csproj[4]

+		<TargetFramework>net10.0</TargetFramework>
Evidence
PR Compliance ID 244818 requires 4-space indentation with no tabs. The updated <TargetFramework>
line begins with a tab character in the modified file.

Rule 244818: Use 4 spaces for indentation (no tabs)
Daqifi.Desktop.Common/Daqifi.Desktop.Common.csproj[4-4]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The modified line uses a leading tab character for indentation, but the standard requires 4-space indentation (no tabs).

## Issue Context
This was introduced/retained on the updated `<TargetFramework>` line.

## Fix Focus Areas
- Daqifi.Desktop.Common/Daqifi.Desktop.Common.csproj[4-4]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. MSI harvest path wrong🐞 Bug ☼ Reliability
Description
The WiX setup project harvests binaries from a hardcoded net9.0-windows publish folder, but the
Desktop app now builds/publishes under net10.0-windows, so the MSI build will fail due to missing
source files. This is exercised in the PR build workflow, which publishes without overriding the
output path and then builds the installer.
Code

Daqifi.Desktop/Daqifi.Desktop.csproj[5]

+		<TargetFramework>net10.0-windows</TargetFramework>
Evidence
After the PR, the Desktop project’s TFM is net10.0-windows, so dotnet publish defaults to
bin/<Configuration>/net10.0-windows/publish. The WiX project still points at
...\net9.0-windows\publish, and the CI build workflow publishes without --output, then runs the
installer build—meaning the directory WiX expects won’t be created in a clean CI run.

Daqifi.Desktop/Daqifi.Desktop.csproj[3-8]
Daqifi.Desktop.Setup/DAQifiDesktopSetup/DAQifiDesktop_Setup.wixproj[9-14]
.github/workflows/build.yaml[24-32]
.github/workflows/build.yaml[92-96]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The WiX `.wixproj` harvest path is hardcoded to `net9.0-windows\\publish`, but the app now targets `net10.0-windows`. In CI, `dotnet publish` (without `--output`) will publish to the net10 folder, and the installer build will then fail to find the expected files.

### Issue Context
- Desktop TFM: `net10.0-windows`
- WiX harvest source dir: `...\\net9.0-windows\\publish`
- CI publishes without overriding output, then builds the MSI.

### Fix Focus Areas
- Daqifi.Desktop.Setup/DAQifiDesktopSetup/DAQifiDesktop_Setup.wixproj[9-14]
- .github/workflows/build.yaml[24-32]
- .github/workflows/build.yaml[92-96]

### What to change
- Update `DaqifiSourceDir` to point to `net10.0-windows\\publish` **or** parameterize it (e.g., a property like `AppTargetFramework` used in the path).
- Ensure the CI `dotnet publish` output directory matches what the WiX project expects (either by updating WiX, or by passing `--output` to publish to the same folder).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Release uses .NET 9🐞 Bug ☼ Reliability
Description
The release workflow pins the .NET SDK to 9.0.x and publishes to a net9.0-windows output folder, but
the app now targets net10.0-windows, so the release pipeline cannot build/publish the project. This
will block creating releases once this PR merges.
Code

Daqifi.Desktop/Daqifi.Desktop.csproj[5]

+		<TargetFramework>net10.0-windows</TargetFramework>
Evidence
The Desktop project now targets net10.0-windows. The release workflow explicitly installs SDK 9.0.x
and publishes into a net9.0-windows path, which is incompatible with building a net10.0-windows
project and inconsistent with the new TFM.

Daqifi.Desktop/Daqifi.Desktop.csproj[3-8]
.github/workflows/release.yaml[14-27]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The release workflow is still pinned to .NET SDK 9.0.x and uses a `net9.0-windows` publish output folder, but the app now targets `net10.0-windows`.

### Issue Context
- Desktop project TFM changed to `net10.0-windows`.
- Release workflow installs `dotnet-version: 9.0.x` and publishes to `.../net9.0-windows/publish`.

### Fix Focus Areas
- .github/workflows/release.yaml[14-27]

### What to change
- Update `actions/setup-dotnet` to install a .NET 10 SDK (e.g. `dotnet-version: 10.0.x`, or configure it to honor `global.json`).
- Update the hardcoded publish output folder name to `net10.0-windows` (or remove the hardcoded TFM directory name entirely and pass `-f net10.0-windows` explicitly).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

4. CI SDK not pinned 🐞 Bug ☼ Reliability
Description
global.json now requires SDK 10.0.0, but the PR build workflow doesn’t install/pin any .NET SDK,
so CI success depends on whatever SDK happens to be preinstalled on the runner image. This makes
builds fragile and can cause sudden CI failures when runner images change.
Code

global.json[3]

+    "version": "10.0.0",
Evidence
The repository’s global.json now requests SDK version 10.0.0. The PR build workflow runs `dotnet
restore/build/test without any actions/setup-dotnet` step, so it does not guarantee the required
SDK is present.

global.json[1-7]
.github/workflows/build.yaml[10-32]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
CI currently does not install/pin a .NET SDK, but the repo now requires .NET 10 via `global.json`. This makes CI dependent on runner image contents.

### Issue Context
- `global.json` requests SDK `10.0.0`.
- Build workflow runs `dotnet restore/build/test` without `actions/setup-dotnet`.

### Fix Focus Areas
- .github/workflows/build.yaml[10-32]
- global.json[1-7]

### What to change
- Add an `actions/setup-dotnet@v5` step to the build workflow to install .NET 10 (or configure setup-dotnet to use `global.json`), before any `dotnet` commands run.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

System.Runtime.CompilerServices.Unsafe and System.ValueTuple are part of
the .NET 10 runtime — no longer needed as explicit package references.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Comment thread Daqifi.Desktop.Common/Daqifi.Desktop.Common.csproj
Comment thread Daqifi.Desktop/Daqifi.Desktop.csproj
Comment thread Daqifi.Desktop/Daqifi.Desktop.csproj
tylerkron and others added 2 commits April 25, 2026 13:53
- WiX DaqifiSourceDir was still pointing to net9.0-windows\publish
- release.yaml was installing .NET SDK 9.0.x and publishing to net9.0-windows path
Both would cause the MSI installer build to fail after the .NET 10 upgrade.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

📊 Code Coverage Report

Summary

Summary
Generated on: 4/25/2026 - 7:57:37 PM
Coverage date: 4/25/2026 - 7:56:59 PM - 4/25/2026 - 7:57:33 PM
Parser: MultiReport (4x Cobertura)
Assemblies: 3
Classes: 119
Files: 148
Line coverage: 17.8% (1507 of 8455)
Covered lines: 1507
Uncovered lines: 6948
Coverable lines: 8455
Total lines: 25995
Branch coverage: 18.9% (521 of 2752)
Covered branches: 521
Total branches: 2752
Method coverage: Feature is only available for sponsors

Coverage

DAQiFi - 17.6%
Name Line Branch
DAQiFi 17.6% 18.9%
Daqifi.Desktop.App 5.4% 0%
Daqifi.Desktop.Channel.AbstractChannel 40.9% 27.7%
Daqifi.Desktop.Channel.AnalogChannel 58.7% 25%
Daqifi.Desktop.Channel.Channel 11.5% 0%
Daqifi.Desktop.Channel.ChannelColorManager 100% 100%
Daqifi.Desktop.Channel.DataSample 91.6%
Daqifi.Desktop.Channel.DigitalChannel 65.2% 25%
Daqifi.Desktop.Commands.CompositeCommand 0% 0%
Daqifi.Desktop.Commands.HostCommands 0%
Daqifi.Desktop.Commands.WeakEventHandlerManager 0% 0%
Daqifi.Desktop.Configuration.FirewallConfiguration 90.6% 66.6%
Daqifi.Desktop.Configuration.WindowsFirewallWrapper 64% 68.4%
Daqifi.Desktop.ConnectionManager 42.4% 39.2%
Daqifi.Desktop.Converters.BoolToActiveStatusConverter 0% 0%
Daqifi.Desktop.Converters.BoolToConnectionStatusConverter 0% 0%
Daqifi.Desktop.Converters.BoolToStatusColorConverter 0% 0%
Daqifi.Desktop.Converters.BrushColorMatchConverter 0% 0%
Daqifi.Desktop.Converters.ConnectionTypeToColorConverter 0% 0%
Daqifi.Desktop.Converters.ConnectionTypeToUsbConverter 0% 0%
Daqifi.Desktop.Converters.InvertedBoolToVisibilityConverter 0% 0%
Daqifi.Desktop.Converters.ListToStringConverter 0% 0%
Daqifi.Desktop.Converters.NotNullToVisibilityConverter 0% 0%
Daqifi.Desktop.Converters.OxyColorToBrushConverter 0% 0%
Daqifi.Desktop.Device.AbstractStreamingDevice 42.9% 38.6%
Daqifi.Desktop.Device.DeviceMessage 0%
Daqifi.Desktop.Device.Firmware.BootloaderSessionStreamingDeviceAdapter 0% 0%
Daqifi.Desktop.Device.Firmware.WifiPromptDelayProcessRunner 0% 0%
Daqifi.Desktop.Device.NativeMethods 100%
Daqifi.Desktop.Device.SerialDevice.SerialStreamingDevice 27.6% 30.8%
Daqifi.Desktop.Device.WiFiDevice.DaqifiStreamingDevice 40.9% 39.4%
Daqifi.Desktop.DialogService.DialogService 0% 0%
Daqifi.Desktop.DialogService.ServiceLocator 0% 0%
Daqifi.Desktop.DiskSpace.DiskSpaceCheckResult 100%
Daqifi.Desktop.DiskSpace.DiskSpaceEventArgs 100%
Daqifi.Desktop.DiskSpace.DiskSpaceMonitor 88.2% 86.6%
Daqifi.Desktop.DuplicateDeviceCheckResult 100%
Daqifi.Desktop.Exporter.OptimizedLoggingSessionExporter 66.5% 62.7%
Daqifi.Desktop.Exporter.SampleData 100%
Daqifi.Desktop.Helpers.BooleanConverter`1 0% 0%
Daqifi.Desktop.Helpers.BooleanToInverseBoolConverter 0% 0%
Daqifi.Desktop.Helpers.BooleanToVisibilityConverter 0%
Daqifi.Desktop.Helpers.EnumDescriptionConverter 100% 100%
Daqifi.Desktop.Helpers.IntToVisibilityConverter 0% 0%
Daqifi.Desktop.Helpers.MinMaxDownsampler 98.6% 97.9%
Daqifi.Desktop.Helpers.MyMultiValueConverter 0%
Daqifi.Desktop.Helpers.NaturalSortHelper 100% 100%
Daqifi.Desktop.Helpers.OxyPlotDarkTheme 0%
Daqifi.Desktop.Helpers.VersionHelper 98.2% 66.2%
Daqifi.Desktop.Logger.DatabaseLogger 0% 0%
Daqifi.Desktop.Logger.DatabaseMigrator 0% 0%
Daqifi.Desktop.Logger.DeviceLegendGroup 100% 100%
Daqifi.Desktop.Logger.LoggedSeriesLegendItem 0% 0%
Daqifi.Desktop.Logger.LoggingContext 100%
Daqifi.Desktop.Logger.LoggingContextDesignTimeFactory 0%
Daqifi.Desktop.Logger.LoggingManager 0% 0%
Daqifi.Desktop.Logger.LoggingSession 16% 5%
Daqifi.Desktop.Logger.PlotLogger 0% 0%
Daqifi.Desktop.Logger.SessionDeviceMetadata 80%
Daqifi.Desktop.Logger.SummaryLogger 0% 0%
Daqifi.Desktop.Logger.TimestampGapDetector 95% 83.3%
Daqifi.Desktop.Loggers.ImportOptions 0%
Daqifi.Desktop.Loggers.ImportProgress 0% 0%
Daqifi.Desktop.Loggers.SdCardSessionImporter 0% 0%
Daqifi.Desktop.MainWindow 0% 0%
Daqifi.Desktop.Migrations.AddSamplesSessionTimeIndex 0%
Daqifi.Desktop.Migrations.AddSessionDeviceMetadata 0%
Daqifi.Desktop.Migrations.AddSessionSampleCount 0%
Daqifi.Desktop.Migrations.InitialSQLiteMigration 0%
Daqifi.Desktop.Migrations.LoggingContextModelSnapshot 0%
Daqifi.Desktop.Models.AddProfileModel 0%
Daqifi.Desktop.Models.DaqifiSettings 80.5% 83.3%
Daqifi.Desktop.Models.DebugDataCollection 6.6% 0%
Daqifi.Desktop.Models.DebugDataModel 0% 0%
Daqifi.Desktop.Models.Notifications 0%
Daqifi.Desktop.Models.SdCardFile 0% 0%
Daqifi.Desktop.Services.WindowsPrincipalAdminChecker 0%
Daqifi.Desktop.Services.WpfMessageBoxService 0%
Daqifi.Desktop.UpdateVersion.VersionNotification 0% 0%
Daqifi.Desktop.View.ConnectionDialog 0% 0%
Daqifi.Desktop.View.DebugWindow 0% 0%
Daqifi.Desktop.View.DeviceLogsView 0% 0%
Daqifi.Desktop.View.DuplicateDeviceDialog 0% 0%
Daqifi.Desktop.View.ErrorDialog 0% 0%
Daqifi.Desktop.View.ExportDialog 0% 0%
Daqifi.Desktop.View.FirmwareDialog 0% 0%
Daqifi.Desktop.View.Flyouts.FirmwareFlyout 0% 0%
Daqifi.Desktop.View.Flyouts.LiveGraphFlyout 0% 0%
Daqifi.Desktop.View.Flyouts.NotificationsFlyout 0% 0%
Daqifi.Desktop.View.Flyouts.SummaryFlyout 0% 0%
Daqifi.Desktop.View.MigrationStatusWindow 0% 0%
Daqifi.Desktop.View.MinimapInteractionController 0% 0%
Daqifi.Desktop.View.ProfilesPane 0% 0%
Daqifi.Desktop.View.Prototype.ChannelsPanePrototype 0% 0%
Daqifi.Desktop.View.Prototype.DevicesPanePrototype 0% 0%
Daqifi.Desktop.View.Prototype.LiveGraphPane 0% 0%
Daqifi.Desktop.View.Prototype.LoggedDataPanePrototype 0% 0%
Daqifi.Desktop.View.SuccessDialog 0% 0%
Daqifi.Desktop.ViewModels.ChannelsPaneViewModel 0% 0%
Daqifi.Desktop.ViewModels.ChannelTileViewModel 0% 0%
Daqifi.Desktop.ViewModels.ConnectionDialogViewModel 37.3% 39.1%
Daqifi.Desktop.ViewModels.DaqifiViewModel 17.5% 11%
Daqifi.Desktop.ViewModels.DeviceLogsViewModel 0% 0%
Daqifi.Desktop.ViewModels.DevicesPaneViewModel 0% 0%
Daqifi.Desktop.ViewModels.DeviceTileViewModel 0% 0%
Daqifi.Desktop.ViewModels.DuplicateDeviceDialogViewModel 0%
Daqifi.Desktop.ViewModels.ErrorDialogViewModel 0%
Daqifi.Desktop.ViewModels.ExportDialogViewModel 0% 0%
Daqifi.Desktop.ViewModels.FirmwareDialogViewModel 0% 0%
Daqifi.Desktop.ViewModels.NewProfileChannelItem 0%
Daqifi.Desktop.ViewModels.NewProfileDeviceItem 0% 0%
Daqifi.Desktop.ViewModels.ProfilesPaneViewModel 0% 0%
Daqifi.Desktop.ViewModels.SettingsViewModel 0% 0%
Daqifi.Desktop.ViewModels.SuccessDialogViewModel 85.7%
Daqifi.Desktop.WindowViewModelMapping.IWindowViewModelMappingsContract 0%
Daqifi.Desktop.WindowViewModelMapping.WindowViewModelMappings 0%
Sentry.Generated.BuildPropertyInitializer 100%
Daqifi.Desktop.Common - 30.8%
Name Line Branch
Daqifi.Desktop.Common 30.8% 16.6%
Daqifi.Desktop.Common.Loggers.AppLogger 33.7% 16.6%
Daqifi.Desktop.Common.Loggers.NoOpLogger 0%
Daqifi.Desktop.IO - 100%
Name Line Branch
Daqifi.Desktop.IO 100% ****
Daqifi.Desktop.IO.Messages.MessageEventArgs`1 100%

Coverage report generated by ReportGeneratorView full report in build artifacts

@tylerkron tylerkron merged commit cb58408 into main Apr 25, 2026
8 checks passed
@tylerkron tylerkron deleted the claude/stupefied-darwin-1eab6b branch April 25, 2026 20:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant