Как передавать файлы между js и webassembly
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.10.23 10:03
Оценка: 9 (1)
Разбираюсь тут с поддержкой webassembly [JSImport]/[JSExport],
В .NET 7 ее наконец отцепили от непонятной штуки в виде блазора. Блазор не нужен (tm), компиляция dotnet в webassembly нужна

https://www.meziantou.net/using-dotnet-code-from-javascript-using-webassembly.htm

https://learn.microsoft.com/en-us/aspnet/core/client-side/dotnet-interop

Как передавать файлы (блобы) между js и webassembly? Условный код ниже

C#
public partial class MyFileProcessor
{
    // Экспортируем нашу функцию. Что она должна принимать в качестве параметра ("blob")?
    [JSExport]
    internal static string ProcessFile(blob)  //<< какой тип должен иметь blob?
    {
    }
}

JS
...
const dotnetcode = await getAssemblyExports(config.mainAssemblyName);

const file = new File(...) //< как его передать?
...
// вызываем метод
const result = dotnetcode.MyFileProcessor.ProcessFile(file);


Вообще глобальная цель — заюзать библиотеку OpenXml прямо из браузера, без отправки файлов на сервер.

Пока сделал byte[] (первое, что работает), но как-то это криво, несколько приседаний (конвертаций) на ровном месте?

public partial class MyFileProcessor
{
    [JSExport]
    internal static string ProcessFile(byte[] data) { ... }
}

const file = new File(["Hello world"], "hello.txt");
const data = new Uint8Array(await file.arrayBuffer());
const result = dotnetcode.MyFileProcessor.ProcessFile(data)
Отредактировано 22.10.2023 11:58 bnk . Предыдущая версия . Еще …
Отредактировано 22.10.2023 11:11 bnk . Предыдущая версия .
Отредактировано 22.10.2023 11:06 bnk . Предыдущая версия .
Отредактировано 22.10.2023 10:26 bnk . Предыдущая версия .
Отредактировано 22.10.2023 10:26 bnk . Предыдущая версия .
Отредактировано 22.10.2023 10:25 bnk . Предыдущая версия .
Отредактировано 22.10.2023 10:18 bnk . Предыдущая версия .
Отредактировано 22.10.2023 10:11 bnk . Предыдущая версия .
Отредактировано 22.10.2023 10:10 bnk . Предыдущая версия .
Отредактировано 22.10.2023 10:10 bnk . Предыдущая версия .
Re: Как передавать файлы между js и webassembly
От: reversecode google
Дата: 22.10.23 11:14
Оценка:
оно?
https://github.com/WebAssembly/design/issues/1231
Re[2]: Как передавать файлы между js и webassembly
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.10.23 11:20
Оценка:
Здравствуйте, reversecode, Вы писали:

R>оно?

R>https://github.com/WebAssembly/design/issues/1231

Там очень много букв, и к .net оно отношения похоже не имеет (2018 год, тогда .net вообще компиляцию в wasm не поддерживал)?
Мелкомягкие ее добавили в юзабельном виде только в прошлом году, насколько я понимаю (.net 7)
Не хочется лезть в какие-то непонятные дебри

Т.е. "правильный" ответ насколько я понимаю, зависит от того как это предлагается делать в .net (какой "interop" они поддерживают для файлов/блобов)
Выше пример с byte[] но не уверен, что это есть хорошо, там две конвертации на ровном месте.
Отредактировано 22.10.2023 11:33 bnk . Предыдущая версия . Еще …
Отредактировано 22.10.2023 11:32 bnk . Предыдущая версия .
Отредактировано 22.10.2023 11:28 bnk . Предыдущая версия .
Отредактировано 22.10.2023 11:27 bnk . Предыдущая версия .
Отредактировано 22.10.2023 11:24 bnk . Предыдущая версия .
Отредактировано 22.10.2023 11:21 bnk . Предыдущая версия .
Re[3]: Как передавать файлы между js и webassembly
От: reversecode google
Дата: 22.10.23 12:06
Оценка:
еще кое что нашел
может поможет
https://old.reddit.com/r/dotnet/comments/wdxov8/blazor_school_sharing_data_between_browsing/
https://stackoverflow.com/questions/69500517/how-to-pass-a-c-sharp-variable-to-javascript-in-blazor-web-assembly
Re[4]: Как передавать файлы между js и webassembly
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.10.23 12:28
Оценка:
Здравствуйте, reversecode, Вы писали:

