Разбираюсь тут с поддержкой webassembly [JSImport]/[JSExport],
В .NET 7 ее наконец отцепили от непонятной штуки в виде блазора. Блазор не нужен (tm), компиляция dotnet в webassembly нужна
Как передавать файлы (блобы) между 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)
Там очень много букв, и к .net оно отношения похоже не имеет (2018 год, тогда .net вообще компиляцию в wasm не поддерживал)?
Мелкомягкие ее добавили в юзабельном виде только в прошлом году, насколько я понимаю (.net 7)
Не хочется лезть в какие-то непонятные дебри
Т.е. "правильный" ответ насколько я понимаю, зависит от того как это предлагается делать в .net (какой "interop" они поддерживают для файлов/блобов)
Выше пример с byte[] но не уверен, что это есть хорошо, там две конвертации на ровном месте.
Здравствуйте, reversecode, Вы писали:
R>надо было про файлы гуглить R>а я за data pass зацепился
Ну так это. Я же вроде написал что про файлы. В заголовке темы
Про обычные параметры в доке написано по первой ссылке, даже с таблицей соответствия.
Но вот про файлы там я что-то ничего не нашел. А мне именно файлы обрабатывать надо.
bnk>Разбираюсь тут с поддержкой webassembly [JSImport]/[JSExport], bnk>В .NET 7 ее наконец отцепили от непонятной штуки в виде блазора. Блазор не нужен (tm), компиляция dotnet в webassembly нужна
Не уверен, что то что нужно, но посмотрите, как SkiaSharp делает:
Спасибо, посмотрю
На первый взгляд выглядит как-то сильно заморочено по сравнению с тупо "byte[]", куча каких-то непонятных interop.xxx и IntPtr, не уверен, что оно того стоит в моем случае (мне просто передать файл в несколько мегабайт)
Еще там похоже используется blazor (using наверху). В js идет работа с тем же Uint8Array
В общем спасибо, буду посмотреть
Здравствуйте, reversecode, Вы писали:
R>почему в js нельзя на блоб поставить проперти что это строка или массив R>и не передать уже в извесный тип конвертации что по ссылке в мс статье?
Производительность. Конечно можно тупо перегнать блоб в base64-строку например.
Просто хочется избежать такого. Ну если можно по-нормальному передать, то есть.
В идеале это вообще должно быть что-то типа стрима.
Т.е. вообще без копирования, юзер выбирает файл, и он прозрачно "стримится" свозь javascript напрямую в код на .net
Обратно соответственно так же.
Ну как пример, asp.net (IFormFile — там внутри стрим):
Здравствуйте, bnk, Вы писали:
bnk>Здравствуйте, Евгений Акиньшин, Вы писали:
bnk>На первый взгляд выглядит как-то сильно заморочено по сравнению с тупо "byte[]", куча каких-то непонятных interop.xxx и IntPtr, не уверен, что оно того стоит в моем случае (мне просто передать файл в несколько мегабайт)
Если я правильно понял, они шарят память между wasm и js, и передают по указателю, без копирования. Это должен быть самый быстрый способ.
bnk>Еще там похоже используется blazor (using наверху). В js идет работа с тем же Uint8Array
Так это же визуальная библиотека для блазора. Вряд ли сам механизм передачи данных на блазор завязан.
Здравствуйте, Евгений Акиньшин, Вы писали:
ЕА>Если я правильно понял, они шарят память между wasm и js, и передают по указателю, без копирования. Это должен быть самый быстрый способ.
Идею понял. Но пока оно выглядит как-то нереально заморочено для меня.
bnk>>Еще там похоже используется blazor (using наверху). В js идет работа с тем же Uint8Array
ЕА>Так это же визуальная библиотека для блазора. Вряд ли сам механизм передачи данных на блазор завязан.
А "вот оно че, Михалыч"
Re[10]: Как передавать файлы между js и webassembly
В общем остановился пока на самом тупом варианте, byte[].
Оказалось что оно не настолько тормозит чтобы заморачиваться. Как следующий шаг можно будет Span.
Но что меня удивило — оно работает блин
Компиляция .NET кода в wasm, на выходе получается набор DLL и "заголовочный" файл (dotnet.js), который нужно импортировать уже в свое javascript- приложение.
PdfSharp, OpenXml — все компилируется. И никаких blazor и прочего.
Попробовал вот тут "на кошках", (сайт ниже, типа сайт мелкий тащу со всякими диковинными тулзами для динозавров), все работает прямо в браузере.
В общем я впечатлен .NET7 => WASM. Также работает сборка на GitHub (т.е. сайт получается фактически бесплатно хостится)