.NET程序现可直接调用WebAssembly模块

Bytecode Alliance发布的Wasmtime现在添加加.NET Core API,而这项更新的意思,代表开发人员将可直接在.NET程序中,加载WebAssembly程序代码。Wasmtime是小型高性能的WebAssembly Runtime,目前这个新API正在初期预览阶段。

Bytecode Alliance是Mozilla、Fastly、英特尔和红帽共同组成的WebAssembly联盟,要通过共同提案并实例新标准,来推动WebAssembly在浏览器之外的应用。Mozilla提到,之所以.NET Core已经是一个跨平台的Runtime,仍然要支持WebAssembly,主要有3项好处,除了可跨平台共享更多程序代码之外,还能安全地隔离不受信任程序代码,同时也能因WebAssembly接口类型(WebAssembly Interface Types),使WebAssembly和.NET可相互传递复杂类型。

虽然.NET可以构建跨平台应用程序,但是要使用诸如C或是Rust等原生函数库,却仍然相当不方便,需要函数库为每个平台发布特定的函数库版本,不过,WebAssembly却可以扮演桥梁的角色,简单地满足这项需求。原生函数库能够先编译成WebAssembly,则许多平台包括.NET,就能使用这些WebAssembly模块,这将能简化函数库的发布以及应用程序相依于这些函数库的方式。

由于WebAssembly是为网页设计,而网页是一种每次访问网站,都会执行不受信任程序代码的环境,WebAssembly模块只能调用从主机环境明确输入的外部函数,而且也只能访问主机所分配的内存区域,而这样的沙盒程序代码设计,也能被应用在.NET中增加程序安全性。

Mozilla提到,过去.NET Framework曾经尝试要将不受信任程序代码沙盒化,但是最终无论是程序代码访问安全性(Code Access Security)或是应用程序域(Application Domains)等技术,都无法正确隔离程序代码,因此微软最后在.NET Core中把沙盒移除。而通过支持WebAssembly,.NET Core也可应用沙盒执行不受信任程序代码。

另外,最近Bytecode Alliance力推的WebAssembly接口类型,增加WebAssembly与其他语言的互通性,而.NET Core也将能得到这项好处,Mozilla表示,WebAssembly接口类型简化应用程序与WebAssembly模块间来回传递复杂类型所需要的黏合程序代码。当Wasmtime的.NET API最终实例接口类型,将可让WebAssembly和.NET之间无缝地传递复杂类型。

Wasmtime新加入的这个.NET Core API还在预览阶段,Bytecode Alliance成员仍积极开发中,更新将不保证向后兼容,目前Bytecode Alliance的第一目标是让Wasmtime更为稳定,因此不建议开发者将Wasmtime的.NET Core API用于正式产品开发。