R>еще кое что нашел


R>может поможет

R>https://old.reddit.com/r/dotnet/comments/wdxov8/blazor_school_sharing_data_between_browsing/
R>https://stackoverflow.com/questions/69500517/how-to-pass-a-c-sharp-variable-to-javascript-in-blazor-web-assembly

Спасибо конечно, но не помогло. Там ничего про передачу файлов нет, и там blazor (старье)
Re[5]: Как передавать файлы между js и webassembly
От: reversecode google
Дата: 22.10.23 13:00
Оценка:
ну Николай звиняйте
я чуток не так понял
надо было про файлы гуглить
а я за data pass зацепился
Re[6]: Как передавать файлы между js и webassembly
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.10.23 13:07
Оценка:
Здравствуйте, reversecode, Вы писали:

R>надо было про файлы гуглить

R>а я за data pass зацепился

Ну так это. Я же вроде написал что про файлы. В заголовке темы
Про обычные параметры в доке написано по первой ссылке, даже с таблицей соответствия.
Но вот про файлы там я что-то ничего не нашел. А мне именно файлы обрабатывать надо.
Re: Как передавать файлы между js и webassembly
От: Евгений Акиньшин grapholite.com
Дата: 22.10.23 13:30
Оценка: 16 (1)
Здравствуйте, bnk, Вы писали:


bnk>Разбираюсь тут с поддержкой webassembly [JSImport]/[JSExport],

bnk>В .NET 7 ее наконец отцепили от непонятной штуки в виде блазора. Блазор не нужен (tm), компиляция dotnet в webassembly нужна

Не уверен, что то что нужно, но посмотрите, как SkiaSharp делает:

https://github.com/mono/SkiaSharp/blob/main/source/SkiaSharp.Views/SkiaSharp.Views.Blazor/SKCanvasView.razor.cs#L103
interop.PutImageData(pixelsHandle.AddrOfPinnedObject(), info.Size);


https://github.com/mono/SkiaSharp/blob/main/source/SkiaSharp.Views/SkiaSharp.Views.Blazor/Internal/SKHtmlCanvasInterop.cs#L85

public void PutImageData(IntPtr intPtr, SKSizeI rawSize) =>
            Invoke(PutImageDataSymbol, htmlCanvas, intPtr.ToInt64(), rawSize.Width, rawSize.Height);


на стороне js вот так забирают:
https://github.com/mono/SkiaSharp/blob/main/source/SkiaSharp.Views/SkiaSharp.Views.Blazor/wwwroot/SKHtmlCanvas.ts#L196

var buffer = new Uint8ClampedArray(Module.HEAPU8.buffer, pData, width * height * 4);
var imageData = new ImageData(buffer, width, height);
ctx.putImageData(imageData, 0, 0);

Не шалю, никого не трогаю, починяю примус Diagrams Designer for iPad and Windows 10
Re[7]: Как передавать файлы между js и webassembly
От: reversecode google
Дата: 22.10.23 13:31
Оценка:
почему в js нельзя на блоб поставить проперти что это строка или массив
и не передать уже в извесный тип конвертации что по ссылке в мс статье?
Re[2]: Как передавать файлы между js и webassembly
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.10.23 13:49
Оценка:
Здравствуйте, Евгений Акиньшин, Вы писали:

ЕА>https://github.com/mono/SkiaSharp/blob/main/source/SkiaSharp.Views/SkiaSharp.Views.Blazor/SKCanvasView.razor.cs#L103


interop.PutImageData(pixelsHandle.AddrOfPinnedObject(), info.Size);

Спасибо, посмотрю
На первый взгляд выглядит как-то сильно заморочено по сравнению с тупо "byte[]", куча каких-то непонятных interop.xxx и IntPtr, не уверен, что оно того стоит в моем случае (мне просто передать файл в несколько мегабайт)
Еще там похоже используется blazor (using наверху). В js идет работа с тем же Uint8Array
В общем спасибо, буду посмотреть
Отредактировано 22.10.2023 13:56 bnk . Предыдущая версия . Еще …
Отредактировано 22.10.2023 13:52 bnk . Предыдущая версия .
Re[8]: Как передавать файлы между js и webassembly
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.10.23 13:58
Оценка:
Здравствуйте, reversecode, Вы писали:

