Introduction : pourquoi WebAssembly change la donne pour les développeurs C#
\n\nPendant longtemps, le développement web a été le monopole de JavaScript. Cependant, avec l'arrivée de WebAssembly (Wasm), la situation a radicalement changé. Désormais, les développeurs C# peuvent compiler leur code dans un format binaire qui s'exécute dans le navigateur avec une vitesse quasi native. Cela ouvre d'immenses possibilités : du portage d'algorithmes lourds à la création d'applications SPA complètes avec Blazor.
\n\nDans cet article, nous allons voir comment WebAssembly fonctionne avec C# et .NET, examiner les outils clés (Blazor, Wasmtime, Mono) et écrire des exemples pratiques. À la fin, vous serez capable d'exécuter vous-même du code C# dans le navigateur ou sur un serveur avec Wasm.
\n\nFondamentaux de WebAssembly et son intégration avec C#
\n\nQu'est-ce que WebAssembly en termes simples
\n\nWebAssembly est un bytecode bas niveau qui s'exécute dans une machine virtuelle du navigateur. Il ne remplace pas JavaScript, mais fonctionne avec lui. Les principaux avantages :
\n- \n
- Performance : le code binaire s'exécute 30 à 50 % plus vite que le JS. \n
- Sécurité : environnement d'exécution isolé. \n
- Portabilité : un même fichier .wasm fonctionne dans Chrome, Firefox, Safari et Edge. \n
Pour C#, l'écosystème WebAssembly est implémenté via plusieurs projets : Blazor WebAssembly (framework pour l'interface utilisateur), Mono Wasm Runtime (exécute le code IL) et Wasmtime (pour les scénarios serveur).
\n\nComment C# est compilé en WebAssembly
\n\nLe processus se déroule ainsi :
\n- \n
- Vous écrivez du code en C#. \n
- Le compilateur Roslyn le transforme en IL (langage intermédiaire). \n
- Mono Runtime (ou NativeAOT) traduit l'IL en WebAssembly. \n
- Le navigateur charge le fichier .wasm et l'exécute. \n
Important : il existe deux approches — l'interprétation via Mono (plus lente, mais plus simple) et la compilation AOT (plus rapide, mais nécessite une configuration).
\n\nPratique : trois façons d'exécuter C# dans WebAssembly
\n\n1. Blazor WebAssembly — pour les interfaces web
\n\nBlazor permet d'écrire la partie cliente en C# au lieu de JavaScript. Tout le code UI et la logique métier sont compilés en Wasm.
\n\nExemple d'un composant simple :
\n@page "/counter"\n<h3>Compteur : @currentCount</h3>\n<button @onclick="IncrementCount">+1</button>\n\n@code {\n private int currentCount = 0;\n\n private void IncrementCount()\n {\n currentCount++;\n }\n}\n\nCe code s'exécute dans le navigateur. Blazor charge automatiquement Mono Wasm Runtime et votre fichier .wasm. Pour démarrer, créez un projet :
\ndotnet new blazorwasm -o MyBlazorApp\ncd MyBlazorApp\ndotnet run\n\nRésultat : une application SPA complète sans une seule ligne de JavaScript.
\n\n2. Compilation directe en .wasm avec NativeAOT
\n\nSi vous devez exécuter une fonction spécifique (pas d'UI), utilisez NativeAOT — il compile le C# directement en WebAssembly natif sans Mono Runtime.
\n\nÉtapes :
\n- \n
- Installez le SDK .NET 8+ et le workload :
dotnet workload install wasm-tools\n - Créez une application console : \n
dotnet new console -n WasmDemo\ncd WasmDemo\n\n- \n
- Modifiez le fichier
.csprojen ajoutant le support Wasm : \n
<PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <RuntimeIdentifier>browser-wasm</RuntimeIdentifier>\n <UseNativeAot>true</UseNativeAot>\n</PropertyGroup>\n\n- \n
- Écrivez le code : \n
using System;\n\npublic class Program\n{\n public static void Main()\n {\n