WebView2 AddHostObjectToScript调用带参宿主方法提示参数错误如何解决
WebView2 带参数调用注入宿主对象报错解决方案
核心问题原因
该报错通常由COM类暴露不完整、参数编组规则不匹配、调用方式错误三类原因导致,可按以下步骤逐一排查修复:
1. 修正宿主类的COM暴露配置
仅标注[ComVisible(true)]无法完整暴露方法的参数签名到COM层,需要额外添加类接口配置:
[ComVisible(true)] // 新增以下属性,自动公开类的方法、属性、参数签名到COM [ClassInterface(ClassInterfaceType.AutoDual)] public class Bridge { // 原有代码保持不变 // 注意:如果用到BridgeAnotherClass类型,该类也需要添加[ComVisible(true)]和对应ClassInterface属性 }
2. 修正注入调用方式
不需要通过ICoreWebView2Interop底层接口注入,直接使用WebView2官方封装的注入方法,避免底层接口兼容性问题:
async void InitializeAsync() { await webView.EnsureCoreWebView2Async(); // 替换原有interop注入代码 webView.CoreWebView2.AddHostObjectToScript("bridge", new Bridge()); }
3. 修正JS端调用方式
WebView2注入的宿主对象默认分为同步、异步两个调用分支:
- 同步调用(推荐,无参数编组开销,适合简单方法调用):
result = window?.chrome?.webview?.hostObjects.sync.bridge.Func("John");
- 异步调用(适合耗时方法):
需要使用invoke方法显式传递参数,避免自动编组出错:
result = await window?.chrome?.webview?.hostObjects.bridge.Func.invoke("John");
4. 版本兼容性排查
如果使用的WinAppSDK版本低于1.1,存在已知的带参数宿主调用BUG,升级到WinAppSDK 1.1及以上稳定版即可修复。
内容的提问来源于stack exchange,提问作者gby
相关产品推荐
相关产品推荐

