Barcode4.NET 与 IronBarcode:C# 条码库对比
BarcodeScanning.Native.Maui vs IronBarcode:相机控制 vs 完整条形码SDK
BarcodeScanning.Native.Maui是一个针对MAUI应用的相机插件。 如果应用处理上传文件或从PDF读取条形码,它不适合该用例。 该包自称为".NET MAUI的条形码扫描库",实际上是一个CameraView控件,当条形码进入实时摄像头画面时触发事件。 这就是全部功能了。 本比较检查相机控制库与全功能条码SDK之间的架构差异,帮助团队理解各工具的适用场合。
了解条形码扫描。MAUI
BarcodeScanning.Native.Maui将iOS/macOS(Apple的Vision框架)、Android(Google ML Kit)和Windows(ZXingCpp,增加于3.0.1版本)的本机摄像头条形码检测API封装成一个MAUI CameraView控件。 开发人员将控件放入 XAML 页面中,连接事件处理程序,每当在实时摄像头画面中检测到条形码时,该库都会触发该事件。 整个交互模型是摄像头进入,事件输出——没有其他路径。
该库是开源的,并根据 MIT 许可证免费提供。 其设计目标狭窄且明确:为MAUI应用提供实时相机条码检测,尽可能减少API表面。 它通过委托给每个平台的原生引擎实现而非实施自己的解码引擎实现了这一目标。
BarcodeScanning.Native.Maui 的主要架构特征:
-仅摄像头输入:该库仅接受实时摄像头帧。 在公共API中没有ReadFromPdf()方法。
- 仅限MAUI目标:该库支持MAUI目标—iOS、Android、Windows(从3.0.1版起,通过ZXingCpp)和macOS Catalyst。无法在MAUI项目外使用(无ASP.NET、控制台、WPF或WinForms)。
- 三个不同引擎:iOS/macOS上的Apple Vision,Android上的Google ML Kit,以及Windows上的ZXingCpp。 符号覆盖和解码行为在这三个引擎之间有所不同。 -无生成功能: BarcodeScanning.Native.Maui 从相机帧中读取条形码。 它无法生成任何格式的条形码。
- iOS UPC-A特性:Apple的Vision框架可为UPC-A条形码返回13位数字(在EAN-13编码中加上一个前导零)。 库将此原始值直接传递,应用根据需要进行标准化。
- iOS/Android上的PDF417可靠性:该库的GitHub问题跟踪器描述PDF417扫描在Vision/ML Kit代码路径上为"非常有问题的-大多数扫描从不发生",这与运单标签、驾驶执照和登机牌有关。
- 最小公共接口:公共API由
BarcodeFormat组成。 这就是应用程序代码与之交互的全部内容。 - MIT 许可证,免费:该库可免费使用,无需支付任何许可费用。
实时摄像头扫描模式
整个 BarcodeScanning.Native.Maui API 模式是一个 XAML 控件和一个 C# 事件处理程序配对使用:
<scanner:CameraView x:Name="CameraView"
OnDetectionFinished="OnBarcodeDetected"
CameraEnabled="True"
BarcodeFormats="All" />
<scanner:CameraView x:Name="CameraView"
OnDetectionFinished="OnBarcodeDetected"
CameraEnabled="True"
BarcodeFormats="All" />
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
Dim barcode = e.BarcodeResults.FirstOrDefault()
If barcode IsNot Nothing Then
ResultLabel.Text = barcode.DisplayValue
End If
End Sub
该控件为用户提供了一个嵌入在 MAUI 页面中的实时取景器。 条形码检测在相机供稿活动时持续触发。对用户体验很适合消费类应用"指向并扫描"为主要交互。 限制是这是库唯一支持的交互—所有在MAUI上下文中超出实时相机检测的需求都不在其范围内。
了解IronBarcode
IronBarcode是一个用于.NET的商业条形码读取和生成库,它基于数据输入而不是摄像头流进行操作。 它可以读取图像文件、字节数组、数据流和 PDF 文档中的条形码。 在MAUI上,它通过MediaPicker与系统摄像头集成——与应用程序用于照片选择的标准MAUI API相同——拍摄照片,然后将结果图像作为静态输入进行处理。
IronBarcode实现了其自身管理的条形码解码引擎,而不是委托给特定平台的本机API。这意味着同样的BarcodeReader.Read()调用在支持的.NET目标(Windows、Linux、macOS、ASP.NET和后台服务器进程)以及MAUI移动目标上行为一致,当图像被捕获并传递给阅读器时亦是如此。 该库还通过QRCodeWriter提供完整的条形码生成API。
IronBarcode的主要特点:
- 静态文件API:
BarcodeReader.Read()接受文件路径、字节数组、流或PDF——任何静态数据源。 - 广泛的平台覆盖:支持Windows、Linux和macOS(包括ARM),支持.NET Framework 4.6.2+,.NET Core 3.1+和.NET 5/6/7/8。相同的托管代码路径在所有支持的目标中运行,没有特定平台的分支。
- 条形码生成:
QRCodeWriter.CreateQrCode()生成Code128、QR、DataMatrix和其他格式的图像文件或字节数组。 - PDF 支持:直接读取嵌入在 PDF 文档中的条形码,无需中间图像提取步骤。
- 一致的UPC-A解码:通过其托管引擎返回标准的12位UPC-A值。 -商业许可: Lite749 美元, Plus1499 美元, Professional2999 美元,Unlimited 版 5999 美元——永久许可,含一年支持。 -服务器端部署:可在ASP.NET、Azure Functions、Docker 容器和 AWS Lambda 中运行,不依赖于物理摄像头等平台。
功能对比
下表列出了 BarcodeScanning.Native.Maui 和IronBarcode之间的根本区别:
| 特征 | BarcodeScanning.MAUI | IronBarcode |
|---|---|---|
| 主要目的 | 实时摄像头条形码检测 | 从任何数据源读取和生成条形码 |
| 输入源 | 仅实时摄像头画面 | 文件、字节数组、流、PDF |
| 平台支持 | 仅限MAUI- iOS, Android, Windows(通过ZXingCpp), macOS Catalyst | Windows, Linux, macOS, ASP.NET, 控制台, WPF,加上通过捕获图像的MAUI |
| 识别引擎 | 三个引擎(Apple Vision/Google ML Kit/ZXingCpp) | 所有目标使用单一托管引擎 |
| 条形码生成 | 否 | 是的——条形码写入器 + 二维码写入器 |
| 许可模式 | MIT(免费、开源) | 商业版——Lite749 美元,无限版 5,999 美元 |
| 服务器端ASP.NET | 否 | 是 |
详细功能对比
| 特征 | BarcodeScanning.MAUI | IronBarcode |
|---|---|---|
| 阅读 | ||
| 实时摄像机帧读取 | 是的——CameraView 控件 | 否(使用 MediaPicker 捕获,然后读取) |
| 应用内相机取景器 | 是的——实时连续 | 否——使用通过 MediaPicker 的系统相机 UI |
| 从图像文件中读取 | 否 | 是的——BarcodeReader.Read(path) |
| 从字节数组读取数据 | 否 | 是的——BarcodeReader.Read(bytes) |
| 从流中读取 | 否 | 是的——BarcodeReader.Read(stream) |
| 从PDF文件阅读 | 否 | 是的——BarcodeReader.Read(pdf) |
| 多条形码检测 | 是的(多个每帧通过e.BarcodeResults) |
是的(ExpectMultipleBarcodes选项) |
| 阅读速度控制 | None | ReadingSpeed.Faster / Balanced / Detailed / ExtremeDetail |
| iOS上的UPC-A | 可以返回13位数字; applications normalize | 返回标准的12位UPC-A |
| PDF417 可靠性 | 在iOS/Android引擎上的文档问题 | 支持 |
| 一代 | ||
| 条形码生成 | 否 | 是的——BarcodeWriter.CreateBarcode() |
| 二维码生成 | 否 | 是的——QRCodeWriter.CreateQrCode() |
| 输出格式为 PNG / 字节数组 | 否 | 是 |
| 平台 | ||
| iOS 主界面 | 是的(Apple Vision) | 是的(通过捕获图像) |
| Android MAUI | 是的(Google ML Kit) | 是的(通过捕获图像) |
| Windows MAUI | 是的(ZXingCpp,自3.0.1起) | 是 |
| macOS MAUI | 是的(Mac Catalyst,Apple Vision) | 是 |
| ASP.NET服务器端 | 否 | 是 |
| Docker / Azure / AWS Lambda | 否 | 是 |
| .NET Framework支持 | 不(仅限毛伊岛) | 是的.NET Framework 4.6.2+ |
| 许可 | ||
| 许可证类型 | 麻省理工学院(开源) | 商业永久 |
| 成本 | 免费 | Lite749美元, Plus1499美元, Professional2999美元,Unlimited版 5999美元 |
| 评估模式 | 不适用 | 免费试用 |
架构:相机控制与文件处理 API
这两个库最根本的区别在于输入模型。 BarcodeScanning.Native.Maui 是围绕连续摄像头流设计的;IronBarcode的设计是围绕离散数据输入展开的。 这些并不是同一理念的不同实现方式——它们是针对不同用例的不同架构选择。
条形码扫描.MAUI 方法
BarcodeScanning.Native.Maui 封装了每个平台上的原生摄像头检测流程。 在Android上,ML Kit处理框架; 在iOS和macOS上,Apple的Vision框架处理框架; 在Windows上,ZXingCpp处理框架。 该库将其作为一个MAUI OnDetectionFinished事件。 应用程序代码从不直接处理图像字节——它只处理从事件中检测到的条形码值。
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
Dim barcode = e.BarcodeResults.FirstOrDefault()
If barcode IsNot Nothing Then
ResultLabel.Text = barcode.DisplayValue
End If
End Sub
这种设计的后果是,没有其他入口。 摄像头并非可选项——它是库唯一识别的输入设备。 服务器、文件、PDF或任何非MAUI主机没有进入库的路径。
IronBarcode方法
IronBarcode通过其BarcodeReader.Read()静态方法接收图像数据。 调用者提供数据(来自任何来源),库对其进行解码。 在MAUI上,数据来自MediaPicker; 在服务器上,它来自表单上传; 在桌面应用程序中,它来自文件对话框。
//IronBarcodein MAUI: capture a photo, then read barcodes from it
// NuGet: dotnet add package IronBarcode
using IronBarCode;
private async void ScanBarcodeButton_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 result in results)
ResultLabel.Text = result.Value;
}
//IronBarcodein MAUI: capture a photo, then read barcodes from it
// NuGet: dotnet add package IronBarcode
using IronBarCode;
private async void ScanBarcodeButton_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 result in results)
ResultLabel.Text = result.Value;
}
Imports IronBarCode
Imports System.IO
'IronBarcode in MAUI: capture a photo, then read barcodes from it
' NuGet: dotnet add package IronBarcode
Private Async Sub ScanBarcodeButton_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 result In results
ResultLabel.Text = result.Value
Next
End Using
End Using
End Sub
此代码跨所有可捕获图像的MAUI目标一致运行。 用于服务器端,BarcodeReader.Read()方法相同,接受上传文件的字节数组或PDF路径。 IronBarcode 的文档涵盖了所有支持的输入类型。
平台覆盖与识别引擎
平台覆盖对于构建MAUI应用同时可能需要与非MAUI项目共享条形码逻辑的团队非常重要。
条形码扫描.MAUI 方法
BarcodeScanning.Native.Maui支持所有四个MAUI目标(iOS、Android、Windows自3.0.1版本起和macOS Catalyst),但是每个目标使用不同的识别引擎:iOS和macOS上为Apple Vision,Android上为Google ML Kit,Windows上为ZXingCpp。 符号覆盖和解码行为在这三个引擎间会有所不同,因此在一个平台上可靠解码的条形码可能在其他平台上表现不同。 在MAUI之外—ASP.NET、控制台、WPF、WinForms、Blazor服务器、Azure功能—库没有实现。 需要在MAUI应用和后端服务中具备条码逻辑的团队必须为非MAUI代码使用不同库。
IronBarcode方法
IronBarcode的BarcodeReader.Read()调用在每个支持的目标上使用相同的管理引擎,因此无论是在Windows、Linux、macOS、ASP.NET还是任何可以捕获图像并传递给阅读器的MAUI目标上,行为都是一致的。 没有#if WINDOWS块,没有条件依赖加载,也不需要使用存根实现。 对于文件和 PDF 输入,模式也保持一致:
using IronBarCode;
// Read barcodes from a file the user selected
var file = await FilePicker.PickAsync();
if (file != null)
{
var results = BarcodeReader.Read(file.FullPath);
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
}
// Read barcodes directly from a PDF — no image extraction step needed
var pdfResults = BarcodeReader.Read("shipment-manifest.pdf");
using IronBarCode;
// Read barcodes from a file the user selected
var file = await FilePicker.PickAsync();
if (file != null)
{
var results = BarcodeReader.Read(file.FullPath);
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
}
// Read barcodes directly from a PDF — no image extraction step needed
var pdfResults = BarcodeReader.Read("shipment-manifest.pdf");
Imports IronBarCode
' Read barcodes from a file the user selected
Dim file = Await FilePicker.PickAsync()
If file IsNot Nothing Then
Dim results = BarcodeReader.Read(file.FullPath)
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
End If
' Read barcodes directly from a PDF — no image extraction step needed
Dim pdfResults = BarcodeReader.Read("shipment-manifest.pdf")
IronBarcode MAUI 集成指南提供了所有 MAUI 目标的完整设置说明。 IronBarcode还支持在ASP.NET、Docker、Azure Functions 和 AWS Lambda 环境中进行服务器端部署,而 BarcodeScanning.Native.Maui 在这些环境中根本没有路径。
条形码读取精度:UPC-A 和 PDF417
BarcodeScanning.Native.Maui中值得注意生产应用的两个格式特定行为。
条形码扫描.MAUI 方法
在iOS上,BarcodeScanning.Native.Maui的底层检测(Apple Vision)可能会为UPC-A条形码返回13位数字。 UPC-A 是一种 12 位数字格式; 多出的开头零符合 EAN-13 编码。 库将此原始值直接传递,应用根据需要进行标准化。 在未标准化存储UPC-A值的数据库中,应用可能会累积带有前导零的记录。
记录的解决方法检查格式并修剪值:
// Normalize iOS UPC-A — strip the leading zero when present
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode == null) return;
var value = barcode.DisplayValue;
if (barcode.BarcodeFormat == BarcodeFormats.Upca && value.Length == 13)
value = value.Substring(1);
ProcessBarcode(value);
}
// Normalize iOS UPC-A — strip the leading zero when present
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode == null) return;
var value = barcode.DisplayValue;
if (barcode.BarcodeFormat == BarcodeFormats.Upca && value.Length == 13)
value = value.Substring(1);
ProcessBarcode(value);
}
' Normalize iOS UPC-A — strip the leading zero when present
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
Dim barcode = e.BarcodeResults.FirstOrDefault()
If barcode Is Nothing Then Return
Dim value = barcode.DisplayValue
If barcode.BarcodeFormat = BarcodeFormats.Upca AndAlso value.Length = 13 Then
value = value.Substring(1)
End If
ProcessBarcode(value)
End Sub
格式检查是必要的,以便EAN-13以0开头的值不会被错误修剪 PDF417在GitHub问题中单独被记录为"非常有问题的—大多数扫描从不发生"在iOS/Android引擎上,这对于运单标签、驾驶执照和登机牌相关。
IronBarcode方法
IronBarcode通过其托管引擎返回标准的12位UPC-A值。PDF417是受支持格式。 生成端也可以通过IronBarcode的 API 获取:
using IronBarCode;
// Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
// Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
using IronBarCode;
// Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
// Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
Imports IronBarCode
' Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.SaveAsPng("qr.png")
' Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
对于条形码数据准确性直接影响库存查找、销售点交易或供应链集成的应用,IronBarcode一致的格式处理减少对特定平台标准化的需求。 IronBarcode条形码读取文档详细介绍了特定格式的行为。
API 映射参考
| BarcodeScanning.Native.Maui | IronBarcode |
|---|---|
CameraView XAML 控件 |
没有摄像头控件——使用MediaPicker.CapturePhotoAsync()进行捕获 |
OnDetectionFinished事件 |
BarcodeReader.Read(imageBytes) |
e.BarcodeResults |
返回值为BarcodeReader.Read()(IEnumerable) |
e.BarcodeResults.FirstOrDefault() |
results.FirstOrDefault() |
barcode.DisplayValue |
result.Value |
barcode.BarcodeFormat |
result.Format |
BarcodeFormats="All" |
自动检测——无需配置即可支持多种格式 |
CameraEnabled="True" |
MediaPicker.CapturePhotoAsync()调用 |
| 仅限MAUI(iOS, Android, Windows, macOS) | MAUI(通过捕获的图像)+ ASP.NET、控制台、WPF、桌面、服务器 |
| 仅相机帧 | 文件、字节数组、流、PDF |
| 无文件/PDF API | BarcodeReader.Read(path)——接受图像文件和PDF |
| 三个针对MAUI目标的引擎 | 所有目标使用单一托管引擎 |
| 无生成 API | BarcodeWriter.CreateBarcode() + QRCodeWriter.CreateQrCode() |
当团队考虑从 BarcodeScanning.MAUI 迁移到IronBarcode
跨平台引擎一致性成为需求
目标iOS,Android,Windows和macOS的MAUI应用在使用BarcodeScanning.Native.Maui时采用了三种不同的识别引擎:Apple Vision(iOS/macOS)、Google ML Kit(Android)和ZXingCpp(Windows)。 每个引擎都有其自己的符号覆盖和解码行为,因此相同的条形码可能在跨平台上解码不同—且应用常常添加标准化层以掩盖差异。 当维护负担增加时,或者当质量保证报告与引擎差异有关的跨平台回归时,团队有时会将条码层迁移到在每个目标上表现一致的单托管引擎。
新增文件上传或PDF处理要求
移动应用程序通常最初以实时摄像头扫描作为唯一的输入方式,之后才扩展到接受上传的图像或文档。 当用户需要从图库中的照片、通过电子邮件接收的图像或者包含装船单或登机牌的PDF中扫描条形码时,BarcodeScanning.Native.Maui没有针对这些输入的代码路径。 达到此需求边界的团队面临选择:在BarcodeScanning.Native.Maui旁添加第二个条形码库用于文件和PDF输入,或者迁移到处理所有输入类型的单库。管理两个具有不同API和结果类型的条形码包增加了长期复杂性,而单包解决方案则避免了这种情况。
服务器端条形码处理技术推出
在移动设备上扫描条形码的应用程序通常会开发一个服务器端组件——一个用于验证条形码的ASP.NET API 端点、一个用于处理 PDF 的后台作业,或者一个用于从上传的文档中提取跟踪号码的云函数。 BarcodeScanning.Native.Maui是一个MAUI UI控制库; 没有服务器端实现。 如果团队需要在移动端和服务器端使用相同的条形码读取逻辑,则服务器端必须使用不同的库。当出现服务器端需求时,团队通常会评估是使用一个同时涵盖移动端和服务器端的单一库,还是维护两个独立的实现更可取。
UPC-A数据标准化成为关注点
iOS UPC-A 13 位数字的行为并非总能在开发过程中被发现。 在开发中扫描的UPC-A条码可能看似工作正常,但当缺少正常化时,Apple视图框架的前导零可能会显示在数据库中。 发现库存记录、销售点系统或供应链集成中的13位UPC-A值的团队可能需要代码修复和数据更正步骤。添加记录的正常化处理新扫描; 有时更喜欢迁移到输出一致的UPC-A库,作为长期解决方案。
PDF417 文档扫描要求
PDF417 是北美地区用于货运标签、驾驶执照和登机牌的条形码格式。 这些是物流、身份验证和旅游应用中常见的扫描目标。 BarcodeScanning.Native.Maui的GitHub问题跟踪器记录PDF417在iOS/Android引擎上"非常有问题—大多数扫描永不发生"。 对于PDF417可靠性作为功能需求的应用,团队通常评估替代库。
常见迁移注意事项
相机事件到媒体选择器和静态读取
迁移中的核心结构变化是将持续的摄像头事件模式替换为BarcodeReader.Read()。 CameraView XAML 控件和scanner: XML 命名空间声明都被移除。 代之以按钮触发BarcodeReader.Read()。 这会将用户体验从实时连续取景器变为系统相机屏幕——适用于大多数商业应用。
线程编组变更
BarcodeScanning.Native.Maui在后台线程上触发MainThread.BeginInvokeOnMainThread()中。 使用IronBarcode的MediaPicker + async模式,await返回后的延续在调用上下文上进行,通常是主线程。 在大多数情况下,可以移除MainThread.BeginInvokeOnMainThread()包装器,简化事件处理程序代码。
UPC-A标准化移除
任何处理BarcodeScanning.Native.Maui的iOS UPC-A 13位行为的代码库都将有代码检查Substring(1)以去除前导零。 在迁移后应移除此代码—IronBarcode返回标准12位值,保留标准化将错误地从有效UPC-A读取中去除第一位。
MAUI权限
BarcodeScanning.Native.Maui在其包设置过程中自动向Android和iOS清单添加摄像头权限。使用IronBarcode采用MediaPicker.CapturePhotoAsync() 需要的权限相同。 在任何使用摄像头的 MAUI 项目中,这些权限通常都已经存在。
IronBarcode的其他功能
除了本次对比中涵盖的功能之外, IronBarcode还提供了一些 BarcodeScanning.Native.Maui 在任何层面上都未涉及的功能:
-条形码生成:生成 Code128、QR、DataMatrix、PDF417 和其他格式的 PNG、SVG 或字节数组——可在 MAUI UI、API 响应或打印标签中使用。 -生成二维码:创建带有徽标嵌入、颜色自定义和纠错级别控制的样式二维码。
.NET兼容性和未来准备情况
IronBarcode支持.NET 6、.NET 7和.NET 8,以及.NET Framework 4.6.2及更高版本。 这意味着它运行在现代.NET目标以及尚未迁移的传统服务器环境中。 BarcodeScanning.Native.Maui是仅限MAUI的库,没有.NET Framework支持,也没有服务器部署路径。 对于代码库同时涵盖 MAUI 和现有.NET Framework或.NET Core服务器应用程序的团队, IronBarcode提供跨所有环境的一致 API,而无需为每个运行时上下文单独准备条形码包。
结论
BarcodeScanning.Native.Maui 和IronBarcode解决的是不同的问题。 BarcodeScanning.Native.Maui是一个相机控制库,提供实时取景器在MAUI目标上自动条形码检测,通过三种不同的平台引擎进行识别。 IronBarcode是条码读取和生成库,通过在.NET目标上拥有单个托管引擎,处理任何来源的静态图形数据。 架构上的差异——连续的摄像头流与离散的数据输入——决定了哪个库适合给定的需求集。
BarcodeScanning.Native.Maui 是当应用程序是 MAUI 应用程序且需要应用内摄像头实时预览并具备连续帧检测时的理想选择,并且当需求不会扩展到包含文件上传、PDF 处理或服务器端条形码工作时,其符合要求的用户体验模式。 在该范围内,它是免费的、最小化的且功能齐全的。
当条形码输入源自文件、PDF 或字节数组时,IronBarcode 是理想的选择,无论是否使用实时摄像头;当服务器端条形码处理是架构的一部分,或需要生成条形码同时进行读取时。 当跨平台的一致解码行为或 PDF417 可靠性是生产需求时,它也是合适的选择。 商业许可费用是获得这些功能的必要代价。
对于那些当前需求适合 BarcodeScanning.Native.Maui 范围的团队,该库是一个合理和成本效益的选择。对于那些需求已增长或预计会超过实时摄像头扫描的团队,IronBarcode 在输入类型、平台和部署目标中的一致 API 是实际的替代方案。
常见问题解答
BarcodeScanning.MAUI 是什么?
BarcodeScanning.MAUI 是一个 .NET 条形码库,用于在 C# 应用程序中生成和读取条形码。它是开发人员在为 .NET 项目选择条形码解决方案时评估的几个备选方案之一。
BarcodeScanning.MAUI 和 IronBarcode 的主要区别是什么?
IronBarcode 使用静态、无状态的 API,无需实例管理,而 BarcodeScanning.MAUI 通常需要在使用前创建和配置实例。IronBarcode 还提供原生 PDF 支持、自动格式检测以及跨所有环境的单密钥许可。
IronBarcode 的授权是否比 BarcodeScanning.MAUI 更容易?
IronBarcode 使用单一许可证密钥,同时涵盖开发和生产部署。与将 SDK 密钥与运行时密钥分开的许可系统相比,这简化了 CI/CD 流水线和 Docker 配置。
IronBarcode 是否支持 BarcodeScanning.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 与 BarcodeScanning.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 安装程序或运行时文件。
与 BarcodeScanning.MAUI 不同,我可以在购买前评估 IronBarcode 吗?
是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。
BarcodeScanning.MAUI 和 IronBarcode 的价格有什么区别?
IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。
从 BarcodeScanning.MAUI 迁移到 IronBarcode 是否简单?
从 BarcodeScanning.MAUI 迁移到 IronBarcode 主要涉及将基于实例的 API 调用替换为 IronBarcode 的静态方法、移除许可相关的样板代码以及更新结果属性名称。大多数迁移都是减少代码,而不是增加代码。
IronBarcode 能生成带有 logo 的二维码吗?
是的。`QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以将品牌图片原生嵌入二维码中,并支持配置纠错功能。此外,它还支持通过 `ChangeBarCodeColor()` 函数创建彩色二维码。

