Upgrading Copilot Studio to .NET 10 WebAssembly: A Step-by-Step Guide

By ✦ min read

Introduction

If you're running Copilot Studio on .NET 8 WebAssembly, moving to .NET 10 can unlock significant performance improvements and simplify your build pipeline. This guide walks you through the exact process that the Copilot Studio team used to upgrade their .NET WASM engine. You'll learn how to update your project, remove manual asset-fingerprinting scripts, take advantage of automatic AOT stripping, and even optimize a dual-engine (JIT + AOT) packaging strategy. By the end, you'll have a faster, leaner web application that runs C# directly in the browser.

Upgrading Copilot Studio to .NET 10 WebAssembly: A Step-by-Step Guide
Source: devblogs.microsoft.com

What You Need

Step-by-Step Guide

Step 1: Update Your Target Framework

Open every .csproj file in your solution and change the TargetFramework from net8.0 to net10.0. For example:

<TargetFramework>net10.0</TargetFramework>

Save all files. This is the primary change – the .NET 10 SDK will automatically use the new WebAssembly runtime and tooling.

Step 2: Verify Dependency Compatibility

Run dotnet restore and look for any NuGet packages that are not compatible with .NET 10. Update packages that have newer versions targeting .NET 10. For Copilot Studio, the team found that most packages worked without issues, but you should check each one. If a package doesn't have a .NET 10 build, see if the .NET 8 build still works – often it does, but test carefully.

Step 3: Remove Custom Asset Fingerprinting

In .NET 10, automatic fingerprinting of WASM assets is built in. That means you can delete any custom scripts you used for this purpose. Specifically:

Now, when you publish, each asset's filename will include a unique fingerprint. Cache-busting and integrity validation happen out of the box. Your existing caching logic will still work because the fingerprinted URLs are new.

Step 4: Enable AOT with Default Stripping

.NET 10 sets WasmStripILAfterAOT to true by default for AOT builds. This means after ahead-of-time compiling your .NET code to WebAssembly, the original Intermediate Language (IL) is removed from the published output, reducing download size. If you were using AOT in .NET 8, you may have had to explicitly set this property. Now you can simply ensure your project file includes <RunAOTCompilation>true</RunAOTCompilation>. The stripping happens automatically.

If you use a dual-engine strategy (JIT + AOT, as Copilot Studio does), note that stripped AOT assemblies will no longer be bit-for-bit identical with their JIT counterparts. This prevents file deduplication between the two modes. To handle this, proceed to Step 5.

Upgrading Copilot Studio to .NET 10 WebAssembly: A Step-by-Step Guide
Source: devblogs.microsoft.com

Step 5: Optimize Dual Engine Packaging (Optional)

Copilot Studio ships a single NPM package containing both a JIT engine (for fast startup) and an AOT engine (for maximum execution speed). At runtime, they load in parallel: the JIT engine handles initial interactions while the AOT engine compiles, then control hands off. Because WasmStripILAfterAOT makes AOT assemblies different from JIT ones, you can no longer deduplicate identical files. To keep your package size manageable:

This approach still gives you the best of both worlds without excessive duplication.

Step 6: Deploy and Validate

Publish your app using dotnet publish -c Release. Deploy the output to your hosting environment (e.g., Azure Static Web Apps, CDN). Test thoroughly:

Tips

Tags:

Recommended

Discover More

10 Surprising Facts About Ford's Embrace of Combustion Engines in F1New AI Plugin 'Destiny' Brings Ancient East Asian Astrology to Claude CodeData-Driven Overhaul in Gifted Education: Schools Embrace Inclusive Identification Amid Equity PushWhy Border Searches of Phones and Laptops Should Require a Warrant: Key Questions AnsweredBritish Cybercriminal 'Tylerb' Admits Role in Scattered Spider's Sophisticated Phishing and Crypto Thefts