This experimental SDK is now superseded by the .NET SDK's wasi-experimental workload (which itself is still experimental). See https://github.com/dotnet/runtime/blob/main/src/mono/wasi/README.md
Everything below this point is for comparative purposes only. Please move your experiments over to use wasi-experimental instead of the packages in this repo.
Wasi.Sdk is an experimental package that can build .NET Core projects (including whole ASP.NET Core applications) into standalone WASI-compliant .wasm files. These can then be run in standard WASI environments or custom WASI-like hosts.
dotnet new console -o MyFirstWasiApp
cd MyFirstWasiApp
dotnet add package Wasi.Sdk --prerelease
dotnet build
You'll see from the build output that this produces bin/Debug/net7.0/MyFirstWasiApp.wasm.
To run it,
- Ensure you've installed wasmtime and it's available on your system
PATH - Run your app via
dotnet runor, if you're using Visual Studio, press Ctrl+F5
Alternatively you can invoke runners like wasmtime or wasmer manually on the command line. For example,
- For wasmtime, run
wasmtime bin/Debug/net7.0/MyFirstWasiApp.wasm - For wasmer, run
wasmer bin/Debug/net7.0/MyFirstWasiApp.wasm
Other WASI hosts work similarly.
dotnet new web -o MyWebApp
cd MyWebApp
dotnet add package Wasi.Sdk --prerelease
dotnet add package Wasi.AspNetCore.Server.Native --prerelease
Then:
-
Open your new project in an IDE such as Visual Studio or VS Code
-
Open
Program.csand change the linevar builder = WebApplication.CreateBuilder(args)to look like this:var builder = WebApplication.CreateBuilder(args).UseWasiConnectionListener();
-
Open
Properties/launchSettings.jsonand edit theapplicationUrlvalue to contain only a single HTTP listener, e.g.,"applicationUrl": "http://localhost:8080"
-
Open your
.csprojfile (e.g., in VS, double-click on the project name) and, inside a<PropertyGroup>, add this:<WasiRunnerArgs>--tcplisten localhost:8080 --env ASPNETCORE_URLS=http://localhost:8080</WasiRunnerArgs>
Instead of
8080, you should enter the port number found inProperties\launchSettings.json.
That's it! You can now run it via dotnet run (or in VS, use Ctrl+F5)
Optionally, to add support for bundling wwwroot files into the .wasm file and serving them:
-
Add the NuGet package
Wasi.AspNetCore.BundledFiles -
In
Program.cs, replaceapp.UseStaticFiles();withapp.UseBundledStaticFiles(); -
In your
.csprojfile, add:<ItemGroup> <WasmBundleFiles Include="wwwroot\**" /> </ItemGroup>
Wasi.Sdk- a package that causes your build to produce a WASI-compliant.wasmfile. This works by:- Downloading the WASI SDK, if you don't already have it
- When your regular .NET build is done, it takes the resulting assemblies, plus the .NET runtime precompiled to WebAssembly, and uses WASI SDK to bundle them into a single
.wasmfile. You can optionally include other native sources such as.cfiles in the compilation.
Wasi.AspNetCore.BundledFiles- providesUseBundledStaticFiles, and alternative toUseStaticFiles, that serves static files bundled into your.wasmfile. This allows you to have single-file deployment even if you have files underwwwrootor elsewhere.Wasi.AspNetCore.Server.Native- a way of running ASP.NET Core on WASI's TCP-level standard networking APIs (e.g.,sock_accept). These standards are quite recent and are currently only supported in Wasmtime, not other WASI hosts.
... and more
First, build the runtime. This can take quite a long time.
git submodule update --init --recursive- Do the following steps using Linux or WSL:
sudo apt-get install build-essential cmake ninja-build python python3 zlib1g-dev
cd modules/runtime/src/mono/wasmmake provision-wasm(takes about 2 minutes)make build-all(takes 10-15 minutes)- If you get an error about
setlocale: LC_ALL: cannot change localethen runsudo apt install language-pack-en. This only happens on very bare-bones machines.
- If you get an error about
cd ../wasimake(takes a few minutes - there are lots of warnings like "System is unknown to cmake" and that's OK)
Now you can build the packages and samples in this repo:
- Prerequisites
- .NET 7 (
dotnet --versionshould return7.0.100-preview.4or later) - Rust and the
wasm32-unknown-unknowntarget (technically this is only needed for the CustomHost package)- Install Rust
rustup target add wasm32-unknown-unknown
- .NET 7 (
- Just use
dotnet buildordotnet runon any of the samples orsrcprojects, or open the solution in VS and Ctrl+F5 on any of the sample projects