如何从 Go 访客执行 Wasm 主机调用?

问题描述 投票:0回答:1

如何从 Go 客户端调用自定义 Wasm 主机函数?

我看过一些示例,显示加载自包含的 witx/wat/wasm 定义的函数,但没有找到执行主机定义的调用的示例。我看过的一些例子是针对 wazero 和 wasmtime-go 的:

如果可能的话,能够使用纯 Go 进行这些 WebAssembly 主机调用将是理想的。

具体来说,我正在尝试实现来自

compute-at-edge.witx
typenames.witx
定义的 Fastly Compute@Edge ABI 的主机调用,但这通常适用于任何主机定义的调用/函数。

go webassembly fastly tinygo fastly-compute
1个回答
0
投票

此问题可以提供帮助:https://github.com/bytecodealliance/wasmtime-go/issues/80

还有另一个例子:https://github.com/bytecodealliance/wasmtime-go/blob/a1a8116cf3965d0e228229f3b3a497ba6da6a9b7/func_test.go#L422

您应该使用

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()
}
© www.soinside.com 2019 - 2024. All rights reserved.