.NET browser-wasm运行时中的MemoryView是什么?
.NET 7 Browser-Wasm 中 MemoryView 的 JS 端实际形态
在.NET 7的非Blazor browser-wasm运行时使用JSImport进行互操作时,Span<>或ArraySegment<>会被封送为MemoryView对象,它在JavaScript端的具体形态如下:
- 核心是类型化数组的轻量包装:
MemoryView内部持有与.NET元素类型匹配的JavaScript类型化数组(比如Uint8Array对应.NET的byte类型、Int32Array对应int类型),这个数组指向的是与.NET内存共享的底层缓冲区。 - 包含范围标识属性:除了底层数组,
MemoryView还提供byteOffset(该片段在原缓冲区的字节偏移量)和length(片段包含的元素数量)两个属性,用于明确当前视图覆盖的内存范围。 - 可直接操作底层数组:你可以通过
MemoryView的buffer属性获取到对应的类型化数组,对这个数组的读写操作会直接同步到.NET侧的内存中。
举个JavaScript侧的处理示例:
function handleMemoryView(memoryView) { // 获取底层类型化数组 const typedArray = memoryView.buffer; // 计算元素起始索引 const startIndex = memoryView.byteOffset / typedArray.BYTES_PER_ELEMENT; // 遍历处理片段内的元素 for (let i = 0; i < memoryView.length; i++) { console.log(typedArray[startIndex + i]); } }
需要注意:MemoryView的生命周期与.NET侧的Span<>/ArraySegment<>绑定,当.NET侧的内存被回收后,JS侧对应的MemoryView缓冲区会失效,避免在JS中长时间持有该对象。
内容的提问来源于stack exchange,提问作者curiousdannii
相关产品推荐
相关产品推荐

