.net-core - Blazor 预览 9/mono-wasm 内存访问越界:DotNet.invokeMethod 的最大字符串大小?
问题描述
从 dotnet core 3 preview 9 开始,我在调用 dotnet 方法时遇到了问题,该方法从 JavaScript 传递了一个大字符串。
代码价值超过一千字,所以下面的代码片段重现了这个问题。它在 时有效,length = 1 * mb
但在 时失败length = 2 * mb
。
@page "/repro"
<button onclick="const mb = 1024 * 1024; const length = 2 * mb;console.log(`Attempting length ${length}`); DotNet.invokeMethod('@GetType().Assembly.GetName().Name', 'ProcessString', 'a'.repeat(length));">Click Me</button>
@functions {
[JSInvokable] public static void ProcessString(string stringFromJavaScript) { }
}
错误信息是:
Uncaught RuntimeError: memory access out of bounds
at wasm-function[2639]:18
at wasm-function[6239]:10
at Module._mono_wasm_string_from_js (http://localhost:52349/_framework/wasm/mono.js:1:202444)
at ccall (http://localhost:52349/_framework/wasm/mono.js:1:7888)
at http://localhost:52349/_framework/wasm/mono.js:1:8238
at Object.toDotNetString (http://localhost:52349/_framework/blazor.webassembly.js:1:39050)
at Object.invokeDotNetFromJS (http://localhost:52349/_framework/blazor.webassembly.js:1:37750)
at u (http://localhost:52349/_framework/blazor.webassembly.js:1:5228)
at Object.e.invokeMethod (http://localhost:52349/_framework/blazor.webassembly.js:1:6578)
at HTMLButtonElement.onclick (<anonymous>:2:98)
我需要处理代表文件内容的大字符串。
- 有没有办法增加这个限制?
- 除了将字符串分解为多个段并执行多个调用之外,还有其他方法可以处理大字符串吗?
- 还有其他处理大文件的方法吗?
这曾经在预览版 8 中工作。
解决方案
- 有没有办法增加这个限制?
否(除非您修改并重新编译 blazor 和 mono/wasm)。
- 除了将字符串分解为多个段并执行多个调用之外,还有其他方法可以处理大字符串吗?
是的,因为您在客户端,您可以使用共享内存技术。您基本上将 .net 映射byte[]
到ArrayBuffer
. 请参阅此(免责声明:我的库)或此库以获取有关如何执行此操作的参考。这些示例使用实际 javascriptFile
的二进制内容,但它也适用于字符串。目前还没有关于这些 API 的参考文档。大多数只是示例和blazor 源代码。
- 还有其他处理大文件的方法吗?
见 2)
推荐阅读
- css - 在使用引导程序时遇到多个问题,实际上是导入所有必要的导入
- python - 在计算数据框中包含缺失值的列的平均值期间
- node.js - 在节点 ejs 中禁用上一个日期
- xml - 使用 shell 脚本(centos 环境)从 postgresql artifacoty 获取最新版本的 postgresql 版本
- angular - 在 Angular 中使用 Jest 运行测试用例时出现“无法解析 CustomTranslationLoader 的所有参数”错误
- javascript - 是否有任何 CORS 解决方法而无需在 Javascript 中更改服务器端?
- nlp - 在 BertTokenizerFast 中加载自我训练的 tokenzier 失败
- ubuntu - Docker Compose 无法使用 Podman 构建
- go - 使用 goose 进行数据库迁移时回滚
- c++ - 在 emcc 编译期间忽略 EXPORTED_FUNCTIONS