Introdução: por que o WebAssembly está mudando as regras do jogo para desenvolvedores C#
\n\nPor muito tempo, o desenvolvimento web foi monopólio do JavaScript. No entanto, com o surgimento do WebAssembly (Wasm), a situação mudou drasticamente. Agora, desenvolvedores C# podem compilar seu código em um formato binário que é executado no navegador com velocidade quase nativa. Isso abre enormes possibilidades: desde portar algoritmos pesados até criar aplicações SPA completas com Blazor.
\n\nNeste artigo, vamos analisar como o WebAssembly funciona em conjunto com C# e .NET, explorar as principais ferramentas (Blazor, Wasmtime, Mono) e escrever exemplos práticos. Ao final, você será capaz de executar código C# no navegador ou no servidor usando Wasm.
\n\nFundamentos do WebAssembly e sua integração com C#
\n\nO que é WebAssembly em termos simples
\n\nWebAssembly é um bytecode de baixo nível executado em uma máquina virtual do navegador. Ele não substitui o JavaScript, mas trabalha em conjunto com ele. Principais vantagens:
\n- \n
- Desempenho: o código binário é executado 30-50% mais rápido que JS. \n
- Segurança: ambiente de execução isolado. \n
- Portabilidade: o mesmo arquivo .wasm funciona em Chrome, Firefox, Safari e Edge. \n
Para o ecossistema C#, o WebAssembly é implementado através de vários projetos: Blazor WebAssembly (framework para UI), Mono Wasm Runtime (executa código IL) e Wasmtime (para cenários de servidor).
\n\nComo o C# é compilado para WebAssembly
\n\nO processo funciona assim:
\n- \n
- Você escreve código em C#. \n
- O compilador Roslyn o transforma em IL (linguagem intermediária). \n
- O Mono Runtime (ou NativeAOT) traduz o IL para WebAssembly. \n
- O navegador carrega o arquivo .wasm e o executa. \n
Importante: existem duas abordagens — interpretação via Mono (mais lenta, mas mais simples) e compilação AOT (mais rápida, mas requer configuração).
\n\nPrática: três maneiras de executar C# no WebAssembly
\n\n1. Blazor WebAssembly — para interfaces web
\n\nBlazor permite escrever a parte do cliente em C# em vez de JavaScript. Todo o código de UI e lógica de negócios são compilados para Wasm.
\n\nExemplo de um componente simples:
\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 é executado no navegador. O Blazor carrega automaticamente o Mono Wasm Runtime e seu arquivo .wasm. Para começar, crie um projeto:
\ndotnet new blazorwasm -o MyBlazorApp\ncd MyBlazorApp\ndotnet run\n\nResultado: uma aplicação SPA completa sem uma única linha de JavaScript.
\n\n2. Compilação direta para .wasm com NativeAOT
\n\nSe você precisa executar uma função específica (não UI), use NativeAOT — ele compila C# diretamente para WebAssembly nativo sem o Mono Runtime.
\n\nPassos:
\n- \n
- Instale o SDK .NET 8+ e o workload:
dotnet workload install wasm-tools\n - Crie um aplicativo de console: \n
dotnet new console -n WasmDemo\ncd WasmDemo\n\n- \n
- Modifique o
.csproj, adicionando suporte a 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
- Escreva o código: \n
using System;\n\npublic class Program\n{\n public static void Main()\n {\n