已弃用
这个实验性的 SDK 现已被 .NET SDK 的 wasi-experimental
工作负载所取代(该工作负载本身仍处于实验阶段)。请参阅 https://github.com/dotnet/runtime/blob/main/src/mono/wasi/README.md
以下内容仅供比较参考。请将您的实验迁移到使用 wasi-experimental
,而不是本仓库中的包。
.NET Core 的实验性 WASI SDK
Wasi.Sdk
是一个实验性包,可以将 .NET Core 项目(包括完整的 ASP.NET Core 应用程序)构建成独立的符合 WASI 标准的 .wasm
文件。这些文件可以在标准 WASI 环境或自定义 WASI 类主机中运行。
使用方法:控制台应用程序
dotnet new console -o MyFirstWasiApp
cd MyFirstWasiApp
dotnet add package Wasi.Sdk --prerelease
dotnet build
从构建输出中可以看到,这会生成 bin/Debug/net7.0/MyFirstWasiApp.wasm
。
要运行它,请:
- 确保已安装 wasmtime 并将其添加到系统
PATH
中 - 通过
dotnet run
运行您的应用程序,或者如果您使用 Visual Studio,请按 Ctrl+F5
或者,您可以在命令行中手动调用 wasmtime
或 wasmer
等运行器。例如:
- 对于 wasmtime,运行
wasmtime bin/Debug/net7.0/MyFirstWasiApp.wasm
- 对于 wasmer,运行
wasmer bin/Debug/net7.0/MyFirstWasiApp.wasm
其他 WASI 主机的使用方式类似。
使用方法:ASP.NET Core 应用程序
dotnet new web -o MyWebApp
cd MyWebApp
dotnet add package Wasi.Sdk --prerelease
dotnet add package Wasi.AspNetCore.Server.Native --prerelease
然后:
-
在 Visual Studio 或 VS Code 等 IDE 中打开您的新项目
-
打开
Program.cs
并将var builder = WebApplication.CreateBuilder(args)
这行改为:var builder = WebApplication.CreateBuilder(args).UseWasiConnectionListener();
-
打开
Properties/launchSettings.json
并编辑applicationUrl
值,使其只包含一个 HTTP 监听器,例如:"applicationUrl": "http://localhost:8080"
-
打开您的
.csproj
文件(例如,在 VS 中双击项目名称),在<PropertyGroup>
内添加以下内容:<WasiRunnerArgs>--tcplisten localhost:8080 --env ASPNETCORE_URLS=http://localhost:8080</WasiRunnerArgs>
请将
8080
替换为Properties\launchSettings.json
中找到的端口号。
就是这样!现在您可以通过 dotnet run
运行它(或在 VS 中使用 Ctrl+F5)
可选:要添加对将 wwwroot
文件打包到 .wasm
文件中并提供服务的支持:
-
添加 NuGet 包
Wasi.AspNetCore.BundledFiles
-
在
Program.cs
中,将app.UseStaticFiles();
替换为app.UseBundledStaticFiles();
-
在您的
.csproj
文件中添加:<ItemGroup> <WasmBundleFiles Include="wwwroot\**" /> </ItemGroup>
本仓库包含的内容
Wasi.Sdk
- 一个使您的构建生成符合 WASI 标准的.wasm
文件的包。它的工作原理是:- 下载 WASI SDK(如果您还没有)
- 当您的常规 .NET 构建完成后,它会将生成的程序集以及预编译为 WebAssembly 的 .NET 运行时一起使用 WASI SDK 打包成一个单独的
.wasm
文件。您可以选择在编译中包含其他原生源文件,如.c
文件。
Wasi.AspNetCore.BundledFiles
- 提供UseBundledStaticFiles
,作为UseStaticFiles
的替代方案,用于提供打包到.wasm
文件中的静态文件。这允许您在wwwroot
或其他地方有文件的情况下实现单文件部署。Wasi.AspNetCore.Server.Native
- 一种在 WASI 的 TCP 级标准网络 API(例如sock_accept
)上运行 ASP.NET Core 的方法。这些标准相当新,目前仅在 Wasmtime 中受支持,其他 WASI 主机不支持。
... 以及更多
从源代码构建此仓库
首先,构建运行时。这可能需要相当长的时间。
git submodule update --init --recursive
- 使用 Linux 或 WSL 执行以下步骤:
sudo apt-get install build-essential cmake ninja-build python python3 zlib1g-dev
cd modules/runtime/src/mono/wasm
make provision-wasm
(大约需要 2 分钟)make build-all
(需要 10-15 分钟)- 如果出现关于
setlocale: LC_ALL: cannot change locale
的错误,请运行sudo apt install language-pack-en
。这只会在非常基础的机器上发生。
- 如果出现关于
cd ../wasi
make
(需要几分钟 - 会有很多类似 "System is unknown to cmake" 的警告,这是正常的)
现在您可以构建此仓库中的包和示例:
- 先决条件
- .NET 7(
dotnet --version
应返回7.0.100-preview.4
或更高版本) - Rust 和
wasm32-unknown-unknown
目标(技术上只有 CustomHost 包需要)- 安装 Rust
rustup target add wasm32-unknown-unknown
- .NET 7(
- 只需对任何示例或
src
项目使用dotnet build
或dotnet run
,或在 VS 中打开解决方案并对任何示例项目使用 Ctrl+F5