{"id":4005,"date":"2026-05-07T17:03:45","date_gmt":"2026-05-07T17:03:45","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/05\/07\/copilot-studio-gets-faster-with-net-10-on-webassembly\/"},"modified":"2026-05-07T17:03:45","modified_gmt":"2026-05-07T17:03:45","slug":"copilot-studio-gets-faster-with-net-10-on-webassembly","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/05\/07\/copilot-studio-gets-faster-with-net-10-on-webassembly\/","title":{"rendered":"Copilot Studio gets faster with .NET 10 on WebAssembly"},"content":{"rendered":"<p>A few months ago, we shared <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/copilot-studio-dotnet-wasm\/\">How Copilot Studio uses .NET and WebAssembly for performance and innovation<\/a>, describing how <a href=\"https:\/\/www.microsoft.com\/microsoft-365-copilot\/microsoft-copilot-studio\/\">Microsoft Copilot Studio<\/a> runs C# in the browser via .NET WebAssembly (WASM) and the gains the team measured after moving from .NET 6 to .NET 8. Since then, the Copilot Studio team has upgraded their .NET WASM engine to .NET 10. This post is a quick look at how the upgrade went and what it delivered.<\/p>\n<h2>A smooth upgrade<\/h2>\n<p>Moving an existing .NET 8 WASM application to .NET 10 is largely a matter of updating the target framework in the <code>.csproj<\/code> files and ensuring all dependencies are compatible with the new version. For Copilot Studio, that\u2019s exactly how the migration went, and the .NET 10 build is now running in production.<\/p>\n<h2>Automatic fingerprinting simplifies deployment<\/h2>\n<p>One of the most welcome changes in .NET 10 for WebAssembly applications is automatic fingerprinting of WASM assets. When you publish a WebAssembly app, each asset\u2019s filename now includes a unique identifier, providing both cache-busting and integrity guarantees without any manual intervention.<\/p>\n<p>Previously, Copilot Studio (like many WASM apps) had to:<\/p>\n<ul>\n<li>Read the published <code>blazor.boot.json<\/code> manifest to enumerate assets.<\/li>\n<li>Run a custom PowerShell script to rename each file with an appended SHA256 hash.<\/li>\n<li>Pass an explicit <code>integrity<\/code> argument from JavaScript when requesting each resource.<\/li>\n<\/ul>\n<p>In .NET 10, all of that goes away. Resources are imported directly from <code>dotnet.js<\/code>, fingerprints are part of the published filenames, and integrity is validated automatically. The team was able to delete the custom renaming script and remove the <code>integrity<\/code> argument from the client-side resource loader. Existing caching and validation logic on top of these resources continues to work unchanged.<\/p>\n\n<div class=\"alert alert-success\">\n<p class=\"alert-divider\"><i class=\"fabric-icon fabric-icon--Lightbulb\"><\/i><strong>Tip<\/strong><\/p>\n<p>If you load the .NET WASM runtime inside a <code>WebWorker<\/code>, set <code>dotnetSidecar = true<\/code> when initializing to ensure proper initialization in a worker context.<\/p><\/div>\n<h2>Smaller AOT output with <code>WasmStripILAfterAOT<\/code><\/h2>\n<p>The other headline change for .NET WASM in .NET 10 is that <code>WasmStripILAfterAOT<\/code> is now enabled by default for AOT builds. After ahead-of-time compiling .NET methods to WebAssembly, the original Intermediate Language (IL) for those methods is no longer needed at runtime, so .NET 10 strips it out of the published output by default. In .NET 8 this setting existed but defaulted to <code>false<\/code>.<\/p>\n<p>Copilot Studio uses a slightly more advanced packaging strategy. To get the best of both startup time and steady-state performance, it ships a single NPM package that contains both a JIT engine (for fast startup) and an AOT engine (for maximum execution speed). At runtime, Copilot Studio loads JIT and AOT in parallel; the JIT engine handles initial interactions, then control hands off to AOT once it\u2019s ready. Files that are bit-for-bit identical between the two modes are deduplicated to keep the package small.<\/p>\n<p>Because <code>WasmStripILAfterAOT<\/code> produces AOT assemblies that no longer match their JIT counterparts, fewer files can be shared between the two engines:<\/p>\n<ul>\n<li>On .NET 8, 59 files were shared between the JIT and AOT engines.<\/li>\n<li>On .NET 10, only 22 files are shared.<\/li>\n<\/ul>\n<p>The net effect on the Copilot Studio package is roughly a 15% size increase. In practice the impact on end users is small because the JIT engine is still what they download and run first, so initial interactivity is unaffected. The AOT download is around 6% (~200 ms) slower on a fast LAN and around 17% (~5 s) slower on a 4G connection, all happening in the background after the app is already responsive.<\/p>\n<p>The runtime benefits clearly outweigh the packaging cost for Copilot Studio\u2019s workloads:<\/p>\n<ul>\n<li><strong>~20% faster<\/strong> execution on the first call (cold path).<\/li>\n<li><strong>~5% faster<\/strong> execution on subsequent calls (warm path).<\/li>\n<\/ul>\n<p><img data-opt-id=897686602  fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/05\/copilot-studio-net10-execution-time.webp\" alt=\"Chart comparing .NET 8 vs .NET 10 execution time for small and big bots on cold and warm starts\" \/><\/p>\n<p>These gains are most visible in large, complex agents \u2014 the \u201cbig bots\u201d scenarios where AOT-compiled code does the heavy lifting.<\/p>\n<h2>Try .NET 10 for your WebAssembly apps<\/h2>\n<p>If you\u2019re running a Blazor or .NET WebAssembly application on .NET 8, .NET 10 is well worth trying:<\/p>\n<ul>\n<li>Update your project\u2019s <code>&lt;TargetFramework&gt;<\/code> to <code>net10.0<\/code> and refresh your <code>Microsoft.AspNetCore.*<\/code>, <code>Microsoft.Extensions.*<\/code>, and <code>System.*<\/code> package references.<\/li>\n<li>Remove any custom asset renaming or <code>integrity<\/code> plumbing \u2014 fingerprinting is now built in.<\/li>\n<li>If you AOT-compile, you\u2019ll automatically benefit from the new <code>WasmStripILAfterAOT<\/code> default.<\/li>\n<\/ul>\n<p>Need help getting your apps to the latest version of .NET? <a href=\"https:\/\/learn.microsoft.com\/dotnet\/core\/porting\/github-copilot-app-modernization\/overview\">GitHub Copilot app modernization for .NET<\/a> can analyze your solution, plan the upgrade, and apply the necessary changes for you. Learn more about modernizing your .NET applications at <a href=\"https:\/\/dotnet.microsoft.com\/platform\/modernize\">dotnet.microsoft.com\/platform\/modernize<\/a>.<\/p>\n<p>Copilot Studio\u2019s upgrade is one more example of how each release of .NET continues to make WebAssembly faster, smaller, and simpler to ship.<\/p>\n<p>Special thanks to <strong>Denis Voituron<\/strong> from the Copilot Studio team for sharing the migration details and performance data that made this post possible.<\/p>\n<p>The post <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/copilot-studio-dotnet-10-migration\/\">Copilot Studio gets faster with .NET 10 on WebAssembly<\/a> appeared first on <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\">.NET Blog<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>A few months ago, we shared How Copilot Studio uses .NET and WebAssembly for performance and innovation, describing how Microsoft [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4006,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[7],"tags":[],"class_list":["post-4005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/4005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=4005"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/4005\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media\/4006"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=4005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=4005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=4005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}