[{"data":1,"prerenderedAt":309},["ShallowReactive",2],{"page-\u002Fcsharp\u002Fwebview2技术":3},{"id":4,"title":5,"body":6,"description":12,"extension":302,"meta":303,"navigation":304,"path":305,"seo":306,"stem":307,"__hash__":308},"content\u002Fcsharp\u002Fwebview2技术.md","Webview2技术",{"type":7,"value":8,"toc":295},"minimark",[9,13,16,23,35,67,76,128,137,166,175,204,213,232,245,259,270,280],[10,11,12],"p",{},"​\twebview2是一中混合模式开发的解决方案，它可以用来与生态丰富的web技术栈接轨，做到不损失过多性能的同时，做到快速开发和组件封装等作用。 并且它可以和navtive原生应用更多的接轨，能够使用更多的底层提供的api（虽然浏览器内核也提供了）。并且呢，webview2可以有持久更新的开发和固定版本的开发，可以自行选择。",[10,14,15],{},"然后我们来看一下webview2的进程模型。",[10,17,18],{},[19,20],"img",{"alt":21,"src":22},"53e2ccd06e442962d590a7ed0a48b242","53e2ccd06e442962d590a7ed0a48b242.png",[24,25,27],"h4",{"id":26},"host-app-process-宿主应用进程",[28,29,30,34],"strong",{},[31,32,33],"code",{},"Host App Process"," (宿主应用进程)",[36,37,38,49],"ul",{},[39,40,41,44,45,48],"li",{},[28,42,43],{},"这是什么",": 这就是您自己的应用程序进程，例如您的 WPF 应用 ",[31,46,47],{},"Animation.exe","。",[39,50,51,54,55,58,59,62,63,66],{},[28,52,53],{},"作用",": 这个进程是“主人”，它",[28,56,57],{},"创建并“承载”了 WebView2 控件。它负责管理 WebView2 控件的生命周期、尺寸、位置","，并通过 WebView2 的 API 向其发送指令（例如 ",[31,60,61],{},"MapsToString(...)"," 或 ",[31,64,65],{},"ExecuteScriptAsync(...)","）。",[24,68,70],{"id":69},"browser-process-浏览器主进程",[28,71,72,75],{},[31,73,74],{},"Browser Process"," (浏览器主进程)",[36,77,78,91],{},[39,79,80,82,83,86,87,90],{},[28,81,43],{},": 这是整个 WebView2 进程组的“",[28,84,85],{},"大脑","”和“",[28,88,89],{},"总管","”。",[39,92,93,95,96],{},[28,94,53],{},":\n",[36,97,98,108,118],{},[39,99,100,103,104,107],{},[28,101,102],{},"协调者",": 它负责",[28,105,106],{},"管理所有的子进程（渲染进程、GPU进程等）","，并在它们崩溃时进行恢复。",[39,109,110,113,114,117],{},[28,111,112],{},"权限管理者",": 它是唯一拥有较高权限的 WebView2 进程。所有需要访问系统资源的操作，如",[28,115,116],{},"网络请求、文件读写、Cookie管理、权限申请","等，都由它统一处理。",[39,119,120,123,124,127],{},[28,121,122],{},"主 UI 线程",": 在独立浏览器中，它还负责",[28,125,126],{},"浏览器外壳（地址栏、标签页）的UI响应","，确保核心界面不被卡死。在 WebView2 中，它主要扮演后台总管的角色。",[24,129,131],{"id":130},"renderer-process-渲染进程",[28,132,133,136],{},[31,134,135],{},"Renderer Process"," (渲染进程)",[36,138,139,151],{},[39,140,141,143,144,147,148,90],{},[28,142,43],{},": 这是处理网页内容的“",[28,145,146],{},"主力军","”或“",[28,149,150],{},"工作车间",[39,152,153,95,155],{},[28,154,53],{},[36,156,157,160,163],{},[39,158,159],{},"负责解析 HTML、CSS，构建 DOM 树。",[39,161,162],{},"执行 JavaScript 代码。",[39,164,165],{},"将网页内容计算并“绘制”成位图。",[24,167,169],{"id":168},"gpu-process-gpu-进程",[28,170,171,174],{},[31,172,173],{},"GPU Process"," (GPU 进程)",[36,176,177,182,198],{},[39,178,179,181],{},[28,180,43],{},": 专门负责与显卡 (GPU) 打交道的进程。",[39,183,184,95,186],{},[28,185,53],{},[36,187,188,195],{},[39,189,190,191,194],{},"处理所有需要",[28,192,193],{},"硬件加速","的任务，例如 CSS 动画、3D 变换、WebGL 渲染以及视频的硬件解码。",[39,196,197],{},"将渲染进程“绘制”好的位图层进行最终的合成，然后提交给操作系统显示。",[39,199,200,203],{},[28,201,202],{},"存在的原因",": 显卡驱动程序有时可能不稳定。将所有 GPU 操作隔离在一个独立的进程中，即使 GPU 驱动崩溃，也只会导致 GPU 进程重启，而不会让您的整个应用程序崩溃。",[24,205,207],{"id":206},"utility-process-实用工具进程",[28,208,209,212],{},[31,210,211],{},"Utility Process"," (实用工具进程)",[36,214,215,227],{},[39,216,217,219,220,223,224,48],{},[28,218,43],{},": 一个通用的",[28,221,222],{},"辅助进程","，用于",[28,225,226],{},"执行一些浏览器主进程不方便处理的、相对独立的任务",[39,228,229,231],{},[28,230,53],{},": 例如，处理网络服务、数据解码、音频播放等。这有助于进一步减轻浏览器主进程的负担。",[10,233,234,235,238,239,62,242,66],{},"​\t并且我们也看到了，宿主进程和网页js的代码是用ipc的进程通信完成的。不知道你有没有发现browser process来完成文件读写和网络请求。这说明：它调用的是",[28,236,237],{},"浏览器内核自身实现的一套服务","，而不是在 C#\u002F.NET 宿主应用中使用的那些服务（比如 ",[31,240,241],{},"System.Net.Http.HttpClient",[31,243,244],{},"System.IO.File",[10,246,247,248,251,252,255,256,48],{},"​\t因此可以说webview2进程组是运行在一个隔离的沙箱环境中的。可以类比为虚拟机，有自己的",[28,249,250],{},"高性能网络库","，自己的",[28,253,254],{},"io模块","和",[28,257,258],{},"渲染引擎",[260,261,263],"h3",{"id":262},"唯一的例外webresourcerequested-事件",[28,264,265,266,269],{},"唯一的例外：",[31,267,268],{},"WebResourceRequested"," 事件",[10,271,272,273,275,276,279],{},"​\tWPF-UI 提供了一个强大的事件叫 ",[31,274,268],{},"。它允许您的宿主应用",[28,277,278],{},"在 WebView2 的浏览器进程将要发起网络请求时“拦截”这个请求","。这时，您可以：",[281,282,283,286,289],"ol",{},[39,284,285],{},"让请求按原计划继续。",[39,287,288],{},"阻止这个请求。",[39,290,291,294],{},[28,292,293],{},"用您自己的方式处理这个请求","，然后将结果返回给 WebView2。",{"title":296,"searchDepth":297,"depth":297,"links":298},"",2,[299],{"id":262,"depth":300,"text":301},3,"唯一的例外：WebResourceRequested 事件","md",{},true,"\u002Fcsharp\u002Fwebview2技术",{"description":12},"csharp\u002Fwebview2技术","C343zg2UnSaAoajhNcrzyXficNqE-JWCLP7y05wmc1o",1791042465293]