谈到嵌入式浏览器,业界提供了各种各样的解决方案:免费的和收费的,开源的和专有的。这些解决方案在功能、使用方式和附带服务等方面都各不相同。本文旨在帮助您做出正确的选择。
在选择 DotNetBrowser 还是 CefSharp 一文中,我们拿开源的 CefSharp 与 DotNetBrowser 进行了比较,并给出了如何选择的建议。
今天,我们将聚焦于专有的 WebView2,并说明为什么在商业应用场景中,DotNetBrowser 是更合适的选择。我们将先从组织和法律方面开始讨论,然后再探讨其功能差异。
迁移到 DotNetBrowser 并不复杂。请参阅详细的迁移指南,其中介绍了迁移步骤和需要了解的要点。
概览
| 授权类型 | 专有 | 商业授权 |
| 支持的操作系统 | 仅限 Windows | Windows、macOS、Linux |
| 支持的 UI 工具包 | WinForms、WPF、WinUI 3、MAUI | WinForms、WPF、WinUI 3、Avalonia |
| 数据收集 | 是 | 否 |
| 无头模式 | 不支持 | 支持,可在控制台或服务中运行 |
| 技术支持 | 公开的 GitHub 存储库 | 提供保密支持,含服务等级协议(SLA) |
DotNetBrowser 和 WebView2 均来自在此领域拥有丰富经验的商业公司,是成熟的解决方案。因此,您获得的一定是一个功能正常且不依赖开源社区的软件解决方案。
以下情况选择 WebView2:
- 您必须使用免费软件。
- 您想要利用常青分发的优势。
- 您不介意与微软共享终端用户的数据。
以下情况选择 DotNetBrowser:
- 您需要自定义功能。
- 您希望在使用产品时获得帮助。
- 您希望以保密方式报告问题并解决问题。
- 您希望控制终端用户的数据收集。
- 您需要在没有用户界面的情况下运行应用程序。
- 您需要在 Linux 和 macOS 上运行。
- 您需要在浏览器播放受 DRM 保护的视频时,在其上方叠加 WPF 控件。
- 您需要自行处理页面发起的
window.print()调用,或读取打印机功能。 - 您需要在后台线程而非 UI 线程上拦截流量。
方法上的差异
WebView2 是微软提供的一个控件。它是免费的,但正如大家从微软产品中所期待的那样,它也是专有的。它是基于 Trident 的 WebView 的替代品,改用了 Edge。
WebView2 是一个控件:Visual Studio 工具箱中的一个项目,来自 Microsoft.Web.WebView2.Core.dll 文件的类。但它并不是像 Office 或 Power BI 这样的独立微软产品。微软用于提问和报告错误的公开渠道是一个 GitHub 存储库,不保证响应时间。
DotNetBrowser 是由专注于浏览器嵌入的公司 TeamDev 创建和开发的产品。我们从 2004 年开始使用 Internet Explorer,后来又继续使用 Safari 和 WebKit——最终在 2013 年稳定下来使用 Chromium。
2015 年,我们推出了 DotNetBrowser。它是一个专为商业用途设计的商业产品。除了软件和文档外,我们的服务还包括专门的客户服务专员、技术支持和高级服务。
商业差异
修复、功能和帮助
当您发现错误或需要新功能时,如何获得帮助?下面具体看看 WebView2 和 DotNetBrowser 分别提供哪些支持。
WebView2 通过一个专门的 GitHub 存储库收集公众的反馈。当您需要报告问题时,您可以在那里创建一个问题。如果微软开发人员认为您的报告有价值,他们会将其转移到内部系统进行处理。为了让您了解问题的处理状态,他们会使用“已跟踪”标签来标记这些问题。
DotNetBrowser 设有专门的客户服务台系统,客户提交的报告会严格保密。我们保证的首次响应时间,或服务等级协议(SLA),为一个工作日。
技术支持包括:产品使用帮助、故障排除协助、错误修复以及考虑功能请求。您的所有支持请求将由 DotNetBrowser 的软件工程师处理。
终端用户隐私
终端用户安装的 WebView2 Runtime 附带其自身的许可条款。您可以在微软的 WebView2 页面上点击下载按钮查看这些条款。其中有两点可能会引起您的关注:
- 微软可能会收集有关您终端用户的信息。
- 在默认设置下,您需要告知终端用户这一点。
许可条款第 3(a) 节规定,该软件可能会收集有关您和您终端用户使用该软件的信息,并将其发送给微软。您使用该软件即表示同意这一做法。
第 3(b) 节规定,Microsoft Defender SmartScreen 默认处于启用状态。只要它处于启用状态,第 9(a) 节就要求您告知用户:您的软件包含 SmartScreen,并会将他们的信息发送给微软。您可以通过 IsReputationCheckingRequired 设置将其关闭。
如果您随应用一起分发 Runtime(固定版本),对应的是其许可条款的第 4(a)、4(b) 和 8 节。微软在其数据隐私页面上说明了 WebView2 会收集哪些信息。
DotNetBrowser 不会收集有关您和您终端用户的信息。此外,它还可以防止 Google 收集数据。有关 DotNetBrowser 如何处理数据以及如何让您控制隐私的更多信息,请参阅隐私惯例。
技术差异
从技术角度来看,DotNetBrowser 和 WebView2 并没有太大的区别。两者都有类似的架构,其中 Chromium 在单独的进程中运行。两者都有数百个功能,其中大部分都是重叠的。
然而,差异确实存在。当选择适合您情况的解决方案时,这些差异可能是至关重要的。本文的比较基于 WebView2 SDK 1.0.4258.31(2026 年 9 月)。让我们来看看具体差别在哪儿。
分发与部署
您可以将 WebView2 Runtime 与您的应用程序一起分发,也可以使用终端用户计算机上已安装的 Runtime。这些是分发模式:分别是固定版本和常青版本。
在固定版本模式下,您可以控制应用程序中 WebView2 的版本,这有利于稳定性。在常青版本模式下,您可以让微软负责后勤和更新,并缩小软件的大小。
而 DotNetBrowser 则需要与您的应用程序一起打包。这是唯一直接支持的分发模式。
Chrome 扩展程序
DotNetBrowser 和 WebView2 都支持扩展程序。虽然 WebView2 提供了非常基础的功能,但 DotNetBrowser 为开发者提供了更多的选项,并且完全控制扩展程序的生命周期和活动。
自 SDK 1.0.2210.55(2023 年 12 月)起,WebView2 开发者可以从尚未打包的扩展程序文件夹安装扩展程序、列出已安装的扩展程序、启用或禁用扩展程序,以及将其移除。但它不支持从 Chrome 应用商店安装,也没有用于扩展程序图标、徽章或弹出窗口的 API。
在 DotNetBrowser 中,开发者可以直接从 CRX 文件中安装扩展程序,程序化地“点击”扩展程序图标,与扩展程序可能打开的弹出窗口和新“标签页”进行交互。
此外,您还可以让用户直接与扩展程序进行交互:
- 启用使用 Chrome 应用商店。
- 显示带有徽章和标签的扩展程序图标。
- 显示扩展程序创建的弹出窗口和“标签页”。
无 UI 运行
对于自动化或生成 PDF 报告等用例,无需用户界面。相反,无头运行更简单、更高效。
WebView2 没有无头模式。即使在控制台应用程序中,它也需要一个窗口(可以是隐藏的)以及一个带有消息循环的 UI 线程。微软官方不支持在 Windows 服务中使用 WebView2。无窗口渲染(离屏渲染)仍是一项尚未实现的功能请求。
在 DotNetBrowser 中,无头运行是开箱即用的。您可以在控制台应用程序、网络服务器甚至 Windows 服务中使用它。就像这样:
using (IEngine engine = EngineFactory.Create())
{
using (IBrowser browser = engine.CreateBrowser())
{
browser.Navigation.LoadUrl("https://teamdev.com/dotnetbrowser").Wait();
}
}
Linux 和 macOS
2024 年,微软正式拒绝了在 WebView2 中支持 macOS 和 Linux 的计划。
DotNetBrowser 是一个跨平台库,可以在 Windows、macOS 和 Linux 上运行。您可以将其与 Avalonia UI 一起使用,或在服务器应用程序中使用它。
WPF 和重叠控件
WebView2 和 DotNetBrowser 都可以将 WPF 元素放在浏览器之上。WebView2 通过第二种 WPF 控件实现,DotNetBrowser 则通过一种适用于其支持的所有 UI 工具包的渲染模式实现。
标准的 WebView2 控件做不到这一点。它嵌入了一个外部窗口,而 WPF 不支持在不同窗口中渲染的区域之间的重叠,因此放在浏览器之上的元素会被遮挡。
在 SDK 1.0.2957.106(2025 年 1 月)中,WebView2 加入了 WebView2CompositionControl。它可以直接替换标准控件,并允许 WPF 元素绘制在浏览器之上。更多信息请参阅 WPF 应用中的 WebView2。
WebView2 的合成控件不嵌入窗口,而是通过 Windows 图形捕获会话将浏览器的输出捕获为图像,再自行绘制。微软指出了两个代价:帧率可能低于标准控件,并且受 DRM 保护的视频无法显示。
在 WPF 之外,WebView2 没有这样的控件。在 WinForms 中也不需要它:按钮或任何其他不透明的控件都能绘制在 WebView2 和 DotNetBrowser 之上。透明控件则不同:在两者中,它显示的都是后面的窗体,而不是页面。
Win32 应用可以使用 WebView2 的视觉托管模式,将浏览器组合到自己的界面中。在 WinUI 3 中,WebView2 属于外部内容。XAML 元素可以放在它之上,但它后面的内容无法透出,因此浏览器的背景无法设为透明。
DotNetBrowser 有两种渲染模式。在离屏渲染模式下,渲染的像素被复制到 .NET 进程内存中,并由常规控件绘制。因此,WPF、WinForms、WinUI 3 和 Avalonia 控件都可以与浏览器重叠。在该模式下,受 DRM(Widevine)保护的视频可以正常播放并显示,如下方截图所示。
在 DotNetBrowser 中,离屏渲染同样会降低帧率。另一种模式,即硬件加速模式,会嵌入一个原生窗口,因此与 WebView2 的标准控件存在同样的重叠限制。

