Introducción: por qué WebAssembly cambia las reglas del juego para los desarrolladores de C#
\n\nDurante mucho tiempo, el desarrollo web fue un monopolio de JavaScript. Sin embargo, con la llegada de WebAssembly (Wasm), la situación cambió drásticamente. Ahora, los desarrolladores de C# pueden compilar su código en un formato binario que se ejecuta en el navegador con una velocidad casi nativa. Esto abre enormes posibilidades: desde portar algoritmos pesados hasta crear aplicaciones SPA completas con Blazor.
\n\nEn este artículo, analizaremos cómo funciona WebAssembly junto con C# y .NET, revisaremos las herramientas clave (Blazor, Wasmtime, Mono) y escribiremos ejemplos prácticos. Al final, podrá ejecutar código C# de forma independiente en el navegador o en el servidor con Wasm.
\n\nFundamentos de WebAssembly y su integración con C#
\n\nQué es WebAssembly en términos sencillos
\n\nWebAssembly es un bytecode de bajo nivel que se ejecuta en una máquina virtual del navegador. No reemplaza a JavaScript, sino que funciona junto con él. Las principales ventajas son:
\n- \n
- Rendimiento: el código binario se ejecuta entre un 30-50% más rápido que JS. \n
- Seguridad: entorno de ejecución aislado. \n
- Portabilidad: el mismo archivo .wasm funciona en Chrome, Firefox, Safari y Edge. \n
Para el ecosistema C#, WebAssembly se implementa a través de varios proyectos: Blazor WebAssembly (framework para UI), Mono Wasm Runtime (ejecuta código IL) y Wasmtime (para escenarios de servidor).
\n\nCómo se compila C# a WebAssembly
\n\nEl proceso es el siguiente:
\n- \n
- Usted escribe código en C#. \n
- El compilador Roslyn lo convierte en IL (lenguaje intermedio). \n
- Mono Runtime (o NativeAOT) traduce IL a WebAssembly. \n
- El navegador carga el archivo .wasm y lo ejecuta. \n
Importante: existen dos enfoques: interpretación a través de Mono (más lento, pero más simple) y compilación AOT (más rápido, pero requiere configuración).
\n\nPráctica: tres formas de ejecutar C# en WebAssembly
\n\n1. Blazor WebAssembly — para interfaces web
\n\nBlazor permite escribir la parte del cliente en C# en lugar de JavaScript. Todo el código de UI y la lógica de negocio se compilan en Wasm.
\n\nEjemplo de un componente simple:
\n@page "/counter"\n<h3>Contador: @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\nEste código se ejecuta en el navegador. Blazor carga automáticamente Mono Wasm Runtime y su archivo .wasm. Para empezar, cree un proyecto:
\ndotnet new blazorwasm -o MyBlazorApp\ncd MyBlazorApp\ndotnet run\n\nResultado: una aplicación SPA completa sin una sola línea de JavaScript.
\n\n2. Compilación directa a .wasm con NativeAOT
\n\nSi necesita ejecutar una función específica (no UI), use NativeAOT — compila C# directamente a WebAssembly nativo sin Mono Runtime.
\n\nPasos:
\n- \n
- Instale el SDK .NET 8+ y la carga de trabajo:
dotnet workload install wasm-tools\n - Cree una aplicación de consola: \n
dotnet new console -n WasmDemo\ncd WasmDemo\n\n- \n
- Modifique
.csprojagregando soporte para 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
- Escriba el código: \n
using System;\n\npublic class Program\n{\n public static void Main()\n {\n