如何从 Go 客户端调用自定义 Wasm 主机函数?
我看过一些示例,显示加载自包含的 witx/wat/wasm 定义的函数,但没有找到执行主机定义的调用的示例。我看过的一些例子是针对 wazero 和 wasmtime-go 的:
如果可能的话,能够使用纯 Go 进行这些 WebAssembly 主机调用将是理想的。
compute-at-edge.witx
和 typenames.witx
定义的 Fastly Compute@Edge ABI 的主机调用,但这通常适用于任何主机定义的调用/函数。
此问题可以提供帮助:https://github.com/bytecodealliance/wasmtime-go/issues/80
您应该使用
wasmtime.Linker.DefineFunc()
按名称链接主机函数。像这样的东西:
...
linker := wasmtime.NewLinker(engine)
err := linker.DefineWasi()
if err != nil {
return err
}
store := wasmtime.NewStore(engine)
wasiConfig := wasmtime.NewWasiConfig()
...
store.SetWasi(wasiConfig)
err = linker.DefineFunc(store, "env", "HostFunc", func() {
fmt.Println("HOSTCALL!!!")
})
if err != nil {
return err
}
instance, err := linker.Instantiate(store, module)
if err != nil {
return err
}
...
在嘉宾中:
package main
//export HostFunc
func HostFunc()
func main() {
HostFunc()
}