目录

部署

本文介绍了 DotNetBrowser 发布包中包含的内容以及需要部署的库。

分发内容 

基于 DotNetBrowser 的应用程序部署包由以下三部分组成:

  1. 您的应用程序及其自身的依赖项。
  2. DotNetBrowser 程序集。完整列表请参阅包内容
  3. Chromium 运行时——DotNetBrowser 作为独立进程启动的浏览器引擎。

前两个部分在所有情况下都相同。第三个部分则由您选择,而下文所述的分发模式正是针对这一选择。

您无需在目标计算机上安装 Chromium 或 Google Chrome。DotNetBrowser 使用并部署自己的 Chromium 版本

分发模式 

DotNetBrowser 将 Chromium 运行时包含在特定于平台的 DotNetBrowser.Chromium.<Platform>.dll 程序集中。Chromium 无法从 .NET 程序集内部运行,因此必须先将其二进制文件解压到磁盘上的目录中,然后才能启动引擎。三种分发模式的区别在于解压操作何时进行以及由谁执行。

模式包大小首次启动运行时需要互联网连接
打包的 Chromium 运行时较小较慢:需要一次性解压不需要
已解压的 Chromium 运行时较大最快不需要
通过网络提供 Chromium 运行时最小最慢需要

打包的 Chromium 运行时 

这是默认模式。您需要在部署包中包含 DotNetBrowser.Chromium.<Platform>.dll 程序集,DotNetBrowser 会在目标计算机上解压 Chromium 二进制文件。

需要包含的内容:包内容中列出的程序集,包括应用程序所支持的每个平台对应的 Chromium 程序集。

运行时行为: 首次启动时,DotNetBrowser 会检查 Chromium 二进制文件目录。如果目录中没有所需文件,DotNetBrowser 会从 Chromium 程序集中提取这些文件。在 Windows 上,默认目录为 %LocalAppData%\Temp\dotnetbrowser-chromium。在 Linux 和 macOS 上,默认目录为用户的临时目录。后续启动会重复使用已提取的二进制文件。详情请参阅提取

若要将二进制文件放在其他位置,请通过 EngineOptions.ChromiumDirectoryDOTNETBROWSER_CHROMIUM_DIR 环境变量设置 Chromium 二进制文件目录

要求与权衡:

  • 目标计算机上需要有一个可写入的目录,用于存放 Chromium 二进制文件。
  • 解压会导致首次启动较慢。在配备 i7 处理器、16 GB 内存和 SSD 的计算机上,解压需要 2–3 秒。检查库二进制文件的防病毒软件会进一步增加耗时。请参阅 Windows 上启动缓慢
  • 与使用已解压二进制文件相比,部署包更小,因为 Chromium 程序集以压缩形式存储这些二进制文件。

除非您的应用程序受到下文所述的某项限制,否则请使用此模式。

已解压的 Chromium 运行时 

在此模式下,您需要在构建或发布阶段解压 Chromium 二进制文件,并将生成的目录作为部署包的一部分进行分发。目标计算机上不会执行任何提取操作。

若要在发布阶段解压二进制文件,请将 DotNetBrowser.Chromium.Extraction MSBuild 包添加到您的应用程序项目中:

<ItemGroup>
  <PackageReference Include="DotNetBrowser.Chromium.Extraction"
                    Version="..."
                    PrivateAssets="all" />
</ItemGroup>

<PropertyGroup>
  <DotNetBrowserExtractionEnabled>true</DotNetBrowserExtractionEnabled>
  <DotNetBrowserExtractionDuringPublish>true</DotNetBrowserExtractionDuringPublish>
</PropertyGroup>

然后针对目标运行时发布应用程序:

dotnet publish -c Release -r win-x64

默认情况下,发布时提取会将二进制文件写入 $(PublishDir)unpacked/,并附加特定于平台的子目录,例如 WindowsX64LinuxArm64MacX64。将 ChromiumDirectory 指向基础目录,不要包含平台子目录——DotNetBrowser 会在运行时附加当前平台对应的子目录:

C#
VB
string chromiumDirectory = Path.Combine(AppContext.BaseDirectory, "unpacked");

IEngine engine = EngineFactory.Create(new EngineOptions.Builder
{
    ChromiumDirectory = chromiumDirectory
}.Build());
Dim chromiumDirectory As String =
    Path.Combine(AppContext.BaseDirectory, "unpacked")

