ASP.NET Core Blazor WebAssembly 生成工具和预先 (AOT) 编译

注意

此版本不是本文的最新版本。 对于当前版本,请参阅本文的 .NET 9 版本

警告

此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 NET Core 支持策略。 对于当前版本,请参阅本文的 .NET 9 版本

重要

此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

对于当前版本,请参阅本文的 .NET 9 版本

本文介绍独立 Blazor WebAssembly 应用的生成工具,以及如何在部署前使用预先 (AOT) 编译来编译应用。

.NET WebAssembly 生成工具

.NET WebAssembly 生成工具基于 Emscripten,这是一个用于 Web 平台的编译器工具链。

若要将生成工具安装为 .NET 工作负载 ,请使用以下 任一方法:

  • 对于 Visual Studio 安装程序中的 ASP.NET 和 Web 开发工作负载,请从可选组件列表中选择“.NET WebAssembly 生成工具”选项。 该选项确保满足以下条件:

    • 为最新版 .NET SDK 安装工作负载。
    • 当新版本的 Visual Studio 发布并包含新的 .NET SDK 时,该选项将安装新 SDK 的工作负载。
  • 或者,在 管理命令行界面 中执行以下命令,将最新的工作负载安装到系统上可用的最新 .NET SDK:

    dotnet workload install wasm-tools
    

若要使用指定的 .NET SDK 以针对早期的 .NET 版本,请安装 wasm-tools-net{MAJOR VERSION} 工作负载:

  • 占位符 {MAJOR VERSION} 将替换为您要面向的 .NET 发布版的主版本号(例如,wasm-tools-net8 表示 .NET 8)。
  • 每个 .NET SDK 都安装有工作负载。 为一个 SDK 安装wasm-tools工作负荷不会使其在系统中的其他 SDK 可用。
  • 必须为要使用的每个 .NET SDK 版本安装适当的工作负荷。

以下列表显示要为每个 .NET SDK 安装哪些工作负荷,具体取决于你计划面向的应用。 尽管多个行可能包含相同的工作负荷名称,但对于每个特定的 .NET SDK,工作负荷始终略有不同。

  • 使用 .NET 9 SDK
    • 面向 .NET 9 需要 wasm-tools
    • 面向 .NET 8 需要 wasm-tools-net8
  • 使用 .NET 8 SDK:面向 .NET 8 需要 wasm-tools

预先 (AOT) 编译

Blazor WebAssembly 支持预先 (AOT) 编译,你可以直接将 .NET 代码编译到 WebAssembly 中。 AOT 编译会提高运行时性能,代价是应用大小增加。

如果没有启用 AOT 编译,则 Blazor WebAssembly 应用使用在 WebAssembly 中实现的 .NET 中间语言 (IL) 解释器在浏览器上运行,该解释器包括部分即时 (JIT) 运行时支持(其非正式名称为 Jiterpreter)。 由于 .NET IL 代码已经过解释,因此应用的运行速度通常比在没有任何 IL 解释的服务器端 .NET JIT 运行时上要慢。 AOT 编译将应用的 .NET 代码直接编译到 WebAssembly 中来供浏览器进行本机 WebAssembly 执行,从而处理这一性能问题。 AOT 性能改进可使执行 CPU 密集型任务的应用得到极大改进。 使用 AOT 编译的缺点是,AOT 编译的应用通常比其 IL 解释的对应项要长,因此通常在被首次请求时,下载到客户端的速度通常更慢。

如果没有启用 AOT 编译,则 Blazor WebAssembly 应用使用在 WebAssembly 中实现的 .NET 中间语言 (IL) 解释器在浏览器上运行。 由于 .NET 代码已经过解释,因此应用的运行速度通常比在服务器端 .NET 即时 (JIT) 运行时上要慢。 AOT 编译将应用的 .NET 代码直接编译到 WebAssembly 中来供浏览器进行本机 WebAssembly 执行,从而处理这一性能问题。 AOT 性能改进可使执行 CPU 密集型任务的应用得到极大改进。 使用 AOT 编译的缺点是,AOT 编译的应用通常比其 IL 解释的对应项要长,因此通常在被首次请求时,下载到客户端的速度通常更慢。

有关安装 .NET WebAssembly 生成工具的指导,请参阅 ASP.NET Core Blazor WebAssembly 生成工具和预先 (AOT) 编译

若要启用 WebAssembly AOT 编译,请将设置为 <RunAOTCompilation>true 属性添加到 Blazor WebAssembly 应用的项目文件中:

<PropertyGroup>
  <RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>

若要将应用编译到 WebAssembly,请发布应用。 发布 Release 配置可确保 .NET 中间语言 (IL) 链接也运行来减少已发布的应用的大小:

dotnet publish -c Release

仅当项目发布时,才执行 WebAssembly AOT 编译。 在开发期间(Development 环境)运行项目时,不会使用 AOT 编译,理由是 AOT 编译处理小项目时通常用时几分钟,而处理更大项目时,耗时可能长得多。 对于未来版本的 ASP.NET Core,正在开发减少 AOT 编译生成时间的功能。

AOT 编译的 Blazor WebAssembly 应用的大小通常比编译到 .NET IL 中的应用大小要大:

  • 虽然大小差异取决于应用,则大多数 AOT 编译的应用大约是其 IL 编译的版本的两倍大。 这意味着使用 AOT 编译是用加载时间性能换取运行时性能。 使用 AOT 编译是否值得进行这种权衡取决于你的应用。 Blazor WebAssembly CPU 密集型应用通常最能从 AOT 编译中获益。

  • AOT 编译的应用大小较大,是由于两个条件导致的:

    • 需要更多代码来表示本机 WebAssembly 中的高级 .NET IL 指令。
    • AOT 在发布应用时不会剔除托管 DLL。 Blazor 需要这些 DLL 提供反射元数据支持和某些 .NET 运行时功能。 在客户端上要求使用 DLL 会增加下载大小,但会提供更兼容的 .NET 体验。

注意

有关 Mono/WebAssembly 的 MSBuild 属性和目标,请参见WasmApp.Common.targetsdotnet/runtime GitHub 仓库)。 根据文档 Blazor MSBuild 配置选项 (dotnet/docs #27395) 计划常见 MSBuild 属性的官方文档。

性能

有关性能指南,请参阅 ASP.NET 核心 Blazor WebAssembly 运行时性能

  • 某些移动设备浏览器的堆大小
  • 运行时重新链接
  • 单个指令,多个数据(SIMD)
  • .NET 8 或更高版本中 AOT 编译后的 IL 裁剪

异常处理

异常处理在默认情况下处于启用状态。 若要禁用异常处理,请在应用的项目文件 (<WasmEnableExceptionHandling>) 中添加值为 false.csproj 属性:

<PropertyGroup>
  <WasmEnableExceptionHandling>false</WasmEnableExceptionHandling>
</PropertyGroup>

若要启用 WebAssembly 异常处理,请在应用的项目文件 (<WasmEnableExceptionHandling>) 中添加值为 true.csproj 属性:

<PropertyGroup>
  <WasmEnableExceptionHandling>true</WasmEnableExceptionHandling>
</PropertyGroup>

有关详细信息,请参阅以下资源:

其他资源