如何在win7同样支持Webview2 在 WPF 中使用本地 Webview2 ,如何不依赖系统 Runtime

news/2024/11/30 9:48:02/

项目运行环境:

  • .Net Framework 4.5.2

  • Windows 7 x64 Service Pack 1

  • WebView2 Microsoft.WebView2.FixedVersionRuntime.120.0.2210.91.x64

考虑到很多老项目,本项目使用的是.Net Framework 4.5.2.Net 更高版本的其实也是可以支持的。

1、下载 WebView2 固定版本 Runtime

WebView2 Runtime: https://developer.microsoft.com/zh-CN/microsoft-edge/webview2/#download

首先下载自己想要的固定版本的 WebView2 Runtime[1]

下载下来的文件为 Cab 格式的文件,此文件为压缩文件 

将其解压,可得到如下的目录

2、创建项目,将Webview2 复制到项目中

创建.Net Framework 4.5.2 WPF 项目,将解压的Webview2 复制到项目中,如下图所示:

文件夹 WebView2 中就是cap文件解压后的二进制文件以及文件夹

将 WebView2 文件夹中所有文件

属性 - 高级 - 复制到输入目录 设置为 如果较新则复制

属性 - 高级 - 生成操作 设置为 

如下图所示:

3、在项目的 MainWindow 后台代码中写逻辑

MainWindow.cs 文件中添加代码

 Public partial class MainWindow : Window{public string Url { get; set; } = "https://www.bing.com";public MainWindow(){InitializeComponent();}protected override async void OnContentRendered(EventArgs e){base.OnContentRendered(e);await webView.EnsureCoreWebView2Async(await CoreWebView2Environment.CreateAsync(Path.Combine(AppDomain.CurrentDomain.BaseDirectory;, "WebView2")));webView.Source = new Uri(Url);}}

添加后,即可在无 WebView2 Runtime 的系统中运行

4、一些问题

项目运行时,有些问题可能会出现,

  • 报错 Microsoft.Web.WebView2.Core.WebView2RuntimeNotFoundException:“Couldn't find a compatible Webview2 Runtime installation to host WebViews.” 这个可能是因为wenview2的文件没有设置为 较新则复制 导致的

  • 报错 System.ArgumentException:“WebView2 was already initialized with a different CoreWebView2Environment. Check to see if the Source property was already set or EnsureCoreWebView2Async was previously called with different values. 这个可能是因为在执行 OnContentRendered 方法前,,对CoreWebview2设置了source属性,此时webview2会自动初始化环境,后面不能重复初始化
    去掉source属性(设置属性或者在构造时去掉都可以)

    上面代码可以看到,Source 属性是在 最后才指定的

protected override async void OnContentRendered(EventArgs e){base.OnContentRendered(e);await webView.EnsureCoreWebView2Async(await CoreWebView2Environment.CreateAsync(Path.Combine(AppDomain.CurrentDomain.BaseDirectory;, "WebView2")));webView.Source = new Uri(Url);//最后才指定的Source}

5、运行

将生成的 Debug 直接拷贝到不存在 Webview2 的系统中,是可以运行的,如果报错,请参考第四点进行检查项目


http://www.ppmy.cn/news/1290590.html

相关文章

Nest 框架:解锁企业级 Web 应用开发的秘密武器(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

JavaScript可选链接

注:本节仍然使用之前的饭店的对象,可以看上几篇文章查看代码 ● 如果我们想要看看饭店周一的开门时间,我们会这么写 console.log(restaurant.openingHours.mon.open);原因是我们在开放时间中并没有定义周一的开放时间,所有会报错…

第9课 回声抑制(AEC+AGC+ANS)的实现

在第8课中,我们将推流端与播放端合并实现了一对一音视频聊天功能,一切看起来还不错。但在实际使用时,会遇到一个烦心的问题:说话时会听到比较大的回声,影响正常使用。所以,这节课我们来重点解决这个问题。 …

RabbitMQ 发送消息 绕过系统配置的 消息转换器方法

1. 背景 我负责的系统需要与其他系统交互,需要我将消息发送到 MQ 上,其他系统监听消息。 遇到问题,两个系统的发送消息格式都是不一致的,所以这个地方是需要协商打通的。 目前这个系统经我查阅发现用的 fastjson 的 jsonb 序列…

c++的三大特性之关于继承

目录 继承的概念及定义 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元,静态成员 继承的概念及定义 概念: 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类…

尚硅谷2023版Promise教程从入门到实战(讲师:任安萍)

一、前言:为什么会出现Promise? Promise的重要性我认为没有必要多讲,概括起来说就是五个字:必!须!得!掌!握!。 而且还要掌握透彻,在实际的使用中,有非常多…

安装jupyter notebook,jupyter notebook的简单使用

借助anaconda安装jupyter notebook,先下载anaconda然后在Anaconda Prompt中输入命令: 输入"jupyter notebook",在默认浏览器中打开jupyter notebook。 输入"jupyter notebook --no-browser",启动服务器,但不打…

【笔记】书生·浦语大模型实战营——第一课

群公告 1月3日*更新 第一次课程视频链接:https://www.bilibili.com/video/BV1Rc411b7ns/,第一次课程只需要记笔记,没有作业。第一次课程(1月3日)和第二次课程(1月5日)到本周末(1月7日)截止,笔记记录在 知乎/CSDN/Github 或者任何你…