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

Blazor WebAssembly是否支持调用第三方WASM文件?

在Blazor WASM中调用自定义C++ WASM函数

可以直接实现,下面是完整的步骤和示例:

1. 正确编译C++代码到可调用的WASM

直接编译你的C++代码不会自动导出TestAddition函数供外部调用,需要使用Emscripten工具链,并通过编译参数指定导出规则:

编译命令示例:

emcc TestAddition.cpp -o TestAddition.js -s EXPORTED_FUNCTIONS='["_TestAddition"]' -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'

执行后会生成两个文件:TestAddition.js(JS胶水代码,负责WASM与外部的交互)和TestAddition.wasm。

2. 在Blazor项目中引入文件

  • 将生成的TestAddition.js和TestAddition.wasm复制到Blazor项目的wwwroot目录下。
  • 在wwwroot/index.html中引入TestAddition.js,放在Blazor核心脚本之前:
<script src="TestAddition.js"></script>
<script src="_framework/blazor.webassembly.js"></script>

3. 在C#代码中调用WASM函数

通过Blazor的IJSRuntime调用JS胶水代码提供的接口,间接调用C++函数,有两种常用方式:

方式1:用ccall直接调用

在Blazor组件中注入IJSRuntime,然后编写调用逻辑:

@inject IJSRuntime JSRuntime

<button @onclick="CallAddition">调用C++加法函数</button>
<p>计算结果: @calculationResult</p>

@code {
    private int calculationResult;

    private async Task CallAddition()
    {
        // ccall参数说明:函数名、返回值类型、参数类型数组、传入的参数值
        calculationResult = await JSRuntime.InvokeAsync<int>("ccall", 
            "TestAddition",
            "number",
            new[] { "number", "number" },
            4, 6);
    }
}

方式2:用cwrap包装函数(适合多次调用)

先在JS中包装C++函数为可复用的JS方法,再在C#中调用:

  • 在wwwroot/index.html中添加自定义JS代码:
<script>
    // 将C++函数包装为全局JS函数
    window.invokeTestAddition = Module.cwrap('TestAddition', 'number', ['number', 'number']);
</script>
  • 然后在C#中调用这个全局JS函数:
private async Task CallAddition()
{
    calculationResult = await JSRuntime.InvokeAsync<int>("invokeTestAddition", 4, 6);
}

关键注意事项

  • Emscripten导出的C++函数默认会加下划线前缀,但使用ccall/cwrap时直接写原函数名即可,胶水代码会自动映射。
  • 确保你的Blazor项目是WASM类型(而非Server模式),Server模式运行在服务器端,无法访问客户端的WASM资源。
  • 类型要匹配:C++的int对应JS的number,在C#中用int类型接收结果即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:46:13