首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UWP崩溃中的WebView2 AddHostObjectToScript

UWP崩溃中的WebView2 AddHostObjectToScript
EN

Stack Overflow用户
提问于 2022-09-05 13:48:41
回答 1查看 142关注 0票数 1

我试图使用C#将一个WebView2对象传递给AddHostObjectToScript。在没有成功地从webview检索对象之后,我使用了调试器,发现AddHostObjectToScript调用永远不会完成。

下面是完整的代码片段:

代码语言:javascript
运行
复制
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class Example
{
    public string Prop { get; set; } = "example";
}

namespace Example_UWP
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            InitializeComponent();
            InitializeAsync();
        }

        public async Task InitializeAsync()
        {
            await ExampleView.EnsureCoreWebView2Async();

            ExampleView.Source = new Uri("http://localhost:3000");
            ExampleView.CoreWebView2.OpenDevToolsWindow();

            ExampleView.CoreWebView2.AddHostObjectToScript("example", new Example());
        }
    }
}

因此,example对象在chrome.webview.hostObjectschrome.webview.hostObjects.sync中不可用。函数引发以下错误:

组或资源未处于执行请求操作的正确状态。

我尝试过不同的方法,但都没有成功,例如:

InitializeAsync

  • Wait内的
  • 在属性中保持对Example实例的引用,以避免在事件NavigationCompleted添加宿主对象之前和之后添加主机对象。
  • 在添加主机对象之前等待5秒。H 220F 221

我使用的是Microsoft.Web.WebView2版本1.0.1264.42

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-16 18:48:52

为了与第三方库进行交互,需要向您的解决方案添加一个非常特定的C++项目,即Windows组件(C++/WinRT),该解决方案必须称为WinRTAdapter

接下来,您必须从名为C++的NuGet安装一个库到您的Microsoft.Web.WebView2项目。

完成此操作后,您必须将第三方库作为参考。

接下来,转到您的C++项目属性,转到公共属性并选择WebView2

在这里,您必须做四个更改:

No.

  • Set
  • Set使用WebView2 WinRT API to 使用wv2winrt工具 to Yes.
    • Set 使用Javascript case to Yes.
    • Edit 过滤器E 233并添加以下内容:H 234F 235

代码语言:javascript
运行
复制
Windows.System.UserProfile
Windows.Globalization.Language
CallJSInterface

CallJSInterface是我的第三方名称空间的名称。

单击OK并构建C++库。

在构建了C++ lib (WinRTAdapter)之后,必须将其作为参考添加到主项目中。

现在,我们需要做一些更改,以便能够调用第三方库中的函数。第一个是注册它。我们在相同的LoadLocalPage()函数中执行此操作,这是在NavigationCompleted上进行的:

代码语言:javascript
运行
复制
var namespacesName = "CallJSInterface";
var dispatchAdapter = new WinRTAdapter.DispatchAdapter();
core_wv2.AddHostObjectToScript(namespacesName, dispatchAdapter.WrapNamedObject(namespacesName, dispatchAdapter));

其中CallJSInterface是您的命名空间。之后,您需要像这样在JS中注册您的函数:

代码语言:javascript
运行
复制
var callJS;
if (chrome && chrome.webview) {
    chrome.webview.hostObjects.options.defaultSyncProxy = true;
    chrome.webview.hostObjects.options.forceAsyncMethodMatches = [/Async$/];
    chrome.webview.hostObjects.options.ignoreMemberNotFoundError = true;
    window.CallJSInterface = chrome.webview.hostObjects.sync.CallJSInterface;
    callJS = new CallJSInterface.CallJSCSharp();
}

CallJSInterface再次出现在您的命名空间中。现在,您可以像这样调用JS ( async()是强制性的):

代码语言:javascript
运行
复制
callJS.async().KeepScreenOn()

如果你需要更多细节,我在我的网站上有一个完整的教程:

https://supernovaic.blogspot.com/2022/10/from-webview-to-webview2-in-uwp.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73610413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档