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

.NET 7 WebAssembly与JavaScript间高效传递二进制数据方法

.NET WASM(无Blazor)与JS高效传递二进制文件方案

针对你用.NET 7的[JSExport]/[JSImport]做WASM和JS互操作、传递大二进制文件的需求,直接给你最实用的方案:

核心结论

  1. 不能直接传Blob:.NET WASM的JS互操作不原生支持Blob类型,必须转成底层二进制类型。
  2. byte[]思路完全正确:推荐用JS的Uint8Array和.NET的byte[]互转,这是性能最优的方式——两者可以共享内存区域,几乎无额外拷贝,适合大文件。

完整实现示例

C# 代码(编译为WASM)

using System.Runtime.InteropServices.JavaScript;

public partial class MyFileProcessor
{
    // 导出方法给JS调用,参数直接用byte[]
    [JSExport]
    internal static string ProcessFile(byte[] fileBytes)
    {
        // 这里写你的文件处理逻辑,比如读取二进制内容、解析格式等
        // 示例:返回文件大小和前10个字节的十六进制
        var sizeInfo = $"文件大小:{fileBytes.Length} 字节";
        var preview = BitConverter.ToString(fileBytes.Take(10).ToArray()).Replace("-", " ");
        return $"{sizeInfo}\n前10字节预览:{preview}";
    }
}

JavaScript 代码

// 假设已加载.NET WASM模块,获取导出对象
const dotnetcode = await getAssemblyExports(config.mainAssemblyName);

// 示例:创建一个测试Blob(实际场景可替换为用户上传的File对象,File是Blob的子类)
const testBlob = new Blob([new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64])], { type: "application/octet-stream" });

// 将Blob转换为Uint8Array(高效无拷贝的方式)
async function blobToUint8Array(blob) {
    const arrayBuffer = await blob.arrayBuffer();
    return new Uint8Array(arrayBuffer);
}

// 调用.NET方法
async function processFileFromJS() {
    const fileUint8Array = await blobToUint8Array(testBlob);
    const result = dotnetcode.MyFileProcessor.ProcessFile(fileUint8Array);
    console.log(result);
}

// 执行调用
processFileFromJS();

关键注意事项

  • 避免用字符串传递二进制:把二进制转成Base64字符串传递会增加33%的体积,还需要额外编码解码,性能极差,绝对不推荐。
  • 超大文件分块处理:如果文件超过100MB,建议分块(比如每次传1MB),避免一次性占用过多内存导致浏览器卡顿或崩溃。
  • 内存共享细节:.NET 7+的WASM实现中,JS的Uint8Array会直接映射到.NET的byte[]内存,不需要完整拷贝,这是这种方案性能高的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:15:05