从 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
完成后访问本机对象的脚本。在你的情况下,我猜你是 运行 你列出的代码,然后打开开发工具并从控制台手动尝试不同的东西,所以这对你来说可能不是问题。
提前致谢。
我无法从 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
完成后访问本机对象的脚本。在你的情况下,我猜你是 运行 你列出的代码,然后打开开发工具并从控制台手动尝试不同的东西,所以这对你来说可能不是问题。