R>почему в js нельзя на блоб поставить проперти что это строка или массив

R>и не передать уже в извесный тип конвертации что по ссылке в мс статье?

Производительность. Конечно можно тупо перегнать блоб в base64-строку например.
Просто хочется избежать такого. Ну если можно по-нормальному передать, то есть.

В идеале это вообще должно быть что-то типа стрима.
Т.е. вообще без копирования, юзер выбирает файл, и он прозрачно "стримится" свозь javascript напрямую в код на .net
Обратно соответственно так же.

Ну как пример, asp.net (IFormFile — там внутри стрим):
void Foo(IFormFile file) { ... }

По простоте душевной попробовал вот такое:
static string ProcessFile(Stream stream) { ... }

const file = File(...)
dotnetcode.MyFileProcessor.ProcessFile(file)

Нифига, ругается, invalid interop type.
Отредактировано 22.10.2023 14:23 bnk . Предыдущая версия . Еще …
Отредактировано 22.10.2023 14:02 bnk . Предыдущая версия .
Отредактировано 22.10.2023 14:01 bnk . Предыдущая версия .
Re[3]: Как передавать файлы между js и webassembly
От: Евгений Акиньшин grapholite.com
Дата: 22.10.23 14:16
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, Евгений Акиньшин, Вы писали:


bnk>На первый взгляд выглядит как-то сильно заморочено по сравнению с тупо "byte[]", куча каких-то непонятных interop.xxx и IntPtr, не уверен, что оно того стоит в моем случае (мне просто передать файл в несколько мегабайт)


Если я правильно понял, они шарят память между wasm и js, и передают по указателю, без копирования. Это должен быть самый быстрый способ.

bnk>Еще там похоже используется blazor (using наверху). В js идет работа с тем же Uint8Array


Так это же визуальная библиотека для блазора. Вряд ли сам механизм передачи данных на блазор завязан.
Не шалю, никого не трогаю, починяю примус Diagrams Designer for iPad and Windows 10
Re[9]: Как передавать файлы между js и webassembly
От: reversecode google
Дата: 22.10.23 14:19
Оценка: 16 (1)
не не
в идеале это меморивю или спан
и он таки там есть
Re[4]: Как передавать файлы между js и webassembly
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.10.23 14:27
Оценка:
Здравствуйте, Евгений Акиньшин, Вы писали:

ЕА>Если я правильно понял, они шарят память между wasm и js, и передают по указателю, без копирования. Это должен быть самый быстрый способ.


Идею понял. Но пока оно выглядит как-то нереально заморочено для меня.

bnk>>Еще там похоже используется blazor (using наверху). В js идет работа с тем же Uint8Array


ЕА>Так это же визуальная библиотека для блазора. Вряд ли сам механизм передачи данных на блазор завязан.


А "вот оно че, Михалыч"
Re[10]: Как передавать файлы между js и webassembly
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.10.23 14:29
Оценка:
Здравствуйте, reversecode, Вы писали:

R>не не

R>в идеале это меморивю или спан
R>и он таки там есть

Ага похоже слона я и не заметил
Спасибо, будут читать в этом направлении.
Re: Оно работает :)
От: bnk СССР http://unmanagedvisio.com/
Дата: 23.10.23 19:08
Оценка: 16 (2)
Здравствуйте, bnk, Вы писали:

В общем остановился пока на самом тупом варианте, byte[].
Оказалось что оно не настолько тормозит чтобы заморачиваться. Как следующий шаг можно будет Span.

Но что меня удивило — оно работает блин
Компиляция .NET кода в wasm, на выходе получается набор DLL и "заголовочный" файл (dotnet.js), который нужно импортировать уже в свое javascript- приложение.
PdfSharp, OpenXml — все компилируется. И никаких blazor и прочего.

Попробовал вот тут "на кошках", (сайт ниже, типа сайт мелкий тащу со всякими диковинными тулзами для динозавров), все работает прямо в браузере.
В общем я впечатлен .NET7 => WASM. Также работает сборка на GitHub (т.е. сайт получается фактически бесплатно хостится)

http://webtools.unmanagedvisio.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.