Dim engine As IEngine = EngineFactory.Create(
    New EngineOptions.Builder() With {
        .ChromiumDirectory = chromiumDirectory
    }.Build()
)

有关提取属性的完整列表和运行时标识符解析规则,请参阅预提取 Chromium 二进制文件。若要更改已解压二进制文件的可执行文件名称、图标或 macOS 捆绑包元数据,请参阅 Chromium 二进制文件品牌定制

请在与目标运行时属于同一操作系统系列的系统上解压二进制文件。例如,应在 Linux 上解压 Linux 二进制文件,在 macOS 上解压 macOS 二进制文件。这样可以保留可执行权限、符号链接和平台捆绑包结构。

要求与权衡:

  • 部署包更大,因为已解压的二进制文件比压缩后的 Chromium 程序集占用更多空间。
  • 首次启动与后续启动一样快。
  • 由于所需的二进制文件已经就位,DotNetBrowser 不会在目标计算机上提取任何内容。

这是使用 Native AOT 发布的应用程序唯一受支持的模式,因为在这种情况下无法加载程序集。请参阅剪裁和 Native AOT

通过网络提供 Chromium 运行时 

在此模式下,部署包完全不包含 Chromium 程序集。应用程序会在 DotNetBrowser 需要这些程序集时通过网络获取它们。

与上述两种模式不同,此模式并非 DotNetBrowser 的内置功能。应用程序需要自行实现该功能,并托管用于提供程序集的服务。

DotNetBrowser 使用标准的 .NET 程序集加载逻辑来查找 Chromium 程序集,因此应用程序可以通过 AppDomain.AssemblyResolve 事件提供程序集:

  1. AppDomain.AssemblyResolve 事件注册自定义处理程序。
  2. 在处理程序中,筛选出名称以 DotNetBrowser.Chromium 开头的程序集请求。
  3. 使用完全限定的程序集名称准备网络请求。
  4. 执行请求,并以字节数组的形式获取程序集。
  5. 从字节数组加载程序集,并从处理程序中将其返回。

之后,DotNetBrowser 会照常解压二进制文件并启动 Chromium。有关参考实现和示例项目,请参阅下载并安装 Chromium 运行时

要求与权衡:

  • 部署包在三种模式中最小。
  • 目标计算机需要能够访问托管这些程序集的服务。如果无法访问该服务,引擎便无法启动。
  • 初始化耗时更长,因为其中包括下载程序集所需的时间。
  • 初始化期间的内存使用量会增加,因为 DotNetBrowser 会从内存中的程序集解压二进制文件。在 32 位环境中,这可能导致内存不足错误。

选择分发模式 

  • 对于大多数桌面应用程序,请使用打包的 Chromium 运行时。此模式不需要任何额外配置。
  • 如果冷启动时间非常重要、应用程序目录为只读,或者您使用 Native AOT 发布应用程序,请使用已解压的 Chromium 运行时。
  • 如果安装程序的大小受限,并且目标计算机能够访问您的服务,请通过网络提供 Chromium 运行时。

包内容 

DotNetBrowser 以多个动态链接库的形式提供。其中一些与 DotNetBrowser 本身相关,另一些则包含相应的 Chromium 二进制文件。

以下是 DotNetBrowser 分发包中提供的库列表:

程序集大小引用说明
DotNetBrowser.dll~240KB数据类和接口
DotNetBrowser.Core.dll~2MBDotNetBrowser.dll
DotNetBrowser.Logging.dll
核心实现
DotNetBrowser.Logging.dll~23KBDotNetBrowser 日志记录 API
实现
DotNetBrowser.Chromium.Win-x86.dll~115MB适用于 Windows 32 位的
Chromium 二进制文件
DotNetBrowser.Chromium.Win-x64.dll~120MB适用于 Windows 64 位的
Chromium 二进制文件
DotNetBrowser.Chromium.Win-arm64.dll~115MB适用于 Windows ARM64 的
Chromium 二进制文件
DotNetBrowser.Chromium.Linux-x64.dll~125MB适用于 Linux 64 位的
Chromium 二进制文件
DotNetBrowser.Chromium.Linux-arm64.dll~135MB适用于 Linux ARM64 的
Chromium 二进制文件
DotNetBrowser.Chromium.macOS-x64.dll~111MB适用于 macOS 64 位的
Chromium 二进制文件
DotNetBrowser.Chromium.macOS-arm64.dll~115MB适用于 macOS ARM64 的
Chromium 二进制文件
DotNetBrowser.AvaloniaUi.dll~180KBDotNetBrowser.dll
DotNetBrowser.Core.dll
用于嵌入 Avalonia 11 UI
应用程序的类和接口
DotNetBrowser.AvaloniaUi.v12.dll~180KBDotNetBrowser.dll
DotNetBrowser.Core.dll
用于嵌入 Avalonia 12 UI
应用程序的类和接口
DotNetBrowser.Wpf.dll~170KBDotNetBrowser.dll
DotNetBrowser.Core.dll
用于嵌入 WPF 应用程序的
类和接口
DotNetBrowser.WinForms.dll~120KBDotNetBrowser.dll
DotNetBrowser.Core.dll
用于嵌入 WinForms
应用程序的类和接口
Google.Protobuf.dll~490KBProtocol Buffers 的 .NET
实现。用于在 .NET 端与
Chromium 引擎之间进行通信

