Einleitung: Warum WebAssembly die Spielregeln für C#-Entwickler ändert
\n\nLange Zeit war die Webentwicklung ein Monopol von JavaScript. Mit dem Aufkommen von WebAssembly (Wasm) hat sich die Situation jedoch grundlegend geändert. Jetzt können C#-Entwickler ihren Code in ein binäres Format kompilieren, das im Browser mit nahezu nativer Geschwindigkeit ausgeführt wird. Dies eröffnet enorme Möglichkeiten: von der Portierung schwerer Algorithmen bis hin zur Erstellung vollwertiger SPA-Anwendungen mit Blazor.
\n\nIn diesem Artikel werden wir untersuchen, wie WebAssembly in Verbindung mit C# und .NET funktioniert, die wichtigsten Tools (Blazor, Wasmtime, Mono) betrachten und praktische Beispiele schreiben. Am Ende können Sie selbstständig C#-Code im Browser oder auf dem Server mit Wasm ausführen.
\n\nGrundlagen von WebAssembly und seine Integration mit C#
\n\nWas ist WebAssembly in einfachen Worten
\n\nWebAssembly ist ein Low-Level-Bytecode, der in einer virtuellen Maschine des Browsers ausgeführt wird. Es ersetzt JavaScript nicht, sondern arbeitet mit ihm zusammen. Die Hauptvorteile:
\n- \n
- Leistung: Binärcode wird 30-50% schneller ausgeführt als JS. \n
- Sicherheit: Isolierte Ausführungsumgebung. \n
- Portabilität: Dieselbe .wasm-Datei funktioniert in Chrome, Firefox, Safari und Edge. \n
Für C# wird die WebAssembly-Ökosystem durch mehrere Projekte realisiert: Blazor WebAssembly (Framework für UI), Mono Wasm Runtime (führt IL-Code aus) und Wasmtime (für serverseitige Szenarien).
\n\nWie C# in WebAssembly kompiliert wird
\n\nDer Prozess sieht so aus:
\n- \n
- Sie schreiben Code in C#. \n
- Der Compiler Roslyn wandelt ihn in IL (Intermediate Language) um. \n
- Die Mono Runtime (oder NativeAOT) übersetzt IL in WebAssembly. \n
- Der Browser lädt die .wasm-Datei und führt sie aus. \n
Wichtig: Es gibt zwei Ansätze – Interpretation über Mono (langsamer, aber einfacher) und AOT-Kompilierung (schneller, erfordert aber Konfiguration).
\n\nPraxis: Drei Möglichkeiten, C# in WebAssembly auszuführen
\n\n1. Blazor WebAssembly – für Weboberflächen
\n\nBlazor ermöglicht es, den Client-Teil in C# statt JavaScript zu schreiben. Der gesamte UI-Code und die Geschäftslogik werden in Wasm kompiliert.
\n\nBeispiel einer einfachen Komponente:
\n@page "/counter"\n<h3>Zähler: @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\nDieser Code wird im Browser ausgeführt. Blazor lädt automatisch die Mono Wasm Runtime und Ihre .wasm-Datei. Erstellen Sie zum Start ein Projekt:
\ndotnet new blazorwasm -o MyBlazorApp\ncd MyBlazorApp\ndotnet run\n\nErgebnis: Eine vollwertige SPA-Anwendung ohne eine einzige Zeile JavaScript.
\n\n2. Direkte Kompilierung in .wasm mit NativeAOT
\n\nWenn Sie eine bestimmte Funktion (kein UI) ausführen müssen, verwenden Sie NativeAOT – es kompiliert C# direkt in natives WebAssembly ohne Mono Runtime.
\n\nSchritte:
\n- \n
- Installieren Sie das SDK .NET 8+ und das Workload:
dotnet workload install wasm-tools\n - Erstellen Sie eine Konsolenanwendung: \n
dotnet new console -n WasmDemo\ncd WasmDemo\n\n- \n
- Ändern Sie die
.csproj-Datei, indem Sie die Wasm-Unterstützung hinzufügen: \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
- Schreiben Sie den Code: \n
using System;\n\npublic class Program\n{\n public static void Main()\n {\n