吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3239|回复: 10
收起左侧

[求助] WebView2 的生命周期

[复制链接]
qq06314488 发表于 2021-9-24 10:16
500吾爱币
我使用C#调用WebView2控件,每次打开一个新的窗口,如何用编程的方式关闭他呢?
我监听了webView2.CoreWebView2.NewWindowRequested事件,但是怎么获取这个新的webview2的对象呢?
我首先尝试的是,使用一个wpf控件上面放了webView2,当触发NewWindowRequested事件的时候手动创建这个控件,当控件销毁的时候调用webView.Dispose(),来销毁资源,
一切都很好,我也以为很好,然而是我太天真了。
当我使用尝试在网页上下载东西的时候,麻烦就来了。调用webView.Dispose()了经常会导致异常,原因是:
            System.InvalidOperationException”类型的未经处理的异常在 Microsoft.Web.WebView2.Core.dll 中发生
             CoreWebView2 members cannot be accessed after the WebView2 control is disposed.
嗯……看来是可能我前面的CoreWebView2资源没释放,先释放了WebView2,导致后面无法访问,出现了异常。
那么问题又来了,下载下来的对象在哪里获取,我打开了任务浏览器。发现每次下载的时候,的确会多一个msedgewebview2.exe进程,如图:
Snipaste_2021-09-24_10-00-17.png
就算有的时候不触发异常,关闭下载的页面的控件,也会多了一个msedgewebview2.exe进程
那么问题来了,我如何获取这个下载时候的对象呢?我又翻了一下微软的帮助文档,发现了这么一段话:
1632449073(1).jpg
我又有点懵逼了
[Asm] 纯文本查看 复制代码
控制何时创建这些额外进程的逻辑取决于Chromium体系结构,超出了 WebView2 运行时的范围。

感觉已经超出了我的知识范围了,我小脑袋已经装不下。
请大神告知一下:
1:webview2下载资源文件后,如何释放资源对象

最佳答案

查看完整内容

这个很大可能是个BUG,下载窗口似乎是个模态对话框,不关闭下载窗口就强行关闭父窗口一定会崩,官方的示例一样崩。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Jack2002 发表于 2021-9-24 10:16
本帖最后由 Jack2002 于 2021-9-25 21:16 编辑
qq06314488 发表于 2021-9-25 19:14
我发现我的操作为什么会崩溃了,因为在我关闭页面的时候,没有关闭下载的悬浮窗的窗口

这个很大可能是个BUG,下载窗口似乎是个模态对话框,不关闭下载窗口就强行关闭父窗口一定会崩,官方的示例一样崩。
Jack2002 发表于 2021-9-24 20:04
目前为止没用过webview2,以下是官方的Samples,可以克隆下来,编译后试试下载文件。
https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/
https://github.com/MicrosoftEdge/WebView2Samples#1-getting-started-guide
https://github.com/MicrosoftEdge/WebView2Samples/tree/master/SampleApps/WebView2APISample
Jack2002 发表于 2021-9-25 12:30
搞定了,不会崩了,测试视频 https://streamja.com/qaz6l
Jack2002 发表于 2021-9-25 13:04
本帖最后由 Jack2002 于 2021-9-25 13:07 编辑

不会崩溃的测试过程:
1、安装运行库
2、跟着官方文档一步一步建立项目,
3、在项目中通过 管理NuGet程序包 搜索 Microsoft.Web.WebView2 进行安装的。
4、跟着官方文档编写XAML、CS代码
5、编译后打开im.qq.com,点立即下载会弹出新窗口并打开下载页面,文件下载完毕再关闭下载文件页面不会崩溃。

会崩溃的过程就不写了,估计你的问题可能是没有安装运行库,还有就是通过NuGet命令行控制台使用 install-package 命令安装的 Microsoft.Web.WebView2。

