関数の呼び出し
モジュールがエクスポートする関数を呼び出すことができます。
インスタンスに対して TryGetExport
を呼び出し、IInvocableFunction
インターフェースを取得します。このインターフェースを使用して関数を呼び出すことができます。
var module = await moduleAsset.LoadModuleAsync();
var instance = new Instance(module, /* */);
if (!instance.TryGetExport("export name", out IInvocableFunction function)) return;
using var context = new ExecutionContext();
var result = CoreBinder.Instance.Invoke<int /* result type */>(context, function, 1, 1.0, 1.0f);
Debug.Log(result);
CoreBinder.Instance.Invoke()
を使用すると、Boxing を行わずに任意長の引数を関数に渡すことができます。これは内部的に Source Generators を使用しています。
また、Source Generator を使用せずに低レベルな形式で関数を呼び出すこともできます。
// set args
Span<StackValueItem> args = stackalloc StackValueItem[3];
args[0] = new StackValueItem(1); // i32
args[1] = new StackValueItem(1.0); // f64
args[2] = new StackValueItem(1.0f); // f32
// invoke
context.Invoke(function, args);
// take results
Span<StackValueItem> results = stackalloc StackValueItem[1];
context.TakeResults(results);
Debug.Log(results[0]);