首页 > 解决方案 > 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)

我需要处理代表文件内容的大字符串。

  1. 有没有办法增加这个限制?
  2. 除了将字符串分解为多个段并执行多个调用之外,还有其他方法可以处理大字符串吗?
  3. 还有其他处理大文件的方法吗?

这曾经在预览版 8 中工作。

标签: .net-coremonoblazor

解决方案


  1. 有没有办法增加这个限制?

否(除非您修改并重新编译 blazor 和 mono/wasm)。

  1. 除了将字符串分解为多个段并执行多个调用之外,还有其他方法可以处理大字符串吗?

是的,因为您在客户端,您可以使用共享内存技术。您基本上将 .net 映射byte[]ArrayBuffer. 请参阅(免责声明:我的库)或库以获取有关如何执行此操作的参考。这些示例使用实际 javascriptFile的二进制内容,但它也适用于字符串。目前还没有关于这些 API 的参考文档。大多数只是示例和blazor 源代码

  1. 还有其他处理大文件的方法吗?

见 2)


推荐阅读