Reimplement the C# API.

This commit reimplements the C# API in terms of a Wasmtime linker.

It removes the custom binding implementation that was based on reflection in
favor of the linker's implementation.

This should make the C# API a little closer to the Rust API.

The `Engine` and `Store` types have been hidden behind the `Host` type which is
responsible for hosting WebAssembly module instances.

Documentation and tests have been updated.
This commit is contained in:
Peter Huene
2020-03-24 18:20:22 -07:00
parent 0d5d63fdb1
commit cf1d9ee857
38 changed files with 2149 additions and 2213 deletions

View File

@@ -17,6 +17,8 @@ namespace Wasmtime.Tests
public WasiSnapshot0Tests(WasiSnapshot0Fixture fixture)
{
Fixture = fixture;
Fixture.Host.ClearDefinitions();
}
private WasiSnapshot0Fixture Fixture { get; set; }
@@ -24,7 +26,8 @@ namespace Wasmtime.Tests
[Fact]
public void ItHasNoEnvironmentByDefault()
{
using var instance = Fixture.Module.Instantiate(new Wasi(Fixture.Module.Store, "wasi_unstable"));
Fixture.Host.DefineWasi("wasi_unstable");
using var instance = Fixture.Host.Instantiate(Fixture.Module);
dynamic inst = instance;
var memory = instance.Externs.Memories[0];
@@ -43,11 +46,12 @@ namespace Wasmtime.Tests
{"VERY", "COOL"},
};
var wasi = new WasiBuilder("wasi_unstable")
.WithEnvironmentVariables(env.Select(kvp => (kvp.Key, kvp.Value)))
.Build(Fixture.Module.Store);
var config = new WasiConfiguration()
.WithEnvironmentVariables(env.Select(kvp => (kvp.Key, kvp.Value)));
using var instance = Fixture.Module.Instantiate(wasi);
Fixture.Host.DefineWasi("wasi_unstable", config);
using var instance = Fixture.Host.Instantiate(Fixture.Module);
dynamic inst = instance;
var memory = instance.Externs.Memories[0];
@@ -67,11 +71,12 @@ namespace Wasmtime.Tests
[Fact]
public void ItInheritsEnvironment()
{
var wasi = new WasiBuilder("wasi_unstable")
.WithInheritedEnvironment()
.Build(Fixture.Module.Store);
var config = new WasiConfiguration()
.WithInheritedEnvironment();
using var instance = Fixture.Module.Instantiate(wasi);
Fixture.Host.DefineWasi("wasi_unstable", config);
using var instance = Fixture.Host.Instantiate(Fixture.Module);
dynamic inst = instance;
var memory = instance.Externs.Memories[0];
@@ -83,7 +88,9 @@ namespace Wasmtime.Tests
[Fact]
public void ItHasNoArgumentsByDefault()
{
using var instance = Fixture.Module.Instantiate(new Wasi(Fixture.Module.Store, "wasi_unstable"));
Fixture.Host.DefineWasi("wasi_unstable");
using var instance = Fixture.Host.Instantiate(Fixture.Module);
dynamic inst = instance;
var memory = instance.Externs.Memories[0];
@@ -103,11 +110,12 @@ namespace Wasmtime.Tests
"COOL"
};
var wasi = new WasiBuilder("wasi_unstable")
.WithArgs(args)
.Build(Fixture.Module.Store);
var config = new WasiConfiguration()
.WithArgs(args);
using var instance = Fixture.Module.Instantiate(wasi);
Fixture.Host.DefineWasi("wasi_unstable", config);
using var instance = Fixture.Host.Instantiate(Fixture.Module);
dynamic inst = instance;
var memory = instance.Externs.Memories[0];
@@ -127,11 +135,12 @@ namespace Wasmtime.Tests
[Fact]
public void ItInheritsArguments()
{
var wasi = new WasiBuilder("wasi_unstable")
.WithInheritedArgs()
.Build(Fixture.Module.Store);
var config = new WasiConfiguration()
.WithInheritedArgs();
using var instance = Fixture.Module.Instantiate(wasi);
Fixture.Host.DefineWasi("wasi_unstable", config);
using var instance = Fixture.Host.Instantiate(Fixture.Module);
dynamic inst = instance;
var memory = instance.Externs.Memories[0];
@@ -148,11 +157,12 @@ namespace Wasmtime.Tests
using var file = new TempFile();
File.WriteAllText(file.Path, MESSAGE);
var wasi = new WasiBuilder("wasi_unstable")
.WithStandardInput(file.Path)
.Build(Fixture.Module.Store);
var config = new WasiConfiguration()
.WithStandardInput(file.Path);
using var instance = Fixture.Module.Instantiate(wasi);
Fixture.Host.DefineWasi("wasi_unstable", config);
using var instance = Fixture.Host.Instantiate(Fixture.Module);
dynamic inst = instance;
var memory = instance.Externs.Memories[0];
@@ -173,19 +183,19 @@ namespace Wasmtime.Tests
using var file = new TempFile();
var builder = new WasiBuilder("wasi_unstable");
var config = new WasiConfiguration();
if (fd == 1)
{
builder.WithStandardOutput(file.Path);
config.WithStandardOutput(file.Path);
}
else if (fd == 2)
{
builder.WithStandardError(file.Path);
config.WithStandardError(file.Path);
}
var wasi = builder.Build(Fixture.Module.Store);
Fixture.Host.DefineWasi("wasi_unstable", config);
using var instance = Fixture.Module.Instantiate(wasi);
using var instance = Fixture.Host.Instantiate(Fixture.Module);
dynamic inst = instance;
var memory = instance.Externs.Memories[0];
@@ -206,11 +216,12 @@ namespace Wasmtime.Tests
using var file = new TempFile();
var wasi = new WasiBuilder("wasi_unstable")
.WithPreopenedDirectory(Path.GetDirectoryName(file.Path), "/foo")
.Build(Fixture.Module.Store);
var config = new WasiConfiguration()
.WithPreopenedDirectory(Path.GetDirectoryName(file.Path), "/foo");
using var instance = Fixture.Module.Instantiate(wasi);
Fixture.Host.DefineWasi("wasi_unstable", config);
using var instance = Fixture.Host.Instantiate(Fixture.Module);
dynamic inst = instance;
var memory = instance.Externs.Memories[0];