离屏渲染模式下,叠加在受 Widevine 保护的视频之上的 WPF 控件。Sintel © Blender Foundation | durian.blender.org, CC BY 3.0.
从 .NET 调用 JavaScript
在两种解决方案中,您都可以直接从 .NET 代码中执行 JavaScript。不同之处在于当结果从 Chromium 传回到 .NET 世界时发生了什么。
WebView2 会将结果转换为 JSON:
string result = await coreWebView2.ExecuteScriptAsync(@"'example'");
Debug.Assert(result == "\"example\"");
自 SDK 1.0.2277.86(2024 年 2 月)起,WebView2 的 ExecuteScriptWithResultAsync 可以将结果作为普通字符串(而非 JSON)返回,并报告脚本异常。但它仍然无法返回对 JavaScript 对象的引用。
DotNetBrowser 则自动转换成简单的类型。对于复杂类型,它会用实际 V8 对象的代理进行替换:
string title = await browser.MainFrame.ExecuteJavaScript<string>("document.title");
IJsObject window = await browser.MainFrame.ExecuteJavaScript<IJsObject>("window");
// 或者,您也可以使用动态类型。
dynamic document = browser.MainFrame.ExecuteJavaScript("document").Result;
document.write("Hello world!");
从 JavaScript 调用 .NET
两种解决方案都允许在 JavaScript 中使用 .NET 对象,但各有限制。
在 WebView2 中,对象是通过 COM 传给 JavaScript 的,因此只有 COM 能处理的类型才可以使用。普通类、数组和 WPF 按钮都能正常使用,但添加 List<string> 或 WinForms 按钮时会抛出异常。WebView2 还允许页面和应用互相发送 Web 消息,但一条消息只能携带字符串或 JSON:JavaScript 拿到的是数据的副本,而不是可以调用的对象。
在 DotNetBrowser 中,您可以注入任何对象,包括被 WebView2 拒绝的 List<string> 和 WinForms 按钮。在 JavaScript 中,您将能够访问注入对象的公共成员和索引属性。来自 JavaScript 的调用在后台线程上运行,因此操作 UI 控件的代码需要先切换到 UI 线程(WPF 用 Dispatcher,WinForms 用 Invoke)。
拦截流量
WebView2 和 DotNetBrowser 都可以拦截流量。WebView2 在 UI 线程上进行拦截,DotNetBrowser 则在后台线程上进行。
WebView2 提供 WebResourceRequested 事件。在其处理程序中,您可以修改请求的 URL、方法、标头或正文,或者返回您自己的响应。对于您返回的内容,不会加载其源映射(source map)。WebResourceResponseReceived 事件则可以让您查看响应,但不能修改它。
WebResourceRequested 只对符合您所注册过滤器(URL 模式加资源类型)的请求触发。自 SDK 1.0.2365.46(2024 年 2 月)起,过滤器还可以捕获来自 Service Worker、Shared Worker 和跨源 iframe 的请求。旧的双参数过滤器重载已被弃用,因为它会遗漏这些 iframe。
WebView2 在应用的 UI 线程上触发该事件。一个阻塞三秒的处理程序会让窗口卡住,并让页面加载延迟三秒。处理程序可以调用 GetDeferral(),在异步代码中完成处理,但请求仍会一直等到您完成该延迟(deferral)。
DotNetBrowser 为请求的每个步骤都提供了处理程序,并为响应提供了事件。借助它们,您可以:
- 过滤 HTTP 请求。
- 重定向 HTTP 请求。
- 重写 HTTP 请求和响应标头。
- 重写请求上传数据。
- 过滤 Cookie。
- 对请求进行身份验证。
- 验证证书。
- 接收响应开始、已接收字节和请求完成的事件。
在 DotNetBrowser 中,如需返回您自己的响应,您可以在创建引擎时为每个协议(包括 https)注册一个处理程序。该协议的所有请求都会到达这个处理程序,因此无需维护过滤器列表。
您可以在我们的 GitHub 上找到 DotNetBrowser 中网络功能的更多示例。
Printing API
WebView2 和 DotNetBrowser 都提供打印 API。区别在于:当页面调用 window.print() 时,由谁来掌控。
自 SDK 1.0.1518.46(2023 年 1 月)起,WebView2 可以通过 PrintAsync 和 CoreWebView2PrintSettings 打印到指定名称的打印机。它还可以打印为 PDF,输出到文件或流。可配置的设置包括打印机名称、页面范围、份数、双面打印、逐份打印、颜色模式、纸张尺寸、每张纸打印的页数、边距、页眉和页脚。ShowPrintUI 可以打开 WebView2 的打印预览或系统打印对话框。
WebView2 缺少的是用于读取打印机功能(例如纸张尺寸或双面打印)的 API,您需要自行向系统查询。
当页面的 JavaScript 调用 window.print() 时,WebView2 会打开其打印预览,并且没有可用于拦截该请求的事件。一种变通方法是用您自己的函数替换 window.print,由该函数向应用发送消息。
在 DotNetBrowser 中,RequestPrintHandler 会接收来自 .NET 和 JavaScript 的打印请求。在此处理程序中,您可以决定是取消请求、显示打印预览,还是静默打印。
如果选择打印,接下来会根据内容运行 PrintHtmlContentHandler 或 PrintPdfContentHandler。在其中,您可以:
- 选择打印机。
- 读取打印机的功能:纸张尺寸、颜色模型、双面打印模式和份数。
- 配置页面范围、纸张尺寸、边距、页眉和页脚。
DotNetBrowser 还内置了 PDF 打印机。更多信息请参阅打印指南。
免费试用
点击此处获取免费许可证,并根据您的需求,选择以下适合您的入门指南。只需 5 分钟,即可开启您的 DotNetBrowser 体验之旅:
- DotNetBrowser 在 WPF 的应用
- DotNetBrowser 在 Avalonia 的应用
- DotNetBrowser 在 WinForms 的应用
- DotNetBrowser 在控制台中的应用,适用于 Windows 服务和服务器应用程序。
发送中。。。
您的个人 DotNetBrowser 试用密钥和快速入门指南将在几分钟内发送至您的电子邮箱。
