Spire.Barcode 与 IronBarcode:C# 条形码库比较
ZXing.Net.MAUI 与 IronBarcode: C# MAUI 条形码比较 2026
ZXing.Net.Maui.Controls v0.7.4。在NuGet上稳定,但仍在1.0前。Windows MAUI不支持扫描(仅生成)。 iPhone 15 Pro自动对焦记录为受影响(问题 #260)。 没有Dispose()的相机资源泄漏(问题 #164)。 这是大多数.NET MAUI开发人员首先会使用的库,也是在项目发布之前最常暴露生产问题的库。
了解 ZXing .NET.MAUI
ZXing .NET .MAUI 是 ZXing .NET条形码库的社区维护的.NET MAUI移植版,由 Jon Dick( GitHub:Redth)根据 MIT 许可证开发和发布。 它提供了一个XAML相机控件,CameraBarcodeReaderView,在MAUI页面中嵌入实时条码扫描寻像器。 开发者连接BarcodesDetected事件,以接收相机捕获帧时的扫描结果。 该库继承了ZXing.Net的完整条码格式引擎,包括其BarcodeReaderOptions配置模型。
包MauiProgram.cs中,围绕iOS和Android的移动相机管道设计。 该图书馆没有商业机构支持,没有服务水平协议 (SLA),也没有付费支持服务。 其v0.7.4版本是一个稳定的NuGet发布,但在语义版本控制下仍然处于1.0之前。
ZXing .NET.MAUI 的主要架构特征:
- 1.0之前状态: NuGet包处于v0.7.4——稳定,但仍为1.0之前。在1.0之前可能出现小版本API更改,错误修复节奏取决于社区维护者,没有商业支持合同。
- iOS和Android扫描: 库围绕iOS和Android的平台相机API构建。 Windows MAUI仅支持生成——相机扫描未实现。 Mac Catalyst被包含在目标框架列表中但扫描未正式记录。
- 连续相机寻像器:
CameraBarcodeReaderView是一个实时相机控件,在页面可见时连续运行。 它占用屏幕空间,并且需要页面生命周期管理。 - 无Dispose()实现:该控件未实现
IDisposable。 相机资源在页面导航时没有正式释放,需要在IsDetecting = false解决(GitHub问题#164)。 - iPhone 15 Pro自动对焦问题: GitHub问题#260记录了iPhone 15 Pro和Pro Max设备(硬件标识符
iPhone16,2)无法实现可靠的条码检测对焦。 目前尚无程序修复方案。 - Android相机兼容性问题: GitHub问题#275跟踪与AndroidX Camera 1.5.0兼容性冲突导致的构建失败,解决方法是将相机包固定到1.4.x或提高项目
minSdkVersion。 - 继承ZXing.Net格式规范: 每个扫描会话需要明确声明要扫描的
BarcodeFormats值。 未列在BarcodeReaderOptions.Formats中的格式即使在相机框架中可见,也会被静默忽略。 -仅支持摄像头的架构:该库没有文件输入 API、没有流读取 API,也没有 PDF 条形码提取功能。 所有扫描都必须通过实时相机取景器进行。
CameraBarcodeReaderView架构
CameraBarcodeReaderView控件是ZXing.Net.MAUI的核心组件。 它在XAML中声明,并通过BarcodeReaderOptions绑定进行配置。 每个使用它的页面必须实现IsDetecting状态:
<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
<zxing:CameraBarcodeReaderView
x:Name="CameraView"
Options="{Binding ReaderOptions}"
BarcodesDetected="OnBarcodesDetected" />
</ContentPage>
<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
<zxing:CameraBarcodeReaderView
x:Name="CameraView"
Options="{Binding ReaderOptions}"
BarcodesDetected="OnBarcodesDetected" />
</ContentPage>
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
base.OnDisappearing();
if (CameraView != null)
CameraView.IsDetecting = false; // 否 IDisposable on the control
}
protected override void OnAppearing()
{
base.OnAppearing();
if (CameraView != null)
CameraView.IsDetecting = true;
}
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
base.OnDisappearing();
if (CameraView != null)
CameraView.IsDetecting = false; // 否 IDisposable on the control
}
protected override void OnAppearing()
{
base.OnAppearing();
if (CameraView != null)
CameraView.IsDetecting = true;
}
' Toggling IsDetecting in lifecycle overrides is the documented pattern
Protected Overrides Sub OnDisappearing()
MyBase.OnDisappearing()
If CameraView IsNot Nothing Then
CameraView.IsDetecting = False ' 否 IDisposable on the control
End If
End Sub
Protected Overrides Sub OnAppearing()
MyBase.OnAppearing()
If CameraView IsNot Nothing Then
CameraView.IsDetecting = True
End If
End Sub
ZXing .NET.MAUI 应用程序中的每个扫描页面都包含此生命周期样板代码。 缺少Dispose模式。
了解IronBarcode
IronBarcode是由Iron Software开发的商业支持型.NET条形码库。 它通过一个静态API提供条码读取和生成,BarcodeReader.Read(),接受图像字节、文件路径、流和PDF文档。 在MAUI上下文中,IronBarcode与MAUI内置的MediaPicker配合使用,通过系统相机捕获图像,然后在捕获后处理结果图像,而不是处理连续相机流。
该库通过同一个软件包和相同的代码路径,面向所有 MAUI 平台——iOS、Android、Windows 和 macOS。 在MauiProgram.cs中不需要特定平台的服务注册,在XAML中不嵌入相机视图控件,也不需要生命周期管理,因为IronBarcode不维护运行中的相机状态。
IronBarcode的主要特点:
-稳定商业版本:以生产就绪的NuGet包形式发布,提供商业支持、SLA 和定期发布节奏。 -所有 MAUI 平台:支持 iOS、Android、Windows 和macOS MAUI目标,只需一个软件包和一种代码模式。
- 无状态API:
BarcodeReader.Read()是一个静态方法调用。 扫描之间不会运行后台进程,不需要生命周期钩子,页面导航期间也不会累积相机资源。 -自动检测所有格式:无需格式规范列表即可自动检测超过 50 种条形码格式。扫描未知格式无需任何配置。 -文件和 PDF 读取:原生读取文件路径、字节数组、流和 PDF 文档中的条形码,涵盖实时摄像头库无法解决的场景。 - ML 驱动的损坏条形码恢复:应用机器学习模型从损坏、部分遮挡或低质量图像中恢复条形码,这是阈值算法无法实现的。 -条形码生成:生成所有主要的 1D 和 2D 条形码格式的图像,并可配置尺寸、颜色和边距。 -跨平台部署:同一个软件包可以在ASP.NET Core、WPF、WinForms、控制台应用程序、Azure Functions 和 Docker 容器以及 MAUI 中运行。
功能对比
下表列出了 ZXing .NET.MAUI 和IronBarcode之间的主要区别:
| 特征 | ZXing.Net.MAUI | IronBarcode |
|---|---|---|
| 发布状态 | 稳定但1.0之前(v0.7.4) | 稳定商业版 |
| 平台支持 | iOS、Android扫描(仅Windows生成) | iOS、Android、Windows、macOS、服务器 |
| 格式规范要求 | 是 | 否(自动检测) |
| 相机资源管理 | 手动 (IsDetecting) |
不适用——无国籍 |
| PDF条形码提取 | 不可用 | 是 |
| 许可 | 麻省理工学院(免费,社区) | 商业翻译 |
| 商业支持 | None | 是 |
详细功能对比
| 特征 | ZXing.Net.MAUI | IronBarcode |
|---|---|---|
| 平台 | ||
| iOS 主界面 | 是(iPhone 15 Pro对焦问题 #260) | 是 |
| Android MAUI | 是(相机1.5.0构建问题 #275) | 是 |
| Windows MAUI | 仅生成——未实现扫描 | 是 |
| macOS MAUI | Mac Catalyst为目标; 扫描未正式记录 | 是 |
| ASP.NET Core / 服务器 | 否 | 是 |
| WPF/WinForms | 否 | 是 |
| Azure Functions / Docker | 否 | 是 |
| .NET Framework 4.6.2+ | 否 | 是 |
| 阅读 | ||
| 格式自动检测 | 不——必须指定格式 | 是的(50多种格式) |
| 文件路径输入 | 仅通过 ZXing .NET Core | 是 |
| 流输入 | 仅通过 ZXing .NET Core | 是 |
| PDF条形码提取 | 否 | 是 |
| 条形码损坏恢复 | 努力者 | 是的(基于机器学习) |
| 摄像头集成 | ||
| 实时取景器控制 | 是 | 否(MediaPicker 系统 UI) |
| 生命周期管理要求 | 是(正在检测) | 否 |
| Dispose() 实现 | 否 | 不适用 |
| iPhone 15 Pro 自动对焦 | 受影响(GitHub问题 #260) | 不适用 |
| 一代 | ||
| 条形码生成 | 是的(通过.NET) | 是 |
| 维护 | ||
| 发布状态 | 稳定但1.0之前(v0.7.4) | 已准备好投入生产 |
| 商业支持 | None | 是 |
| API稳定性保证 | 1.0之前——可能存在小版本更改 | 是 |
| 许可证 | 麻省理工学院(免费) | 商业翻译 |
平台支持
平台覆盖范围是 ZXing .NET.MAUI 和IronBarcode之间的一个结构性差异,因为这两个库是基于对.NET MAUI应用程序运行位置的根本不同的假设而构建的。
ZXing .NET.MAUI 方法
ZXing.Net.MAUI围绕iOS和Android的平台相机API设计。 Windows MAUI仅支持条形码生成——相机扫描未实现且不在公开路线图上。这反映了围绕实时相机取景器控件构建库的结构选择,其平台实现仅为移动操作系统编写。
目标是net8.0-windows10.0.19041.0的MAUI项目将不会从ZXing.Net.MAUI得到条码扫描功能。 Mac Catalyst存在于目标框架列表中,但尚未正式记录在该目标上的扫描。 开始仅针对移动目标项目且随后添加Windows或macOS需求的团队会发现在这些目标上ZXing.Net.MAUI无法覆盖扫描。 iOS支持本身带有警告:GitHub问题 #260 记录了iPhone 15 Pro和Pro Max设备遇到了自动对焦问题,导致无法可靠检测。
IronBarcode方法
IronBarcode支持所有 MAUI 目标框架——iOS、Android、Windows 和 macOS——使用同一个软件包和相同的代码模式。 MediaPicker + MediaPicker.CapturePhotoAsync()调用设备相机; 在 Windows 系统中,它会映射到文件选择器,这对于桌面环境来说是合适的行为。 无需平台特定代码、无需条件编译、也无需平台服务注册。
适用于 Windows 和 macOS 的 MAUI 桌面条形码模式与处理移动扫描的软件包相同。 在安卓设备上运行的相同BarcodeReader.Read()调用也在ASP.NET Core端点、WinForms桌面应用程序或Azure Function中运行——部署目标不影响API。
相机集成和生命周期
这两个库在 MAUI 应用程序中如何访问摄像头方面采取了截然相反的架构立场。
ZXing .NET.MAUI 方法
CameraBarcodeReaderView是嵌入在XAML页面中的持久相机控件。 当false时停止。 缺少IDisposable模式释放。 记录的缓解措施是在OnAppearing()中恢复它:
// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
base.OnDisappearing();
CameraView.IsDetecting = false;
}
protected override void OnAppearing()
{
base.OnAppearing();
CameraView.IsDetecting = true;
}
// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
base.OnDisappearing();
CameraView.IsDetecting = false;
}
protected override void OnAppearing()
{
base.OnAppearing();
CameraView.IsDetecting = true;
}
' ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
Protected Overrides Sub OnDisappearing()
MyBase.OnDisappearing()
CameraView.IsDetecting = False
End Sub
Protected Overrides Sub OnAppearing()
MyBase.OnAppearing()
CameraView.IsDetecting = True
End Sub
在所有放置扫描仪的页面上,都必须重复此模式。 经常导航到和从扫描页面返回的应用程序可能会累积未完全释放的相机资源,这记录在GitHub问题 #164中,伴随内存增长和返回时相机初始化间歇性的问题报告。 iPhone 15 Pro自动对焦问题(GitHub问题#260)是相机集成层中的一个独立问题:相机视图清晰地渲染条码,但自动对焦系统未能足够清晰地锁定以便在iPhone16,2硬件上进行检测。 记录的解决方法是指示用户手动调整设备和条形码之间的距离。
IronBarcode方法
IronBarcode没有在 XAML 布局中嵌入相机控件。 相反,当用户点击按钮时,MediaPicker.CapturePhotoAsync()调用打开系统相机用户界面。 系统摄像头可独立处理对焦、曝光和自动对焦。 当用户确认捕获时,结果图像将以字节数组形式传递给BarcodeReader.Read():
// NuGet: dotnet add package IronBarcode
using IronBarCode;
private async void ScanButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
foreach (var barcode in results)
Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}
// 否 OnAppearing or OnDisappearing needed — no camera state to manage
// NuGet: dotnet add package IronBarcode
using IronBarCode;
private async void ScanButton_Clicked(object sender, EventArgs e)
{
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;
using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var results = BarcodeReader.Read(ms.ToArray());
foreach (var barcode in results)
Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}
// 否 OnAppearing or OnDisappearing needed — no camera state to manage
Imports IronBarCode
Imports System.IO
Imports System.Threading.Tasks
Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
Dim photo = Await MediaPicker.CapturePhotoAsync()
If photo Is Nothing Then Return
Using stream = Await photo.OpenReadAsync()
Using ms As New MemoryStream()
Await stream.CopyToAsync(ms)
Dim results = BarcodeReader.Read(ms.ToArray())
For Each barcode In results
Console.WriteLine($"{barcode.Format}: {barcode.Value}")
Next
End Using
End Using
End Sub
' 否 OnAppearing or OnDisappearing needed — no camera state to manage
.NET MAUI条形码扫描器教程涵盖了此模式的完整项目设置,包括 iOS 和 Android 的权限配置。 因为没有持久的相机视图,所以无需释放资源,无需切换状态,也无需跨页面维护生命周期样板代码。
格式规范
库如何处理条形码格式检测,会对实际部署中的扫描可靠性产生直接影响。
ZXing .NET.MAUI 方法
ZXing .NET.MAUI 继承了 ZXing .NET格式规范要求。 在扫描开始之前,开发者必须用BarcodeReaderOptions.Formats,以检测应检测的类型。 未包含在列表中的格式将不会被检测到——不会发出任何错误或警告,也不会显示任何提示信息:
// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
Formats = BarcodeFormats.QRCode |
BarcodeFormats.Code128 |
BarcodeFormats.Ean13 |
BarcodeFormats.UpcA,
TryHarder = true,
AutoRotate = true
};
// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
Formats = BarcodeFormats.QRCode |
BarcodeFormats.Code128 |
BarcodeFormats.Ean13 |
BarcodeFormats.UpcA,
TryHarder = true,
AutoRotate = true
};
' ZXing.Net.MAUI: formats must be declared explicitly
' Formats not listed here are not detected
ReaderOptions = New BarcodeReaderOptions With {
.Formats = BarcodeFormats.QRCode Or
BarcodeFormats.Code128 Or
BarcodeFormats.Ean13 Or
BarcodeFormats.UpcA,
.TryHarder = True,
.AutoRotate = True
}
如果用户将相机对准GS1 DataBar、Aztec码、MaxiCode或任何未在选项中声明的格式,扫描将不返回结果且不会引发错误。 相机渲染出条形码,应用程序未返回结果。 在受控环境中——例如仓库中每件商品都贴有 Code128 标签——这是可以管理的。 在条形码格式由外部供应商、客户或第三方系统决定的部署中,缺乏回退路径成为一个经常性的支持问题。
IronBarcode方法
IronBarcode无需任何预配置,即可自动检测所有支持的格式。 BarcodeReader.Read()分析图像并返回其识别到的每个条码的结果,无论格式如何。 不需要BarcodeReaderOptions列表:
// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
Console.WriteLine($"{barcode.Format}: {barcode.Value}");
// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
Console.WriteLine($"{barcode.Format}: {barcode.Value}");
Imports IronBarcode
' IronBarcode: no format specification needed
' All 50+ formats detected automatically
Dim results = BarcodeReader.Read(imageBytes)
For Each barcode In results
Console.WriteLine($"{barcode.Format}: {barcode.Value}")
Next
如果需要针对只预期一种格式的受控场景进行性能调优,则可以选择性地传递格式提示——但它们对于正确检测来说并非必需。 即使条形码的格式并非开发者预期,系统仍能检测到并返回该条形码。
文件和PDF处理
除了实时摄像机扫描之外,许多生产条形码工作流程还涉及从存储的文档中读取信息——例如发货发票、电子票据、上传的图像和 PDF 附件。
ZXing .NET.MAUI 方法
ZXing .NET.MAUI 是一个相机控制库。 它没有从文件路径、直接从存储传递的字节数组或 PDF 文档读取条形码的 API。 CameraBarcodeReaderView控件需要实时相机源; 没有静态方法可以接受文件路径并返回条形码结果。 需要从上传的 PDF、文档管理系统或批量图像处理队列中读取条形码的团队无法在这些场景中使用 ZXing .NET.MAUI,必须引入单独的库。
IronBarcode方法
IronBarcode通过相同的BarcodeReader.Read()方法读取任何来源的条码。 它接受文件路径、字节数组、流和 PDF 文档。 PDF解析是原生支持的IronBarcode直接处理PDF页面,无需中间光栅化步骤:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");
// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
var fileResults = BarcodeReader.Read(file.FullPath);
foreach (var result in fileResults)
ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");
// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
var fileResults = BarcodeReader.Read(file.FullPath);
foreach (var result in fileResults)
ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
Imports IronBarCode
Imports Microsoft.Maui.Storage
' Read barcodes from a PDF file
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}")
Next
' Read from a user-selected file using MAUI FilePicker
Dim file = Await FilePicker.PickAsync()
If file IsNot Nothing Then
Dim fileResults = BarcodeReader.Read(file.FullPath)
For Each result In fileResults
ResultLabel.Text &= $"\n{result.Format}: {result.Value}"
Next
End If
完整的 PDF 条形码读取工作流程,包括多页文档和跨页混合条形码格式,已记录在《从 PDF 读取条形码指南》中。 这涵盖了 ZXing .NET.MAUI 仅使用摄像头的架构无法处理的运输发票、电子票据、文档管理工作流程和批量处理场景。
API 映射参考
| ZXing.Net.MAUI | IronBarcode | 备注 |
|---|---|---|
builder.UseBarcodeReader() |
不要求 | 从MauiProgram.cs中移除 |
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;..." |
不要求 | 移除 XAML 命名空间声明 |
<zxing:CameraBarcodeReaderView> |
用<Button> + MediaPicker替换 |
建筑结构变更 |
Options="{Binding ReaderOptions}" |
不要求 | 不需要选项对象 |
BarcodesDetected="OnBarcodesDetected" |
BarcodeReader.Read()返回值 |
事件 → 方法返回 |
new BarcodeReaderOptions { Formats = BarcodeFormats.X \| ... } |
不要求 | 自动检测取代了这一点 |
BarcodeDetectionEventArgs e |
IEnumerable<BarcodeResult> |
不同的结果交付模式 |
e.Results |
BarcodeReader.Read()的返回值 |
|
barcode.Value |
result.Value |
相同的属性名称 |
barcode.Format |
result.Format |
相同的属性名称 |
BarcodeFormats.QRCode |
BarcodeEncoding.QRCode |
枚举重命名 |
BarcodeFormats.Code128 |
BarcodeEncoding.Code128 |
枚举重命名 |
BarcodeFormats.Ean13 |
BarcodeEncoding.EAN13 |
枚举重命名 |
CameraView.IsDetecting = false (OnDisappearing) |
不需要——删除该方法 | IronBarcode是无状态的 |
CameraView.IsDetecting = true (OnAppearing) |
不需要——删除该方法 | IronBarcode是无状态的 |
| 无文件输入 API | BarcodeReader.Read("path/to/file.png") |
新功能 |
| 无 PDF API | BarcodeReader.Read("document.pdf") |
新功能 |
当团队考虑从 ZXing .NET.MAUI 迁移到IronBarcode时
几个具体的场景促使我们决定评估IronBarcode作为 ZXing .NET.MAUI 的替代品。 这些是项目层面和产品层面的条件,而不是实施偏好。
Windows MAUI要求
最常见的重新评估触发因素是,在最初只有 iOS 和 Android 目标的项目中添加了Windows MAUI目标。 MAUI 团队通常从移动优先的构建开始,随着需求的演变再扩展到桌面目标。 当这种扩展发生时,ZXing .NET.MAUI 没有提供任何后续方案——Windows 平台尚未实现,也没有列入公开的开发路线图。团队要么必须接受条形码扫描功能在 Windows 上无法使用,要么就得替换掉这个库。 由于更换过程涉及扫描模式的结构性改变,团队通常会同时对所有平台进行更改。
当前一代硬件兼容性
iPhone 15 Pro自动对焦问题(GitHub问题 #260)对于向iOS用户提供生产条形码扫描仪的团队是真实的考虑因素。 iPhone 15 Pro和Pro Max在期望应用体验精致的消费者群体中很常见,请求用户调整与条形码的距离的解决方法与旧款iPhone硬件相比是显著的用户体验倒退。 在QA中浮现这一问题的团队,或接到iPhone 15 Pro用户的支持报告,面临着继续使用在当前尚无解决方案的库或迁移到不受相机视图对焦模型影响的方法之间的选择。
文件和文档处理
条形码扫描需求很少会局限于实时摄像头拍摄。 最初作为库存扫描器的应用,通常会扩展到读取上传的 PDF 中的条形码、处理发货发票或处理电子邮件附件中的电子票据。 ZXing .NET.MAUI 没有针对这些场景的 API。 当产品需求进入待办事项列表,涉及从文件或文档中读取条形码时,使用 ZXing .NET.MAUI 的团队必须引入一个单独的库来处理它。 如果团队已经在使用IronBarcode处理任何基于文件的场景,那么将 MAUI 相机扫描整合到同一个库中就成了顺理成章的下一步。
生产稳定性要求
v0.7.4的1.0之前标识——尽管包本身是稳定的NuGet发布——对于受到软件组成分析、依赖性审计或内部批准流程的团队有影响。 某些企业环境要求生产依赖具有1.0+稳定发布、商业支持合同或两者兼备。 ZXing.Net.MAUI由社区维护并且处于1.0之前,这适用于内部工具和原型,但在以条形码扫描仪作为主要工作流的面向客户的应用中增加了审查步骤。 缺乏付费支持层意味着任何关键错误均取决于社区维护者的可用性。
常见迁移注意事项
从 ZXing .NET.MAUI 到IronBarcode 的结构变化涉及三个具体的技术替换,这些替换会影响代码库中参与条形码扫描的每个文件。
CameraBarcodeReaderView 到 MediaPicker 模式
CameraBarcodeReaderView XAML控件及其xmlns:zxing命名空间声明完全移除。 在每个包含扫描器视图的XAML文件中,替换为在其Button控件。 通过BarcodeReader.Read()返回值所取代。
正在检测生命周期移除
所有唯一存在用于切换OnDisappearing覆盖都可以删除。 如果这些覆盖包含其他页面生命周期逻辑,IsDetecting行将被移除,而剩余逻辑将被保留。 没有IronBarcode相当于IsDetecting的替代,因为没有持久的相机状态需要在页面导航之间进行管理。
使用条形码读取器() 注册移除
ZXing.Net.MAUI需要在builder.UseBarcodeReader()调用,以注册其平台相机服务。 IronBarcode不需要任何MauiProgram.cs注册。 using ZXing.Net.Maui;命名空间导入被连同包卸载一起移除。
IronBarcode的其他功能
除了本次对比中涵盖的场景之外, IronBarcode提供的条形码功能远远超出了基于摄像头的 MAUI 控件所能提供的范围:
- iOS条码扫描: 全面的iOS MAUI支持,使用相同的
MediaPicker+BarcodeReader.Read()模式——没有特定平台的相机管理,没有格式列表,也没有生命周期样板。 - Android 条形码扫描:通过相同的统一 API 进行Android MAUI扫描,没有 ZXing .NET.MAUI 中存在的 Camera 1.5.0 依赖项锁定问题。 -条形码生成:生成 QR 码、Code128、EAN-13、PDF417、Data Matrix 以及所有主要格式的图像,并可配置尺寸、颜色、静区和纠错级别。 -批量处理:一次调用即可读取多页 PDF 或图像目录中所有页面的所有条形码,并返回每个结果的页码元数据。
- 服务器端部署:相同NuGet包和相同的
BarcodeReader.Read()调用在ASP.NET Core端点、Azure Functions和Docker容器中运行——一个包覆盖移动客户端和服务器后台。 -损坏的条形码恢复:机器学习模型可以从物理损坏的标签、低对比度的印刷品以及以次优角度拍摄的图像中恢复条形码,而标准的基于阈值的解码器无法处理这些图像。 -样式条形码生成:生成具有自定义颜色、嵌入式徽标、圆角和注释文本的条形码——除了 ZXing .NET提供的纯单色输出之外。
.NET兼容性和未来准备情况
IronBarcode持续进行积极开发,定期更新以适配最新的.NET版本。 该库支持.NET 8、.NET 9,并跟踪随后的.NET发布。 它还支持遗留应用环境的.NET Framework 4.6.2及更高版本。 ZXing.Net.MAUI作为社区维护的1.0之前包,并不承担.NET版本支持时间表的正式承诺。 对于与.NET发布节奏相关的 MAUI 项目而言,拥有一个积极维护、商业支持的库来跟踪每个.NET版本,对于长期规划至关重要。
结论
ZXing .NET.MAUI 和IronBarcode代表了对同一问题的不同解决方案——在.NET MAUI应用程序中读取条形码——但它们的架构前提不同。 ZXing .NET.MAUI 将实时相机取景器直接嵌入到 XAML 页面中,作为持久相机控件运行,在分析帧时触发事件。 IronBarcode将相机视为通过系统MediaPicker访问的抓取设备,处理捕获后的静态图像而不是连续流。 方法上的差异几乎决定了其他一切:平台覆盖范围、生命周期复杂性、格式处理和部署范围。
ZXing.Net.MAUI实际上适合特定项目概况:iOS和Android应用程序、原型和内部工具、提前知道条形码格式的团队、无Windows MAUI扫描需求的项目,以及0成本MIT许可证是决定因素的情况。 对于在固定一组 Android 设备上扫描 Code128 标签的仓库库存扫描器,ZXing .NET.MAUI 将能够正常工作。 1.0之前状态、iPhone 15 Pro问题和生命周期样板是真实的权衡,在正确环境下值得接受。
IronBarcode适用于项目范围更广的情况:Windows 或macOS MAUI目标、来自外部系统的未知或可变条形码格式、包括从 PDF 或上传文件中读取条形码的要求、生产级稳定性要求,或者除了移动扫描之外的服务器端条形码处理。 商业许可证是一项投资,涵盖了对.NET各个版本的支持、维护和兼容性更新。 无状态 API 消除了一类错误——相机资源泄漏、生命周期状态错误——而 ZXing .NET.MAUI 需要开发人员手动防止这些错误。
客观评价是,这两个库都不完全正确。 ZXing .NET.MAUI 之所以成为大多数 MAUI 开发人员尝试的第一个库,是因为它免费、熟悉且易于集成。 它带来的问题确实存在,但这些问题只有在特定的项目条件下才会显现出来。 当满足以下条件时——Windows 系统要求、当前一代 iPhone 硬件、基于文件的扫描或生产稳定性标准IronBarcode都能满足所有这些要求。 选择取决于项目的具体限制是否使其处于 ZXing .NET.MAUI 的已知限制成为阻碍的场景之内或之外。
常见问题解答
ZXing.Net.MAUI是什么?
ZXing.Net.MAUI 是一个 .NET 条形码库,用于在 C# 应用程序中生成和读取条形码。它是开发人员在为 .NET 项目选择条形码解决方案时评估的几个备选方案之一。
ZXing.Net.MAUI 和 IronBarcode 的主要区别是什么?
IronBarcode 使用静态、无状态的 API,无需实例管理,而 ZXing.Net.MAUI 通常需要在使用前创建和配置实例。IronBarcode 还提供原生 PDF 支持、自动格式检测以及跨所有环境的单密钥许可。
IronBarcode 的授权是否比 ZXing.Net.MAUI 更容易?
IronBarcode 使用单一许可证密钥,同时涵盖开发和生产部署。与将 SDK 密钥与运行时密钥分开的许可系统相比,这简化了 CI/CD 流水线和 Docker 配置。
IronBarcode 是否支持 ZXing.Net.MAUI 支持的所有条形码格式?
IronBarcode 支持超过 30 种条码符号体系,包括 QR 码、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1 等等。格式自动检测功能意味着无需显式枚举格式。
IronBarcode是否支持原生PDF条码读取?
是的。IronBarcode 可以直接从 PDF 文件中读取条形码,使用 `BarcodeReader.Read("document.pdf")` 方法,无需单独的 PDF 渲染库。每页的读取结果包括页码、条形码格式、数值和置信度评分。
IronBarcode 与 ZXing.Net.MAUI 相比,在批量处理方面有何不同?
IronBarcode 的静态方法是无状态的,并且天然线程安全,因此可以直接使用 Parallel.ForEach,而无需进行线程级实例管理。所有定价层级均无吞吐量上限。
IronBarcode支持哪些.NET版本?
IronBarcode 在单个 NuGet 包中支持 .NET Framework 4.6.2+、.NET Core 3.1 以及 .NET 5、6、7、8 和 9。平台目标包括 Windows x64/x86、Linux x64 和 macOS x64/ARM。
如何在.NET项目中安装IronBarcode?
通过 NuGet 安装 IronBarcode:在程序包管理器控制台中运行“Install-Package IronBarCode”,或在命令行界面中运行“dotnet add package IronBarCode”。无需其他 SDK 安装程序或运行时文件。
与 ZXing.Net.MAUI 不同,我可以在购买前评估 IronBarcode 吗?
是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。
ZXing.Net.MAUI 和 IronBarcode 的价格有什么区别?
IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。
从 ZXing.Net.MAUI 迁移到 IronBarcode 是否简单?
从 ZXing.Net.MAUI 迁移到 IronBarcode 主要涉及将基于实例的 API 调用替换为 IronBarcode 的静态方法、移除许可相关的样板代码以及更新结果属性名称。大多数迁移都是减少代码,而不是增加代码。
IronBarcode 能生成带有 logo 的二维码吗?
是的。`QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以将品牌图片原生嵌入二维码中,并支持配置纠错功能。此外,它还支持通过 `ChangeBarCodeColor()` 函数创建彩色二维码。

