bootsharp icon indicating copy to clipboard operation
bootsharp copied to clipboard

Don't marshal `Task<[]>` of supported colletion items

Open elringus opened this issue 5 months ago • 0 comments

.NET's JS interop currently is only able to marshal types with single-level nesting:

  • https://github.com/dotnet/runtime/issues/81348

— hence we have to handle otherwise natively-supported arrays (eg, Task<byte[]>) in a special manner.

Workaround 1

Lift the array to object and marshal as JSType.Any:

[JSExport] [return: JSMarshalAs<JSType.Promise<JSType.Any>>]
private static async Task<object> GetArrayAsync ()
{
    await Task.Delay(1);
    return new[] { "foo", "bar", "baz" };
}

This is currently employed under the hood and doesn't require any action from end-user, but costs an extra allocation when unmarshalling from JS to C#.

Workaround 2

Wrap the call into two: first to wait for the async operation, second to get the array in a blocking manner, eg:

[JSFunction] Task OpenFile (string uri);
[JSFunction] byte[] GetOpenFileContent (string uri);

Task<byte[]> ReadFile (string uri)
{
    await OpenFile(uri);
    return GetOpenFileContent(uri);
}

elringus avatar Jan 13 '24 16:01 elringus