NetWasm: Onafhankelijke .NET voor WebAssembly en WASI

Formaatvergelijking: C# versus andere talen

Met de implementatie van een precieze Garbage Collector (GC) presteert C# via NetWasm momenteel beter dan Rust wat betreft de bestandsgrootte voor een specifieke "print-42" workload.

ToolchainRaw WasmBrotli 11Vergelijkingsrol
NetWasm, Compact GC47.895 B13.660 BWASI P2 Component; inclusief precieze GC
Rust 1.95.0, size profile53.635 B16.963 BVergelijkbare WASI P2 Component referentie
Kotlin 2.4.0 wasmWasi79.293 B22.655 BP1 context; GC geleverd door de host engine
TinyGo 0.39.093.043 B26.931 BP1 context; precieze GC geconfigureerd

NetWasm is 10,7% kleiner in ruwe vorm en 19,5% kleiner met Brotli-11 compressie vergeleken met Rust. Deze resultaten zijn gebaseerd op een specifieke workload en profiel, en zijn geen taalbrede ranglijst.

Prestaties: Sneller dan Mono AOT

In benchmarks voor allocatie en garbage-collection is NetWasm sneller dan Mono AOT, wanneer beide zijn gecompileerd vanuit dezelfde C#-bron en worden uitgevoerd door dezelfde Wasmtime-omgeving.

WorkloadNetWasm, NetWasmGCMono AOT, .NET 10Verschil
Volledige transactie43,9 ms59,1 ms26% sneller
Retained object graph8,8 ms14,2 ms38% sneller
UI churn17,6 ms29,1 ms40% sneller

Gemiddelden van 15 runs op een Apple M1 Max onder Wasmtime 49.0.3.

Functionaliteiten

NetWasm gaat verder dan eenvoudige "Hello World"-programma's. Het ondersteunt onder andere:

  • C# 15, JavaScript-modules en Web Workers.
  • Statische .a interop en WIT/WASI P2.
  • Expressietabellen (expression trees).
  • HTTP, JSON, XML, Regex.
  • Reflection-vrije Dependency Injection (DI).
  • TUnit/VSTest.
  • wasm64 en vier verschillende allocatiestrategieën.

Huidige mogelijkheden:

  • Projecten bouwen, uitvoeren, publiceren en testen via de standaard dotnet CLI.
  • C#-exports publiceren als getypeerde JavaScript-modules voor gebruik in pagina's of Web Workers.
  • Compatibele Wasm .a archieven koppelen en bounded C ABI marshalling genereren.
  • C#-bindings genereren vanuit WIT en standalone WASI P2 Components produceren.
  • Expressietabellen construeren en inspecteren zonder algemene runtime reflection.
  • Gebruik van onafhankelijk verpakte bibliotheken voor LINQ, HTTP, JSON, XML, Regex, Hashing en dependency-injection.
  • Bibliotheken dual-targeten voor zowel netwasm0.1 als desktop .NET.

Snelstart

Installatie en uitvoering

Installeer de .NET SDK 10.0.303 of nieuwer en voer de volgende commando's uit:

dotnet new install NetWasm.Templates
dotnet new netwasm-app -n HelloNetWasm
cd HelloNetWasm
dotnet restore
dotnet run
dotnet publish -c Release -o publish/local

Voer het gepubliceerde component uit met een compatibele WASI Preview 2 host, zoals Wasmtime:

wasmtime run publish/local/HelloNetWasm.wasm

Het gepubliceerde component is zelfvoorzienend wat betreft .NET, maar vereist nog steeds een WebAssembly-host. Projecten die C# 15 gebruiken, selecteren de .NET 11 SDK; eerdere versies kunnen bij .NET 10 blijven.

Hoe de compacte omvang wordt behouden

