WebView2能否将C# API直接暴露在window对象下而非window.chrome.webview.hostObjects?
WebView2 实现将C# API直接挂载到window对象
可以实现。WebView2默认会把通过AddHostObjectToScript暴露的C#对象放在window.chrome.webview.hostObjects.sync路径下,但你可以通过注入自定义JavaScript代码,将这个对象直接挂载到window全局对象上,实现和第三方插件类似的调用方式。
具体实现步骤:
暴露C#对象到WebView2的脚本宿主
先通过常规方式将你的C#类实例添加到WebView2的宿主对象中:private void WebView2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) { // 暴露C#对象到脚本宿主,命名为MyApi webView2.CoreWebView2.AddHostObjectToScript("MyApi", this); // 注入JS代码,将hostObjects下的对象挂载到window var injectScript = @" // 将宿主对象同步到window全局 window.MyApi = window.chrome.webview.hostObjects.sync.MyApi; // 可选:处理对象的属性/方法绑定,避免延迟加载问题 Object.defineProperty(window.MyApi, 'someProperty', { get: function() { return window.chrome.webview.hostObjects.sync.MyApi.someProperty; } }); "; webView2.CoreWebView2.ExecuteScriptAsync(injectScript); }网页中直接调用API
之后在网页的JavaScript里,就可以直接通过window.MyApi(或直接MyApi)调用C#方法:// 调用C#中的方法 MyApi.MyCSharpMethod(); // 访问C#中的属性 console.log(MyApi.MyCSharpProperty);
注意事项:
- 确保在
CoreWebView2初始化完成后再执行上述操作,否则会因宿主对象未就绪而报错。 - 如果C#对象包含异步方法或需要处理跨线程调用,可能需要额外处理同步/异步的适配,但挂载到window的方式不受影响。
内容的提问来源于stack exchange,提问作者Erik Bunnstad
相关产品推荐
相关产品推荐

