部署
本文介绍了 DotNetBrowser 发布包中包含的内容以及需要部署的库。
分发内容
基于 DotNetBrowser 的应用程序部署包由以下三部分组成:
- 您的应用程序及其自身的依赖项。
- DotNetBrowser 程序集。完整列表请参阅包内容。
- 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.ChromiumDirectory 或 DOTNETBROWSER_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/,并附加特定于平台的子目录,例如 WindowsX64、LinuxArm64 或 MacX64。将 ChromiumDirectory 指向基础目录,不要包含平台子目录——DotNetBrowser 会在运行时附加当前平台对应的子目录:
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 事件提供程序集:
- 为
AppDomain.AssemblyResolve事件注册自定义处理程序。 - 在处理程序中,筛选出名称以
DotNetBrowser.Chromium开头的程序集请求。 - 使用完全限定的程序集名称准备网络请求。
- 执行请求,并以字节数组的形式获取程序集。
- 从字节数组加载程序集,并从处理程序中将其返回。
之后,DotNetBrowser 会照常解压二进制文件并启动 Chromium。有关参考实现和示例项目,请参阅下载并安装 Chromium 运行时。
要求与权衡:
- 部署包在三种模式中最小。
- 目标计算机需要能够访问托管这些程序集的服务。如果无法访问该服务,引擎便无法启动。
- 初始化耗时更长,因为其中包括下载程序集所需的时间。
- 初始化期间的内存使用量会增加,因为 DotNetBrowser 会从内存中的程序集解压二进制文件。在 32 位环境中,这可能导致内存不足错误。
选择分发模式
- 对于大多数桌面应用程序,请使用打包的 Chromium 运行时。此模式不需要任何额外配置。
- 如果冷启动时间非常重要、应用程序目录为只读,或者您使用 Native AOT 发布应用程序,请使用已解压的 Chromium 运行时。
- 如果安装程序的大小受限,并且目标计算机能够访问您的服务,请通过网络提供 Chromium 运行时。
包内容
DotNetBrowser 以多个动态链接库的形式提供。其中一些与 DotNetBrowser 本身相关,另一些则包含相应的 Chromium 二进制文件。
以下是 DotNetBrowser 分发包中提供的库列表:
| 程序集 | 大小 | 引用 | 说明 |
|---|---|---|---|
| DotNetBrowser.dll | ~240KB | 数据类和接口 | |
| DotNetBrowser.Core.dll | ~2MB | DotNetBrowser.dll DotNetBrowser.Logging.dll | 核心实现 |
| DotNetBrowser.Logging.dll | ~23KB | DotNetBrowser 日志记录 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 | ~180KB | DotNetBrowser.dll DotNetBrowser.Core.dll | 用于嵌入 Avalonia 11 UI 应用程序的类和接口 |
| DotNetBrowser.AvaloniaUi.v12.dll | ~180KB | DotNetBrowser.dll DotNetBrowser.Core.dll | 用于嵌入 Avalonia 12 UI 应用程序的类和接口 |
| DotNetBrowser.Wpf.dll | ~170KB | DotNetBrowser.dll DotNetBrowser.Core.dll | 用于嵌入 WPF 应用程序的 类和接口 |
| DotNetBrowser.WinForms.dll | ~120KB | DotNetBrowser.dll DotNetBrowser.Core.dll | 用于嵌入 WinForms 应用程序的类和接口 |
| Google.Protobuf.dll | ~490KB | Protocol Buffers 的 .NET 实现。用于在 .NET 端与 Chromium 引擎之间进行通信 |
以下各节列出了针对每个目标平台需要包含的库。
Windows
AnyCPUDotNetBrowser.dll、DotNetBrowser.Core.dll、DotNetBrowser.Logging.dll、DotNetBrowser.Chromium.Win-x86.dll、DotNetBrowser.Chromium.Win-x64.dll、DotNetBrowser.Chromium.Win-arm64.dll 和 Google.Protobuf.dll。DotNetBrowser 会检查应用程序的体系结构,并使用与之匹配的 Chromium 二进制文件。
x86DotNetBrowser.dll、DotNetBrowser.Core.dll、DotNetBrowser.Logging.dll、DotNetBrowser.Chromium.Win-x86.dll 和 Google.Protobuf.dll。Chromium 32 位二进制文件在 Windows 32 位和 64 位环境中均受支持。
x64DotNetBrowser.dll、DotNetBrowser.Core.dll、DotNetBrowser.Logging.dll、DotNetBrowser.Chromium.Win-x64.dll 和 Google.Protobuf.dll。在 32 位 .NET 应用程序中,会抛出异常。
ARM64DotNetBrowser.dll、DotNetBrowser.Core.dll、DotNetBrowser.Logging.dll、DotNetBrowser.Chromium.Win-arm64.dll 和 Google.Protobuf.dll。这些库用于 ARM64 .NET 应用程序。
根据您的 .NET 应用程序所使用的框架,添加 DotNetBrowser.Wpf.dll、DotNetBrowser.WinForms.dll、DotNetBrowser.AvaloniaUi.dll 或 DotNetBrowser.AvaloniaUi.v12.dll。
Linux
x64DotNetBrowser.dll、DotNetBrowser.Core.dll、DotNetBrowser.Logging.dll、DotNetBrowser.Chromium.Linux-x64.dll 和 Google.Protobuf.dll。在 32 位 .NET 应用程序中,会抛出异常。
ARM64DotNetBrowser.dll、DotNetBrowser.Core.dll、DotNetBrowser.Logging.dll、DotNetBrowser.Chromium.Linux-arm64.dll 和 Google.Protobuf.dll。在 ARM .NET 应用程序中,会抛出异常。
如果您的应用程序使用 Avalonia UI,请添加 DotNetBrowser.AvaloniaUi.dll 或 DotNetBrowser.AvaloniaUi.v12.dll。
macOS
x64DotNetBrowser.dll、DotNetBrowser.Core.dll、DotNetBrowser.Logging.dll、DotNetBrowser.Chromium.macOS-x64.dll 和 Google.Protobuf.dll。在 32 位 .NET 应用程序中,会抛出异常。
ARM64DotNetBrowser.dll、DotNetBrowser.Core.dll、DotNetBrowser.Logging.dll、DotNetBrowser.Chromium.macOS-arm64.dll 和 Google.Protobuf.dll。在 ARM .NET 应用程序中,会抛出异常。
如果您的应用程序使用 Avalonia UI,请添加 DotNetBrowser.AvaloniaUi.dll 或 DotNetBrowser.AvaloniaUi.v12.dll。
Citrix
DotNetBrowser 可在使用 Windows Server 2016 及更高版本的 Citrix 环境中运行。
要运行 Chromium 和 DotNetBrowser,需要禁用 Citrix API Hooks。
应禁用位于 Chromium 二进制文件目录中的 chromium.exe 文件的 API hooks。
替代解决方案是禁用 Chromium 沙盒。请注意,这会带来安全风险。有关沙盒的更多信息,请参阅此文章。