You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI Blazor中C#与JavaScript能否共享内存?

可以实现,分Blazor WebAssembly和Server两种场景处理

Blazor WebAssembly(WASM)场景:直接共享内存

由于WASM运行在浏览器沙箱中,C#托管代码与JavaScript共享同一块内存空间,因此可以直接将C#分配的内存块暴露给JS,完全避免反复传输数据的开销。

实现步骤:

  1. C#端初始化并保留固定内存块
    在组件或全局服务中创建20MB的字节数组,通过强引用确保其在应用生命周期内不会被GC回收:
// 全局保留的20MB共享内存块
private readonly byte[] _sharedMemory = new byte[20 * 1024 * 1024];

protected override async Task OnInitializedAsync()
{
    // 将内存块传入JavaScript完成绑定
    await JS.InvokeVoidAsync("initSharedMemory", _sharedMemory);
}
  1. JS端绑定并直接访问内存
    接收C#传入的数组后,将其转换为TypedArray(如Uint8Array),后续WebGL渲染时直接使用该数组:
let sharedTypedArray;

function initSharedMemory(buffer) {
    // buffer对应C#数组的底层ArrayBuffer
    sharedTypedArray = new Uint8Array(buffer);
}

// WebGL渲染逻辑示例
function renderWithWebGL() {
    const gl = document.getElementById('targetCanvas').getContext('webgl');
    const vertexBuffer = gl.createBuffer();
    
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    // 直接使用共享内存作为数据源,无需重复传输
    gl.bufferData(gl.ARRAY_BUFFER, sharedTypedArray, gl.DYNAMIC_DRAW);
    
    // ... 后续顶点着色器、绘制等逻辑
}

关键注意事项:

  • 必须保持C#中_sharedMemory的强引用(如作为类成员变量),防止GC回收导致JS访问失效。
  • WASM环境下可使用JSInProcessRuntime替代异步调用,进一步提升互操作性能。
  • 根据WebGL数据类型需求,可将Uint8Array转换为对应TypedArray(如Float32Array用于顶点坐标数据)。

Blazor Server场景:增量更新浏览器端内存

Blazor Server模式下,C#代码运行在服务器端,与浏览器端JS内存完全隔离,无法直接共享,但可以通过浏览器预分配内存+增量更新的方式避免全量数据传输:

实现步骤:

  1. JS端预分配固定内存块
    提前在浏览器中创建20MB的ArrayBuffer,并通知C#端内存已就绪:
// 浏览器端预分配20MB内存
const sharedBuffer = new ArrayBuffer(20 * 1024 * 1024);
const sharedTypedArray = new Uint8Array(sharedBuffer);

// 通知C#端内存规格
DotNet.invokeMethodAsync('YourAppNamespace', 'OnSharedMemoryReady', sharedBuffer.byteLength);
  1. C#端传输增量数据
    服务器端仅发送需要修改的数据片段(偏移量+数据块),而非整个20MB内存:
// 示例:更新指定偏移位置的内存片段
private async Task UpdateMemorySegment(int offset, byte[] data)
{
    await JS.InvokeVoidAsync("updateSharedMemory", offset, data);
}
  1. JS端写入增量数据
    接收C#传来的片段数据,直接写入预分配的内存块,随后触发WebGL渲染:
function updateSharedMemory(offset, data) {
    // 将数据写入指定偏移位置
    sharedTypedArray.set(data, offset);
    // 触发渲染更新
    renderWithWebGL();
}

关键注意事项:

  • 可结合SignalR实现更高效的双向增量同步,减少JS互操作的通信开销。
  • 若需频繁更新,可批量合并增量操作,进一步降低通信次数。

内容的提问来源于stack exchange,提问作者codetale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:11:24