NetWasm 是一个独立的工具链,旨在将 C# 和 .NET 公共中间语言 (CIL) 直接编译为 WebAssembly (Wasm) 和 WebAssembly 系统接口 (WASI) 组件。与标准的 .NET WebAssembly 实现不同,NetWasm 在生产制品中不包含桌面端公共语言运行时 (CLR)、Mono 或大型应用程序 DLL。相反,它采用“封闭世界”编译模型,编译器会识别可达代码,并仅链接应用程序所需的特定运行时支持。这种方法使其能够生成包含内置运行时和精确紧凑垃圾回收器的独立 WASI Preview 2 组件。

在比较“打印 42”工作负载的特定基准测试中,NetWasm 生成的原始 Wasm 组件为 47,895 字节。这一表现优于使用尺寸优化配置编译的 Rust 1.95.0 二进制文件,后者测得为 53,635 字节。当使用 Brotli-11 压缩时,NetWasm 制品降至 13,660 字节,而 Rust 二进制文件仍保持在 16,963 字节。该项目通过专门化泛型、使用已知的 JSON 和依赖注入契约而非运行时发现,以及从配置文件中排除动态程序集加载或“dynamic”关键字等广泛的运行时功能来实现这些结果。

一张柱状图,比较了 NetWasm、Rust、Kotlin/Wasm 和 TinyGo 在原始和 Brotli-11 压缩尺寸下的 WebAssembly 占用空间。
不同语言的 WebAssembly 二进制大小对比,突出了 NetWasm 相对于 Rust 和其他运行时的效率。github.com

此图表可视化了 NetWasm 在原始和压缩二进制大小上均优于 Rust 的特定基准测试结果。

然而,这些结果代表的是特定的、经过测量的负载,而非通用的语言级排名。NetWasm 配置是刻意受限的;它不支持原始套接字或子进程等完整系统 API,并排除了许多标准 .NET 功能,如命名文化全球化和托管线程。此外,虽然 NetWasm 与标准 Blazor WebAssembly(在类似工作负载中可能超过 15 兆字节)相比显著减少了占用空间,但它仍是一个专门的平台。该项目目前处于 1.0 之前的状态,路线图重点在于扩大 WASI Preview 2 的覆盖范围,并在达到稳定的 1.0 版本之前改进增量开发循环。

一张尺寸对比图,显示了 NetWasm 的占用空间与标准 Blazor WebAssembly 实现的对比。
NetWasm 的占用空间显著小于标准 Blazor WebAssembly,后者在类似工作负载中可能超过 15 兆字节。github.com

此图说明了 NetWasm 与标准 .NET Blazor WebAssembly 实现相比实现的巨大尺寸缩减。