以下各节列出了针对每个目标平台需要包含的库。

Windows 

AnyCPU
DotNetBrowser.dllDotNetBrowser.Core.dllDotNetBrowser.Logging.dllDotNetBrowser.Chromium.Win-x86.dllDotNetBrowser.Chromium.Win-x64.dllDotNetBrowser.Chromium.Win-arm64.dllGoogle.Protobuf.dll。DotNetBrowser 会检查应用程序的体系结构,并使用与之匹配的 Chromium 二进制文件。

x86
DotNetBrowser.dllDotNetBrowser.Core.dllDotNetBrowser.Logging.dllDotNetBrowser.Chromium.Win-x86.dllGoogle.Protobuf.dll。Chromium 32 位二进制文件在 Windows 32 位和 64 位环境中均受支持。

x64
DotNetBrowser.dllDotNetBrowser.Core.dllDotNetBrowser.Logging.dllDotNetBrowser.Chromium.Win-x64.dllGoogle.Protobuf.dll。在 32 位 .NET 应用程序中,会抛出异常。

ARM64
DotNetBrowser.dllDotNetBrowser.Core.dllDotNetBrowser.Logging.dllDotNetBrowser.Chromium.Win-arm64.dllGoogle.Protobuf.dll。这些库用于 ARM64 .NET 应用程序。

根据您的 .NET 应用程序所使用的框架,添加 DotNetBrowser.Wpf.dllDotNetBrowser.WinForms.dllDotNetBrowser.AvaloniaUi.dllDotNetBrowser.AvaloniaUi.v12.dll

Linux 

x64
DotNetBrowser.dllDotNetBrowser.Core.dllDotNetBrowser.Logging.dllDotNetBrowser.Chromium.Linux-x64.dllGoogle.Protobuf.dll。在 32 位 .NET 应用程序中,会抛出异常。

ARM64
DotNetBrowser.dllDotNetBrowser.Core.dllDotNetBrowser.Logging.dllDotNetBrowser.Chromium.Linux-arm64.dllGoogle.Protobuf.dll。在 ARM .NET 应用程序中,会抛出异常。

如果您的应用程序使用 Avalonia UI,请添加 DotNetBrowser.AvaloniaUi.dllDotNetBrowser.AvaloniaUi.v12.dll

macOS 

x64
DotNetBrowser.dllDotNetBrowser.Core.dllDotNetBrowser.Logging.dllDotNetBrowser.Chromium.macOS-x64.dllGoogle.Protobuf.dll。在 32 位 .NET 应用程序中,会抛出异常。

ARM64
DotNetBrowser.dllDotNetBrowser.Core.dllDotNetBrowser.Logging.dllDotNetBrowser.Chromium.macOS-arm64.dllGoogle.Protobuf.dll。在 ARM .NET 应用程序中,会抛出异常。

如果您的应用程序使用 Avalonia UI,请添加 DotNetBrowser.AvaloniaUi.dllDotNetBrowser.AvaloniaUi.v12.dll

Citrix 

DotNetBrowser 可在使用 Windows Server 2016 及更高版本的 Citrix 环境中运行。

要运行 Chromium 和 DotNetBrowser,需要禁用 Citrix API Hooks

应禁用位于 Chromium 二进制文件目录中的 chromium.exe 文件的 API hooks。

替代解决方案是禁用 Chromium 沙盒。请注意,这会带来安全风险。有关沙盒的更多信息,请参阅此文章