zion-sati /
netwasm
NetWasm 是面向 WebAssembly 和 WASI 的独立 .NET 编译器和运行时。编译器前端用 Roslyn 把 C# 编译成 CIL,再由 NetWasm 把 CIL 编译成 Wasm。CoreLib 和运行时也是独立实现,最终产物不依赖 CoreCLR 或 Mono,也不带 dotnet.js 和独立应用 DLL。 想做的事很简单:保留 C# 的泛型、异常处理和自动内存管理,同时让程序只带上实际用到的部分。 体积实测 …
zion-sati /
NetWasm 是面向 WebAssembly 和 WASI 的独立 .NET 编译器和运行时。编译器前端用 Roslyn 把 C# 编译成 CIL,再由 NetWasm 把 CIL 编译成 Wasm。CoreLib 和运行时也是独立实现,最终产物不依赖 CoreCLR 或 Mono,也不带 dotnet.js 和独立应用 DLL。 想做的事很简单:保留 C# 的泛型、异常处理和自动内存管理,同时让程序只带上实际用到的部分。 体积实测 …
NetWasm 是面向 WebAssembly 和 WASI 的独立 .NET 编译器和运行时。编译器前端用 Roslyn 把 C# 编译成 CIL,再由 NetWasm 把 CIL 编译成 Wasm。CoreLib 和运行时也是独立实现,最终产物不依赖 CoreCLR 或 Mono,也不带 dotnet.js 和独立应用 DLL。 想做的事很简单:保留 C# 的泛型、异常处理和自动内存管理,同时让程序只带上实际用到的部分。 体积实测 同样是 Console.WriteLine(42),两种编译方案的结果如下: | 编译方案 | 未压缩 Wasm 体积 | | --- | ---: | | NetWasm | 82.5 KiB | | .NET 11 RC1 Blazor WebAssembly AOT | 14.58 MiB | 后者约为前者的 181 倍。NetWasm 的数字已经包含运行时和精确 GC;Blazor 这边用 Release 发布,开了完整裁剪、AOT 后 IL 剥离,以及面向体积的编译和链接优化。 这里比的是同一段输出逻辑在两种技术栈下的 Wasm 体积。NetWasm 输出的是 WASI 组件,Blazor 这边统计的是浏览器实际加载的原生 Wasm 和 Webcil 程序集;两边都不含 JavaScript、HTML 和 Wasm 宿主。 完整测试配置与复现说明 不止 Hello World 也做了一个可以直接用的应用:Regex Storm with NetWasm。 它用的是 .NET 自己的正则表达式引擎,编译成 Wasm 后在浏览器里提供匹配、捕获组查看、替换和分割,不是拿 JavaScript 正则模拟。Wasm 文件经 Brotli 压缩后约 325 KB,不含页面其他资源。正则和待处理文本都在本地处理,不上传后端,整个应用可以部署成静态网站。 另外还有 NetWasm Playground,可以直接编辑、编译、运行 C#。编译也在浏览器本地完成,不会把代码提交到服务器,不用先装工具链。 当前状态 项目还没到 1.0,兼容性仍在完善。采用闭世界编译,通用运行时反射是明确不支持的设计取舍,不是以后要补的功能。 许可方面,CoreLib、运行时库和模板等是 MIT 许可;编译器和开发工具用 NetWasm Community License,源码可看,但不是 MIT。 中文介绍:嫌 .NET Wasm 太大?我重写了编译器和运行时 欢迎拿实际用的 C# 代码来试,反馈兼容性问题。
讨论这个产品