Awesome
<div align="center"> <h1><code>wasmtime-dotnet</code></h1> <p> <strong>.NET embedding of <a href="https://github.com/bytecodealliance/wasmtime">Wasmtime</a></strong> </p><strong>A <a href="https://bytecodealliance.org/">Bytecode Alliance</a> project</strong>
<p> <a href="https://github.com/bytecodealliance/wasmtime-dotnet/actions/workflows/main.yml"> <img src="https://github.com/bytecodealliance/wasmtime-dotnet/actions/workflows/main.yml/badge.svg" alt="CI status"/> </a> <a href="https://www.nuget.org/packages/Wasmtime"> <img src="https://img.shields.io/nuget/v/wasmtime" alt="Latest Version"/> </a> <a href="https://bytecodealliance.github.io/wasmtime-dotnet/"> <img src="https://img.shields.io/badge/docs-main-green" alt="Documentation"/> </a> </p> </div>Installation
You can add a package reference with the .NET SDK:
$ dotnet add package wasmtime
Introduction
For this introduction, we'll be using a simple WebAssembly module that imports
a hello
function and exports a run
function:
(module
(func $hello (import "" "hello"))
(func (export "run") (call $hello))
)
To use this module from .NET, create a new console project:
$ mkdir wasmintro
$ cd wasmintro
$ dotnet new console
Next, add a reference to the Wasmtime package:
$ dotnet add package wasmtime
Replace the contents of Program.cs
with the following code:
using System;
using Wasmtime;
using var engine = new Engine();
using var module = Module.FromText(
engine,
"hello",
"(module (func $hello (import \"\" \"hello\")) (func (export \"run\") (call $hello)))"
);
using var linker = new Linker(engine);
using var store = new Store(engine);
linker.Define(
"",
"hello",
Function.FromCallback(store, () => Console.WriteLine("Hello from C#!"))
);
var instance = linker.Instantiate(store, module);
var run = instance.GetAction("run")!;
run();
An Engine
is created and then a WebAssembly module is loaded from a string in
WebAssembly text format.
A Linker
defines a function called hello
that simply prints a hello message.
The module is instantiated and the instance's run
export is invoked.
To run the application, simply use dotnet
:
$ dotnet run
This should print Hello from C#!
.
Contributing
Building
Use dotnet
to build the repository:
$ dotnet build Wasmtime.sln
This will download the latest development snapshot of Wasmtime for your platform.
Testing
Use dotnet
to run the unit tests:
$ dotnet test Wasmtime.sln
Creating the NuGet package
Use dotnet
to create a NuGet package:
$ cd src
$ dotnet pack Wasmtime.sln -c Release /p:Packing=true
This will create a .nupkg
file in src/bin/Release
.
By default, local builds will use a -dev
suffix for the package to
differentiate between official packages and development packages.
Updating Wasmtime for a release
To update the Wasmtime library used for a new release, change WasmtimeVersion
in Directory.Build.props
:
<WasmtimeVersion Condition="'$(WasmtimeVersion)'==''">$VERSION</WasmtimeVersion>
Publishing the Wasmtime .NET NuGet package
GitHub actions is used to automatically publish a package to NuGet when a tag is pushed to the repository.
To publish a new release, create a release in GitHub and add the relevant release notes.
Use a tag of the format v$VERSION
where $VERSION
matches the Wasmtime
version used by the .NET package; ensure the tagged commit matches the last
commit to make for the release.
When the release is published on GitHub, an action should automatically start to build and publish the package to NuGet.