MAUI Blazor中C#与JavaScript能否共享内存?
可以实现,分Blazor WebAssembly和Server两种场景处理
Blazor WebAssembly(WASM)场景:直接共享内存
由于WASM运行在浏览器沙箱中,C#托管代码与JavaScript共享同一块内存空间,因此可以直接将C#分配的内存块暴露给JS,完全避免反复传输数据的开销。
实现步骤:
- C#端初始化并保留固定内存块
在组件或全局服务中创建20MB的字节数组,通过强引用确保其在应用生命周期内不会被GC回收:
// 全局保留的20MB共享内存块 private readonly byte[] _sharedMemory = new byte[20 * 1024 * 1024]; protected override async Task OnInitializedAsync() { // 将内存块传入JavaScript完成绑定 await JS.InvokeVoidAsync("initSharedMemory", _sharedMemory); }
- 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内存完全隔离,无法直接共享,但可以通过浏览器预分配内存+增量更新的方式避免全量数据传输:
实现步骤:
- JS端预分配固定内存块
提前在浏览器中创建20MB的ArrayBuffer,并通知C#端内存已就绪:
// 浏览器端预分配20MB内存 const sharedBuffer = new ArrayBuffer(20 * 1024 * 1024); const sharedTypedArray = new Uint8Array(sharedBuffer); // 通知C#端内存规格 DotNet.invokeMethodAsync('YourAppNamespace', 'OnSharedMemoryReady', sharedBuffer.byteLength);
- C#端传输增量数据
服务器端仅发送需要修改的数据片段(偏移量+数据块),而非整个20MB内存:
// 示例:更新指定偏移位置的内存片段 private async Task UpdateMemorySegment(int offset, byte[] data) { await JS.InvokeVoidAsync("updateSharedMemory", offset, data); }
- JS端写入增量数据
接收C#传来的片段数据,直接写入预分配的内存块,随后触发WebGL渲染:
function updateSharedMemory(offset, data) { // 将数据写入指定偏移位置 sharedTypedArray.set(data, offset); // 触发渲染更新 renderWithWebGL(); }
关键注意事项:
- 可结合SignalR实现更高效的双向增量同步,减少JS互操作的通信开销。
- 若需频繁更新,可批量合并增量操作,进一步降低通信次数。
内容的提问来源于stack exchange,提问作者codetale
相关产品推荐
相关产品推荐

