WebView2 的生命周期
我使用C#调用WebView2控件,每次打开一个新的窗口,如何用编程的方式关闭他呢?我监听了webView2.CoreWebView2.NewWindowRequested事件,但是怎么获取这个新的webview2的对象呢?
我首先尝试的是,使用一个wpf控件上面放了webView2,当触发NewWindowRequested事件的时候手动创建这个控件,当控件销毁的时候调用webView.Dispose(),来销毁资源,
一切都很好,我也以为很好{:1_927:},然而是我太天真了。
当我使用尝试在网页上下载东西的时候,麻烦就来了{:1_909:}。调用webView.Dispose()了经常会导致异常,原因是:
System.InvalidOperationException”类型的未经处理的异常在 Microsoft.Web.WebView2.Core.dll 中发生
CoreWebView2 members cannot be accessed after the WebView2 control is disposed.
嗯……:rggrg看来是可能我前面的CoreWebView2资源没释放,先释放了WebView2,导致后面无法访问,出现了异常。
那么问题又来了,下载下来的对象在哪里获取,我打开了任务浏览器。发现每次下载的时候,的确会多一个msedgewebview2.exe进程,如图:
就算有的时候不触发异常,关闭下载的页面的控件,也会多了一个msedgewebview2.exe进程
那么问题来了,我如何获取这个下载时候的对象呢?我又翻了一下微软的帮助文档,发现了这么一段话:
我又有点懵逼了{:1_925:}
控制何时创建这些额外进程的逻辑取决于Chromium体系结构,超出了 WebView2 运行时的范围。{:301_1000:}
感觉已经超出了我的知识范围了,我小脑袋已经装不下。{:301_1005:}
请大神告知一下:
1:webview2下载资源文件后,如何释放资源对象 本帖最后由 Jack2002 于 2021-9-25 21:16 编辑
qq06314488 发表于 2021-9-25 19:14
我发现我的操作为什么会崩溃了,因为在我关闭页面的时候,没有关闭下载的悬浮窗的窗口
这个很大可能是个BUG,下载窗口似乎是个模态对话框,不关闭下载窗口就强行关闭父窗口一定会崩,官方的示例一样崩。 目前为止没用过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
搞定了,不会崩了,测试视频 https://streamja.com/qaz6l
本帖最后由 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
Jack2002 发表于 2021-9-25 13:04
不会崩溃的测试过程:
1、安装运行库
2、跟着官方文档一步一步建立项目,
我不知道您是怎么操作的,但是我运行了您的已编译程序,也是会存在崩溃的情况发生。
我是这么操作的:
1:先运行了您编译好的程序
2:点击“立即下载”,然后会新弹出一个窗口
3:在这个新的窗口中,点击“立即下载”这样会下载qq程序
4:等qq程序下载完成以后,我关闭这个刚刚弹出的窗口后,整个程序就自动崩溃了。
qq06314488 发表于 2021-9-25 16:42
我不知道您是怎么操作的,但是我运行了您的已编译程序,也是会存在崩溃的情况发生。
我是这么操作的:
...
晚上看看,在逛超市。 Jack2002 发表于 2021-9-25 16:53
晚上看看,在逛超市。
好的,我看到您上面发的视频,的确没有崩溃。
但是在我的电脑上面的确有崩溃的情况。
这个下载崩溃的事情,我尝试在3台电脑上运行都存在同样的情况
运行崩溃视频地址
上面是我运行您程序的录像,我上传到了阿里云盘上面了,您可以在线看一下。 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代码
<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代码
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);
}
}
Jack2002 发表于 2021-9-25 18:42
录了个视频,包含了整个过程。
视频地址: https://streamja.com/ooRpn
我发现我的操作为什么会崩溃了,因为在我关闭页面的时候,没有关闭下载的悬浮窗的窗口{:301_971:}
如果我直接关闭1号窗口,会导致程序崩溃,当时如果我先关闭2号窗口,再关闭1号窗口,就完全正常!!!{:301_1000:}
我得去看看怎么自动关闭这个下载的小东西,不能要求用户每次必须都手动关闭它吧。
页:
[1]
2