Webview2技术

​ webview2是一中混合模式开发的解决方案,它可以用来与生态丰富的web技术栈接轨,做到不损失过多性能的同时,做到快速开发和组件封装等作用。 并且它可以和navtive原生应用更多的接轨,能够使用更多的底层提供的api(虽然浏览器内核也提供了)。并且呢,webview2可以有持久更新的开发和固定版本的开发,可以自行选择。

然后我们来看一下webview2的进程模型。

53e2ccd06e442962d590a7ed0a48b242

Host App Process (宿主应用进程)

  • 这是什么: 这就是您自己的应用程序进程,例如您的 WPF 应用 Animation.exe。
  • 作用: 这个进程是“主人”,它创建并“承载”了 WebView2 控件。它负责管理 WebView2 控件的生命周期、尺寸、位置,并通过 WebView2 的 API 向其发送指令(例如 MapsToString(...) 或 ExecuteScriptAsync(...))。

Browser Process (浏览器主进程)

  • 这是什么: 这是整个 WebView2 进程组的“大脑”和“总管”。
  • 作用:
    • 协调者: 它负责管理所有的子进程(渲染进程、GPU进程等),并在它们崩溃时进行恢复。
    • 权限管理者: 它是唯一拥有较高权限的 WebView2 进程。所有需要访问系统资源的操作,如网络请求、文件读写、Cookie管理、权限申请等,都由它统一处理。
    • 主 UI 线程: 在独立浏览器中,它还负责浏览器外壳(地址栏、标签页)的UI响应,确保核心界面不被卡死。在 WebView2 中,它主要扮演后台总管的角色。

Renderer Process (渲染进程)

  • 这是什么: 这是处理网页内容的“主力军”或“工作车间”。
  • 作用:
    • 负责解析 HTML、CSS,构建 DOM 树。
    • 执行 JavaScript 代码。
    • 将网页内容计算并“绘制”成位图。

GPU Process (GPU 进程)

  • 这是什么: 专门负责与显卡 (GPU) 打交道的进程。
  • 作用:
    • 处理所有需要硬件加速的任务,例如 CSS 动画、3D 变换、WebGL 渲染以及视频的硬件解码。
    • 将渲染进程“绘制”好的位图层进行最终的合成,然后提交给操作系统显示。
  • 存在的原因: 显卡驱动程序有时可能不稳定。将所有 GPU 操作隔离在一个独立的进程中,即使 GPU 驱动崩溃,也只会导致 GPU 进程重启,而不会让您的整个应用程序崩溃。

Utility Process (实用工具进程)

  • 这是什么: 一个通用的辅助进程,用于执行一些浏览器主进程不方便处理的、相对独立的任务。
  • 作用: 例如,处理网络服务、数据解码、音频播放等。这有助于进一步减轻浏览器主进程的负担。

​ 并且我们也看到了,宿主进程和网页js的代码是用ipc的进程通信完成的。不知道你有没有发现browser process来完成文件读写和网络请求。这说明:它调用的是浏览器内核自身实现的一套服务,而不是在 C#/.NET 宿主应用中使用的那些服务(比如 System.Net.Http.HttpClient 或 System.IO.File)。

​ 因此可以说webview2进程组是运行在一个隔离的沙箱环境中的。可以类比为虚拟机,有自己的高性能网络库,自己的io模块和渲染引擎。

唯一的例外:WebResourceRequested 事件

​ WPF-UI 提供了一个强大的事件叫 WebResourceRequested。它允许您的宿主应用在 WebView2 的浏览器进程将要发起网络请求时“拦截”这个请求。这时,您可以:

  1. 让请求按原计划继续。
  2. 阻止这个请求。
  3. 用您自己的方式处理这个请求,然后将结果返回给 WebView2。