已编译程序 https://lanzouw.com/iGF73uh6jjg
项目源代码 https://lanzouw.com/iJQdPuh6job

 楼主| qq06314488 发表于 2021-9-25 16:42
Jack2002 发表于 2021-9-25 13:04
不会崩溃的测试过程:
1、安装运行库
2、跟着官方文档一步一步建立项目,

我不知道您是怎么操作的,但是我运行了您的已编译程序,也是会存在崩溃的情况发生。
我是这么操作的:
1:先运行了您编译好的程序
2:点击“立即下载”,然后会新弹出一个窗口
3:在这个新的窗口中,点击“立即下载”这样会下载qq程序
4:等qq程序下载完成以后,我关闭这个刚刚弹出的窗口后,整个程序就自动崩溃了。
Jack2002 发表于 2021-9-25 16:53
qq06314488 发表于 2021-9-25 16:42
我不知道您是怎么操作的,但是我运行了您的已编译程序,也是会存在崩溃的情况发生。
我是这么操作的:
...

晚上看看,在逛超市。
 楼主| qq06314488 发表于 2021-9-25 17:29
Jack2002 发表于 2021-9-25 16:53
晚上看看,在逛超市。

好的,我看到您上面发的视频,的确没有崩溃。
但是在我的电脑上面的确有崩溃的情况。
这个下载崩溃的事情,我尝试在3台电脑上运行都存在同样的情况
运行崩溃视频地址
上面是我运行您程序的录像,我上传到了阿里云盘上面了,您可以在线看一下。
Jack2002 发表于 2021-9-25 18:42
qq06314488 发表于 2021-9-25 17:29
好的,我看到您上面发的视频,的确没有崩溃。
但是在我的电脑上面的确有崩溃的情况。
这个下载崩溃的事 ...

录了个视频,包含了整个过程。
视频地址: https://streamja.com/ooRpn

步骤和源代码:
1、安装运行库 https://go.microsoft.com/fwlink/p/?LinkId=2124703
2、创建项目
3、安装 Microsoft.Web.WebView2
4、编写XAML代码
[C#] 纯文本查看 复制代码
<Window x:Class="WebApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WebApp"
        xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <DockPanel>
        <DockPanel DockPanel.Dock="Top">
            <Button x:Name="ButtonGo" DockPanel.Dock="Right" Click="ButtonGo_Click" Content="Go"/>
            <TextBox Name = "addressBar" Text=""/>
        </DockPanel>
        <wv2:WebView2 Name = "webView"
                  Source = "https://im.qq.com"
    />
    </DockPanel>
</Window>

5、编写CS代码
[C#] 纯文本查看 复制代码
public MainWindow()
        {
            InitializeComponent();
            webView.NavigationStarting += EnsureHttps;
        }

        void EnsureHttps(object sender, CoreWebView2NavigationStartingEventArgs args)
        {
            String uri = args.Uri;
            if (!uri.StartsWith("https://"))
            {
                webView.CoreWebView2.ExecuteScriptAsync($"alert('{uri} is not safe, try an https link')");
                args.Cancel = true;
            }
        }

        private void ButtonGo_Click(object sender, RoutedEventArgs e)
        {
            if (webView != null && webView.CoreWebView2 != null)
            {
                webView.CoreWebView2.Navigate(addressBar.Text);
            }
        }

 楼主| qq06314488 发表于 2021-9-25 19:14
Jack2002 发表于 2021-9-25 18:42
录了个视频,包含了整个过程。
视频地址: https://streamja.com/ooRpn

我发现我的操作为什么会崩溃了,因为在我关闭页面的时候,没有关闭下载的悬浮窗的窗口

Snipaste_2021-09-25_19-11-17.png

如果我直接关闭1号窗口,会导致程序崩溃,当时如果我先关闭2号窗口,再关闭1号窗口,就完全正常!!!
我得去看看怎么自动关闭这个下载的小东西,不能要求用户每次必须都手动关闭它吧。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 22:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表