从 WebView2 页面访问 COM 对象时出现 'Access is denied' 或 Promise<Pending> 错误

'Access is denied' or Promise<Pending> errors seen while accessing the COM object from WebView2 page

提前致谢。

我无法从 JavaScript 代码与 WPF 应用程序中嵌入的 WebView2 控件进行通信,因为我看到错误,如 - 'Access is denied'、'Promise Pending' 等。我不确定是什么是错误的,因为这里的一切似乎都是正确的。

这是我的一段代码:

COM 对象:

 [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class NativeMethods
    {        
        public string SendMessage(string message)
        {
            return message;
        }
    }

包含 WebView2 的 WPF 用户控件

 public partial class WebView2Control : UserControl
 {
   public WebView2Control()
   {
      InitializeAsync();
   }
    async void InitializeAsync()
    {
      await webView.EnsureCoreWebView2Async(null);
      WebView_CoreWebView2Ready();
    }

     private void WebView_CoreWebView2Ready()
     {
       webView.CoreWebView2.AddHostObjectToScript("nativeMethods", new NativeMethods());
     }               
}

JavaScript 开发工具中的代码

你能分享项目的 运行 版本吗?我尝试创建自己的新 C# WPF 应用程序并粘贴了您的部分代码,但它似乎对我有用。

  • 对于尝试 1,我在 SendMessage 上有一个断点,当我从脚本调用 SendMessage 时看到断点命中。

  • 对于尝试 2,sync() 方法是一种异步方法,它会等待您调用它的代理完成,然后再完成自身并为您提供一个同步代理。所以你可能打算尝试代码 - 3.

  • 对于尝试 3,此代码对我也适用。如果我将 WebView2.CoreWebView2.Settings.AreHostObjectsAllowed 设置为 false 我得到的输出与你那里的输出相同。确保 属性 设置为 true,否则页面中的脚本将无法访问通过 AddHostObjectToScript.

    添加的对象

另一个需要注意的问题是任何竞争条件。请确保您是 运行 在 AddHostObjectToScript 完成后访问本机对象的脚本。在你的情况下,我猜你是 运行 你列出的代码,然后打开开发工具并从控制台手动尝试不同的东西,所以这对你来说可能不是问题。