
The recommended variant for specifying the SDK in .NET is the global.json file. This centrally guarantees that all computers on which the code is compiled ideally have the same SDK installed and use it.
I have now updated my blog schwabencode.com
to .NET 10 Preview 1 so that my global.json looks like this:
1{
2 "sdk": {
3 "version": "10.0.100-preview.1.25120.13"
4 }
5}
Everything can be built locally, but unfortunately not in my GitHub action. This is crashing with the following error:
1 Tool 'bundlerminifier.core.tool' is up to date.
2 You must install or update .NET to run this application.
3
4 App: /home/runner/.nuget/packages/bundlerminifier.core.tool/7.6.2/tools/net9.0/any/dotnet-bundle.dll
5 Architecture: x64
6 Framework: 'Microsoft.NETCore.App', version '9.0.0' (x64)
7 .NET location: /usr/share/dotnet/
8
9 The following frameworks were found:
10 8.0.13 at [/usr/share/dotnet/shared/Microsoft.NETCore.App]
11 10.0.0-preview.1.25080.5 at [/usr/share/dotnet/shared/Microsoft.NETCore.App]
I am using a tooling that requires .NET 9; .NET 9 is also installed on my developer machine, but not on the CI system. This error is typical for using dotnet tools, but also in a .NET preview phase such as we currently have with .NET 10; it is also a typical case with Entity Framework and the EF tooling.
The solution in this case is that we have two SDK versions as a requirement for compilation - and this specification is not supported in global.json. This was simply forgotten in the design.
The solution here is that two SDKs are installed via an external command; in the case of GitHub Actions via actions/setup-dotnet .
1jobs:
2 build-and-deploy:
3 runs-on: ubuntu-latest
4 steps:
5 - uses: actions/checkout@v4
6
7 - name: Setup .NET
8 uses: actions/setup-dotnet@v4
9 with:
10 dotnet-version: |
11 9.x
12 10.x
13
14 - name: dotnet restore
15 run: dotnet restore
16
17 - name: dotnet build
18 run: dotnet build --no-restore --configuration Release
And then you can build your code again.
Related articles

Dec 05, 2025 · 5 min read
IMemoryCache Entry Invalidation (Manual Cache Busting)
IMemoryCache is great for speeding up expensive operations (database reads, HTTP calls, heavy computations). But many real systems need more …

Nov 08, 2025 · 8 min read
.NET 10 Release: What's New (LTS) and What to Upgrade First
.NET 10 is the next Long-Term Support (LTS) release in the .NET family. LTS matters because it’s the version many teams standardize on …

Sep 24, 2025 · 9 min read
Automatically discover tools for Azure OpenAI Realtime API
Azure now provides a unified Realtime API for low‑latency, multimodal conversations over WebRTC or WebSockets. If you’ve used the earlier …
Let's Work Together
Looking for an experienced Platform Architect or Engineer for your next project? Whether it's cloud migration, platform modernization or building new solutions from scratch - I'm here to help you succeed.

Comments