You installed the .NET SDK on your Snapdragon laptop, opened a terminal, typed dotnet --info — and got “command not found,” a crash, or an SDK list that shows the wrong architecture. Your projects built fine on your old machine, but here even dotnet new console misbehaves.
.NET on Windows ARM is genuinely native — Microsoft ships full ARM64 SDKs and runtimes — but the installer ecosystem is full of traps: the download page defaults to x64, old scripts install the x64 SDK under emulation, and having both architectures installed creates PATH shadowing where the wrong dotnet.exe wins. The result looks like a broken SDK when it is really a wrong-architecture SDK. The same ARM64-first rule applies across the dev stack — Copilot in Teams not working on laptops
and Paint generative fill issues
are different features, but they share the “install the ARM build, not the x64 build” root cause pattern.
This guide gives you six fixes in order: install the correct ARM64 SDK, fix PATH and shadowing, resolve runtime-vs-SDK mismatches, handle native dependencies, fix Visual Studio integration, and clean up mixed-architecture installs. All commands run in PowerShell or Terminal.
Why this happens
- x64 SDK installed instead of ARM64: The .NET download page defaults to x64. On ARM Windows the x64 SDK runs under emulation, producing crashes, wrong-architecture builds, and confusing
dotnet --infooutput. - PATH shadowing between architectures: With both x64 and ARM64 SDKs installed, whichever
dotnet.exeappears first in PATH wins. A stale x64 entry silently shadows the ARM64 SDK. - Runtime/SDK version mismatch: A project targeting .NET 8 with only the .NET 9 SDK (or vice versa) fails to run — the “you must install a runtime” error that looks like a broken install.
- Native NuGet dependencies without ARM64 binaries: Packages wrapping x64 native DLLs fail at runtime on ARM64 even though the managed code compiles fine.
- Visual Studio installing the wrong workloads: The VS installer can pull x64-targeted components or miss the ARM64 build tools, breaking builds launched from the IDE while command-line builds work.
- Corrupted install from mixed script runs: Install scripts that detect the OS as “Windows” without checking architecture download x64 binaries, leaving a half-native, half-emulated mess.
- Emulated terminal resolving the wrong dotnet: Running
dotnetfrom an x64-emulated terminal (or an x64 VS Developer Prompt) can resolve the emulated SDK even when the ARM64 SDK is correctly installed.
How to fix it
Work through these in order — diagnose first, then act.
Fix 1: Install the native ARM64 .NET SDK
Start by ensuring the SDK itself is the right architecture — everything downstream depends on this.
- Uninstall any existing .NET SDK entries from Settings > Apps > Installed apps (note the architecture column — remove x64 SDKs you do not need).
- Go to Microsoft’s .NET download page and explicitly choose the ARM64 installer for Windows — do not accept the default x64 download.
- Run the installer and let it complete; restart your terminal afterwards so PATH changes take effect.
- In a new PowerShell window, run
dotnet --infoand check the RID line — it must read win-arm64, not win-x64. - Run
dotnet new console -o armtestthendotnet runinside it — a clean “Hello, World!” proves the SDK is functional.
Fix 2: Fix PATH order and architecture shadowing
When dotnet resolves to the wrong binary, the fix is PATH surgery, not reinstallation.
- In PowerShell, run
where.exe dotnet(orGet-Command dotnet | Select-Object Source) to see every dotnet on your PATH in resolution order. - The ARM64 SDK installs to
C:\Program Files\dotnetwhile the x64 SDK usesC:\Program Files (x86)\dotnet— note which appears first. - Open Settings > System > About > Advanced system settings > Environment Variables and edit the system Path.
- Move
C:\Program Files\dotnetabove any x86 dotnet entries — or remove the x64 entries entirely if you do not need emulated .NET. - Open a fresh terminal and re-run
where.exe dotnetanddotnet --infoto confirm the ARM64 SDK now wins.
Fix 3: Match runtimes to your projects’ target frameworks
“SDK works but my app won’t run” is a runtime mismatch, not an SDK problem. Align the installed runtimes with what your projects target.
- Run
dotnet --list-runtimesand note which versions and architectures are installed (look for Microsoft.NETCore.App entries with arm64). - Open your project’s
.csprojand check<TargetFramework>— e.g.net8.0needs the .NET 8 runtime. - If the matching runtime is missing, download the ARM64 runtime installer (or the full SDK, which includes runtimes) for that major version.
- For self-contained deployments, publish with
dotnet publish -r win-arm64 --self-containedso the app carries its own runtime. - Re-run the app and confirm the “must install .NET runtime” error is gone.
Fix 4: Handle native dependencies and NuGet packages
Builds succeed but the app crashes loading a native library — the package has no ARM64 binaries.
- Read the crash output for
BadImageFormatException— that exception name is the signature of an architecture mismatch in a native dependency. - Check the NuGet package page for an ARM64 or
win-arm64native asset; upgrade to a version that ships one. - If no ARM64 build exists, look for a managed-code alternative to the package that avoids native binaries entirely.
- As a temporary workaround, you can run the app under x64 emulation with the x64 runtime — expect noticeably slower performance.
- For your own native interop, compile the native component for ARM64 and place the DLL where the
win-arm64RID resolution expects it.
Fix 5: Fix Visual Studio’s ARM64 targeting
Command-line builds work but Visual Studio builds fail — the IDE is targeting the wrong architecture.
- In Visual Studio Installer, confirm you installed the .NET desktop development workload with ARM64 support, not just x64 components.
- In your solution, open Build > Configuration Manager and set the platform to ARM64 (create it via New if it is missing).
- Check the project’s debug settings — the Start action should launch the ARM64 dotnet host, not an emulated one.
- Clean the solution (Build > Clean Solution), delete
binandobjfolders, and rebuild to clear stale x64 artifacts. - Run from Visual Studio and confirm the process architecture in Task Manager shows ARM64, not x86 or x64 emulation.
Fix 6: Clean up mixed-architecture installs completely
When several partial fixes have stacked up, the reliable path is a full purge and a single clean ARM64 install.
- Uninstall every .NET SDK and runtime from Settings > Apps, both x64 and ARM64.
- Delete leftover folders:
C:\Program Files\dotnet(ARM64) andC:\Program Files (x86)\dotnet(x64) if they remain. - Remove all dotnet entries from the system PATH, then restart the laptop.
- Install only the ARM64 SDK for the .NET version you need, from Microsoft’s official download page.
- Verify with
dotnet --info(RID: win-arm64), then reinstall only the additional runtimes your projects need — ARM64 builds only.
Closing
.NET on ARM64 Windows is a first-class, native experience — the failures are almost never the framework itself but the wrong installer, PATH shadowing, or x64 native dependencies sneaking in. Keep one rule: ARM64 SDK, ARM64 runtimes, ARM64 NuGet natives, and verify with dotnet --info whenever something looks off. The one honest limitation is the native-dependency gap — if a package you need ships x64 binaries only, you either find an alternative or accept emulation. For installer and version questions, Microsoft’s Windows support hub
points to the current .NET download and ARM64 documentation.
