
NetWasm:面向 WebAssembly 的独立 .NET 方案
NetWasm 是一套独立的编译器、核心类库(CoreLib)、运行时及 SDK,旨在将 C# 和 .NET CIL 直接编译为 WebAssembly。该方案不依赖桌面版 CLR、Mono、dotnet.js 或应用程序 DLL,能够生成小巧且独立的 Wasm 应用。
C# 在 Wasm 体积上超越 Rust
在针对打印 42 的相同工作负载下,NetWasm 生成的包含精确 Compact 垃圾回收器的 WASI Preview 2 组件,原始体积为 47,895 字节。相比之下,采用尺寸优化配置的 Rust 1.95.0 产物为 53,635 字节。
数据显示,NetWasm 原始体积小 10.7%,经 Brotli-11 压缩后体积小 19.5%。作为参考,Kotlin 2.4.0 (wasmWasi) 和 TinyGo 0.39.0 的原始体积分别为 79,293 字节和 93,043 字节。需注意,此对比基于特定工作负载和配置,而非语言体系的整体排名。
性能表现优于 Mono AOT
在 Apple M1 Max 上使用 Wasmtime 49.0.3 进行的基准测试显示,NetWasm 在多项指标上优于由相同 C# 源代码编译并经 Wasmtime 运行的 Mono AOT (.NET 10):
- 完整事务处理:NetWasm 耗时 43.9 ms,较 Mono AOT 的 59.1 ms 减少 26%。
- 保留的对象图:NetWasm 耗时 8.8 ms,较 Mono AOT 的 14.2 ms 减少 38%。
- UI 变更:NetWasm 耗时 17.6 ms,较 Mono AOT 的 29.1 ms 减少 40%。
在前两项测试中,NetWasmGC 的耗时也低于桌面版 .NET 11 的 JIT;但在 UI 变更场景下,JIT (8.6 ms) 更快。桌面版 NativeAOT 在所有三项测试中均表现最快。
功能特性与技术架构
NetWasm 并非将桌面版 .NET 塞入 Wasm 沙箱,而是一个全新的平台。其核心特性包括:
- 封闭世界编译:仅链接可达代码和所需运行时支持,剔除不可达代码及导入项。
- 更小的平台契约:支持可移植 API,不包含广泛的运行时反射、动态程序集加载或
dynamic关键字。 - 现代生态支持:支持 C# 15、JavaScript 模块、Web Workers、静态
.a互操作、WIT/WASI P2、表达式树以及 HTTP/JSON/XML/Regex 等库。 - 开发体验:可通过标准
dotnetCLI 进行构建、运行和测试;支持双目标库(netwasm0.1和桌面版 .NET)。
灵活的内存分配策略
NetWasm 提供四种分配策略,用户可在项目文件中配置:
- Compact(默认):以大小为优先的精确非移动标记-清除收集器,适合小型应用和低变更率 UI。原始体积 47,895 字节。
- NetWasmGC:适合更高分配吞吐量。原始体积 50,855 字节。
- Bump:适合有界、一次性作业。原始体积 43,864 字节。
与传统 .NET Wasm 的对比
与启用 AOT、修剪和 IL 剥离的 Blazor WebAssembly 空 UI 应用相比,NetWasm 体积优势显著:
- NetWasm (Compact GC):47,895 字节(基准 1×)。
- Blazor WebAssembly (.NET 10):12,276,684 字节(约 256×)。
- Blazor WebAssembly (.NET 11 RC1):15,289,241 字节(约 319×)。
需注意,Blazor 体积包含原生运行时和 Webcil 程序集,而 NetWasm 包含其运行时、GC 和 WASI 组件,两者应用场景不同。
当前边界与路线图
NetWasm 目前处于 1.0 之前版本(最新为 0.10.0),主要限制包括:
- 不支持运行时反射、
dynamic、运行时程序集加载和托管线程。 - 尚未实现通用的
System.IO文件操作、原始套接字和子进程 API。 - wasm64 组件仍受上游工具链限制。
通往 1.0 的路线图涵盖更广泛的 WASI Preview 2 覆盖、全球化模式、表达式树完善、更快的增量开发循环以及稳定的平台契约。0.10.0 版本已重建垃圾回收器,移除 Boehm 收集器,显著提升了高分配负载下的性能和启动时间。
许可与使用
CoreLib、运行时库和模板采用 MIT 许可;编译器和开发者工具使用 NetWasm Community License 1.0;Compact 和 NetWasmGC 收集器采用 Apache-2.0 许可。社区许可对个人、教育、开源及小规模组织(员工少于 250 人且年收入低于 1000 万美元)免费。生成的应用程序可由作者选择许可证,无需遥测或技术强制执行。