在 WPF 中使用本地 Webview2 ,如何不依赖系统 Runtime

爱编程的鼠鼠 2024-01-03 10:56:43

 在 WPF 中使用本地 Webview2 ,如何不依赖系统 Runtime

在 WPF 中使用本地 Webview2 ,如何不依赖系统 Runtime

作者:WPFDevelopersOrg - ArcherSong

项目运行环境:

  • .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[1]

https://img-blog.csdnimg.cn/img_convert/1ba1e880b90f4242c9e881d996e23b3f.png

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

https://img-blog.csdnimg.cn/img_convert/cf156c48434e79a566c9e5d5f1e2b194.png

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

\MICROSOFT.WEBVIEW2.FIXEDVERSIONRUNTIME.120.0.2210.91.X64
├─EBWebView
│  ├─x64
│  └─x86
├─edge_feedback
├─Extensions
├─Locales
├─MEIPreload
├─Notifications
├─PdfPreview
├─Trust Protection Lists
│  ├─Mu
│  └─Sigma
└─WidevineCdm
    └─_platform_specific
        └─win_x64

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

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

https://img-blog.csdnimg.cn/img_convert/e4433cc8c8e11f49517a01690eabf608.png

https://img-blog.csdnimg.cn/img_convert/03ef03270e399dd17d83fda7eec237a2.png

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

WebView2 文件夹中所有文件

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

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

如下图所示:

https://img-blog.csdnimg.cn/img_convert/37a9c569ff4b0c493b3792464387a5c8.png

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

MainWindow.cs 文件中添加代码

Public partial class MainWindow : Window
    {
      public string Url { getset; } = "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 的系统中,是可以运行的,如果报错,请参考第四点进行检查项目

https://img-blog.csdnimg.cn/img_convert/415b36ec51f992eae23d4c2aff51eac0.png

参考资料

[1]

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

文章来源(CC-BY-SA知识共享):https://blog.csdn.net/sD7O95O/article/details/135321869

...全文
607 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

6,227

社区成员

发帖
与我相关
我的任务
社区描述
微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。
windowsmicrosoft 企业社区
社区管理员
  • 微软技术分享
  • 郑子铭
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。

予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

试试用AI创作助手写篇文章吧