NetWasm compileert bereikbare programma's direct naar Wasm, specialiseert generics en koppelt alleen de benodigde runtime-ondersteuning.

  • Closed-world compilatie: Niet-bereikbare code, imports en runtime-functies worden niet opgenomen in het artifact.
  • Kleiner platformcontract: NetWasm ondersteunt portable API's in plaats van alle aannames van de desktop-runtime te reproduceren.
  • Geen brede runtime reflection: Runtime-typenamen, dynamisch laden van assemblies en het dynamic keyword maken geen deel uit van het profiel.
  • Gegenereerde boundaries: JSON, DI, WIT en native interop maken gebruik van bekende contracten in plaats van runtime discovery.
  • Optionele data en diagnostiek: Tijdzonegegevens, uitgebreide stack traces en andere deployment-data worden alleen toegevoegd indien geselecteerd.
  • Eén collector: Alleen de gekozen allocatiestrategie wordt gekoppeld.

Allocatiestrategieën

Gebruikers kunnen kiezen uit verschillende garbage-collectors in het .csproj bestand:

<PropertyGroup>
  <NetWasmGarbageCollector>NetWasm</NetWasmGarbageCollector>
</PropertyGroup>
StrategieBest passende use-caseRaw componentBrotli 11
Compact (default)Kleine applicaties en low-churn UI47.895 B13.660 B
NetWasmGCHogere allocatie-throughput50.855 B15.053 B
BumpBegrensde, one-shot taken43.864 B11.959 B
  • Compact: Een precieze, non-moving mark-and-sweep collector die prioriteit geeft aan formaat.
  • NetWasmGC: Geoptimaliseerd voor doorvoer.
  • Bump: Voor korte, specifieke taken.

Bibliotheken en Multi-targeting

Een bibliotheek geschreven voor het NetWasm-profiel moet ook bruikbaar zijn op desktop .NET.

dotnet new netwasm-lib -n MyLibrary

De template target zowel netwasm0.1 als net10.0, waardoor NuGet-assets voor beide platforms worden geproduceerd. Dit is expliciete multi-targeting; het is geen garantie dat willekeurige desktop-pakketten in omgekeerde richting werken.

Vergelijking met conventionele .NET Wasm

Voor een lege Blazor WebAssembly-applicatie die "42" print (met AOT, managed trimming, IL stripping, invariant globalization en size-focused native linking), is het verschil in omvang aanzienlijk:

AOT buildUncompressed WasmRelatief t.o.v. NetWasm
NetWasm, Compact GC47.895 B1×
Blazor WebAssembly, .NET 1012.276.684 B256×
Blazor WebAssembly, .NET 11 RC115.289.241 B319×

Opmerking: Blazor bevat de native runtime en vereiste Webcil-assemblies; NetWasm bevat zijn eigen runtime, GC en WASI-component.

Huidige status en beperkingen

NetWasm bevindt zich in de pre-1.0 fase. Het ondersteunde profiel is bruikbaar, maar contracten kunnen veranderen tussen minder versies.

  • Output: Standaard is dit een wasm32 WASI Preview 2 Component. wasm64 componenten worden momenteel geblokkeerd door upstream tooling.
  • Niet ondersteund: Runtime reflection, dynamic, runtime assembly loading en managed threading vallen buiten het profiel.
  • In ontwikkeling: Algemene System.IO.File/Directory/FileStream, raw sockets en subprocess API's zijn nog niet geïmplementeerd.

De weg naar 1.0

Het doel van NetWasm 1.0 is een nuttig, gedocumenteerd en stabiel kleiner platform. De belangrijkste focuspunten zijn:

  • Bredere WASI Preview 2 dekking.
  • Globaliseringsmodi en optionele cultuurgegevens.
  • Voltooiing van expression-trees.
  • Een snellere incrementele ontwikkelcyclus.
  • Een stabiel netwasm1.0 platform- en runtime-contract.
  • Productiediagnostiek en bredere host-kwalificatie.

Nieuw in NetWasm 0.10.0: De garbage collectors zijn herbouwd. Objecten hebben geen collector header meer en arrays zijn single allocations. De Boehm-collector is verwijderd.

Licenties

  • CoreLib, runtime-bibliotheken, templates en gegenereerde supportcode: MIT.
  • Compiler en developer tooling: NetWasm Community License 1.0.
  • Compact en NetWasmGC collectors: Apache-2.0.

De Community License is gratis voor kwalificerende individuen, onderwijs, open-source werk, evaluatie en organisaties met minder dan 250 werknemers en minder dan 10 miljoen USD jaaromzet. Commercieel gebruik via OEM of commerciële aanbiedingen vereist een aparte overeenkomst.