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
相关产品推荐
相关产品推荐

