WebAssembly中.NET的CLR

时间:2019-06-25 14:57:05

标签: javascript .net blazor

我试图从.NET的角度理解WebAssembly的要点。

来自Blazor FAQ

  

相对较新的版本使得在浏览器中运行.NET成为可能   标准化的Web技术,称为WebAssembly。

那是一个奇怪的说法。

很明显,您可以在没有WebAssembly的情况下在浏览器中运行.NET代码,方法是将其交叉编译为JavaScript(例如,使用JSIL)。那太烂了,因为

  1. CLR的对象模型比JavaScript的对象模型复杂(例如,您可以创建紧凑的整数数组Uint8Array,但在JavaScript中不能包含更复杂的值类型),这使得某些类型的代码的转换非常容易效率低下。
  2. .NET的本机基库实现也需要用JavaScript实现,这是很多工作。
  3. 浏览器生态系统基于JavaScript,因此,如果您使用这种交叉编译,就会遇到麻烦。

所以FAQ的意思是现在它是实用的,对吧?

我很难看到WebAssembly如何在所有这些方面提供帮助。粗略地看一下,它的虚拟机仍然不应该能够有效地正确表示CLR(仍然没有复杂的值类型,对吗?)。而其他两点无论如何都会成立。

那么什么改变了? WebAssembly到底给表带来了什么,而仅靠JavaScript无法做到?难道仅仅是Webassembly是基于堆栈的,而JS本身不是吗?为什么那有什么大不了的?

编辑:对Henk的超级答案要不满意。对于感兴趣的人,我现在找到了a great rationale page

1 个答案:

答案 0 :(得分:3)

  

建议其虚拟机仍不能有效地正确表示CLR

正确。这就是Blazor首先部署Mono的编译为WASM版本的原因。 Blazor将自己的CLR带到了聚会上。

您的应用程序代码不会被编译为Wasm,它将部署为Mono执行的(常规)IL。使用开发工具,您可以看到一堆.DLL文件,这些文件正在下载到浏览器中。原则上,您可以使用适合浏览器安全沙箱的任何.net标准软件包。

  

WebAssembly究竟将什么带到表中,而仅靠JavaScript不可能做到?

它使C编译器可以将Mono。*。c编译为Mono.wasm。
而且速度很快。

相关问题