NetWasm is een gespecialiseerde toolchain (compiler, runtime en SDK) die C# en .NET CIL direct vertaalt naar WebAssembly (Wasm), zonder dat er een zware runtime zoals Mono of de desktop CLR nodig is.
Belangrijkste kenmerken:
- Efficiëntie: Het produceert aanzienlijk kleinere bestanden dan traditionele oplossingen zoals Blazor WebAssembly en presteert in bepaalde benchmarks sneller dan Mono AOT.
- Techniek: Door gebruik te maken van 'closed-world compilatie' en het weglaten van brede runtime reflection, wordt de omvang van de artifacten geminimaliseerd.
- Functionaliteiten: Ondersteunt C# 15, WASI Preview 2, diverse garbage-collection strategieën (Compact, NetWasmGC en Bump) en biedt integratie met de standaard
dotnet CLI.
- Multi-targeting: Bibliotheken kunnen gelijktijdig worden ontwikkeld voor zowel
netwasm0.1 als desktop .NET.
Het project bevindt zich momenteel in de pre-1.0 fase, met een focus op het stabiliseren van het platform-contract en het uitbreiden van de WASI-ondersteuning.
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.
| Toolchain | Raw Wasm | Brotli 11 | Vergelijkingsrol |
| NetWasm, Compact GC | 47.895 B | 13.660 B | WASI P2 Component; inclusief precieze GC |
| Rust 1.95.0, size profile | 53.635 B | 16.963 B | Vergelijkbare WASI P2 Component referentie |
| Kotlin 2.4.0 wasmWasi | 79.293 B | 22.655 B | P1 context; GC geleverd door de host engine |
| TinyGo 0.39.0 | 93.043 B | 26.931 B | P1 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.
| Workload | NetWasm, NetWasmGC | Mono AOT, .NET 10 | Verschil |
| Volledige transactie | 43,9 ms | 59,1 ms | 26% sneller |
| Retained object graph | 8,8 ms | 14,2 ms | 38% sneller |
| UI churn | 17,6 ms | 29,1 ms | 40% 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>
| Strategie | Best passende use-case | Raw component | Brotli 11 |
| Compact (default) | Kleine applicaties en low-churn UI | 47.895 B | 13.660 B |
| NetWasmGC | Hogere allocatie-throughput | 50.855 B | 15.053 B |
| Bump | Begrensde, one-shot taken | 43.864 B | 11.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 build | Uncompressed Wasm | Relatief t.o.v. NetWasm |
| NetWasm, Compact GC | 47.895 B | 1× |
| Blazor WebAssembly, .NET 10 | 12.276.684 B | 256× |
| Blazor WebAssembly, .NET 11 RC1 | 15.289.241 B | 319× |
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.
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.
| Toolchain | Raw Wasm | Brotli 11 | Vergelijkingsrol |
| NetWasm, Compact GC | 47.895 B | 13.660 B | WASI P2 Component; inclusief precieze GC |
| Rust 1.95.0, size profile | 53.635 B | 16.963 B | Vergelijkbare WASI P2 Component referentie |
| Kotlin 2.4.0 wasmWasi | 79.293 B | 22.655 B | P1 context; GC geleverd door de host engine |
| TinyGo 0.39.0 | 93.043 B | 26.931 B | P1 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.
| Workload | NetWasm, NetWasmGC | Mono AOT, .NET 10 | Verschil |
| Volledige transactie | 43,9 ms | 59,1 ms | 26% sneller |
| Retained object graph | 8,8 ms | 14,2 ms | 38% sneller |
| UI churn | 17,6 ms | 29,1 ms | 40% 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>
| Strategie | Best passende use-case | Raw component | Brotli 11 |
| Compact (default) | Kleine applicaties en low-churn UI | 47.895 B | 13.660 B |
| NetWasmGC | Hogere allocatie-throughput | 50.855 B | 15.053 B |
| Bump | Begrensde, one-shot taken | 43.864 B | 11.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 build | Uncompressed Wasm | Relatief t.o.v. NetWasm |
| NetWasm, Compact GC | 47.895 B | 1× |
| Blazor WebAssembly, .NET 10 | 12.276.684 B | 256× |
| Blazor WebAssembly, .NET 11 RC1 | 15.289.241 B | 319× |
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.