跳至页脚内容
与其他组件比较

BarcodeScanning.MAUI 与 IronBarcode:C# 条码库比较

BarcodeScanning.Native.Maui 是一个相机插件,而不是条形码库。 如果你的应用运行在 Windows 系统上,处理上传的文件,或者从 PDF 文件中读取条形码,那么它就是错误的工具——而 README 文件并没有事先明确说明这一点。 该软件包页面将其描述为".NET MAUI 的条形码扫描库",这在技术上是准确的,但忽略了一个关键的限制:它是一个 CameraView 控件,当条形码进入实时相机画面时会触发一个事件。 这就是全部功能了。 本文对比了相机控制库和功能齐全的条形码 SDK 之间的架构差异,帮助团队了解每种工具的适用范围和不足之处。

了解条形码扫描。MAUI

BarcodeScanning.Native.Maui 将 iOS(Apple 的 Vision 框架)和 Android(ML Kit)上的原生相机条形码检测 API 封装到 MAUI CameraView 控件中。 开发人员将控件放入 XAML 页面中,连接事件处理程序,每当在实时摄像头画面中检测到条形码时,该库都会触发该事件。 整个交互模型是摄像头进入,事件输出——没有其他路径。

该库是开源的,并根据 MIT 许可证免费提供。 它的设计目标明确而具体:以尽可能少的 API 接口为 iOS 和 Android MAUI 应用程序提供实时摄像头条形码检测。 它通过委托给原生平台 API 来实现这一目标,而不是实现自己的条形码解码引擎。

BarcodeScanning.Native.Maui 的主要架构特征:

-仅摄像头输入:该库仅接受实时摄像头帧。 公共 API 中任何地方都没有 ReadFromFile()ReadFromBytes()ReadFromStream()ReadFromPdf() 方法。 -仅限 iOS 和 Android:该库封装了 iOS 特有的(Vision 框架)和 Android 特有的(ML Kit)原生 API。MAUI 目前没有 Windows 目标平台的实现,也没有相关计划。 -无生成功能: BarcodeScanning.Native.Maui 从相机帧中读取条形码。 它无法生成任何格式的条形码。

  • iOS UPC-A 不准确: Apple 的 Vision 框架为 UPC-A 条形码返回 13 位数字(在前面加上一个零以匹配 EAN-13 编码)。 该库会直接传递这个原始值而不进行任何修正,因此需要在应用程序代码中进行手动变通处理。
  • PDF417 可靠性已知问题:该库自己的GitHub问题跟踪器记录 PDF417 扫描"非常成问题——大多数扫描根本不会发生",这直接阻碍了货运标签、驾驶执照和登机牌的扫描。 -最小公共接口:公共 API 由 CameraViewOnDetectionFinishedOnDetectionFinishedEventArgsBarcodeResult 以及 DisplayValueBarcodeFormat 组成。 这就是应用程序代码与之交互的全部内容。
  • 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" />
XML
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArgs)
    Dim barcode = e.BarcodeResults.FirstOrDefault()
    If barcode IsNot Nothing Then
        ResultLabel.Text = barcode.DisplayValue
    End If
End Sub
$vbLabelText   $csharpLabel

该控件为用户提供了一个嵌入在 MAUI 页面中的实时取景器。 当摄像头画面处于活动状态时,条形码检测会持续触发。对于以"指向扫描"为主要交互方式的消费级应用来说,这种用户体验确实非常出色。 限制在于,这是该库唯一支持的交互方式——一旦需求超出 iOS 或 Android 上的实时摄像头检测范围,BarcodeScanning.Native.Maui 就无法提供任何功能。

了解IronBarcode

IronBarcode是一个用于.NET的商业条形码读取和生成库,它基于数据输入而不是摄像头流进行操作。 它可以读取图像文件、字节数组、数据流和 PDF 文档中的条形码。 在 MAUI 系统中,它通过 MediaPicker 与系统摄像头集成——这是应用程序用于照片选择的相同标准 MAUI API——捕获照片,然后将生成的图像作为静态输入进行处理。

IronBarcode 自行实现了条形码解码引擎,而不是依赖平台特定的原生 API。这意味着同一个 BarcodeReader.Read() 调用在 iOS、Android、Windows、macOS、ASP.NET 和后台服务器进程中都能保持一致的行为。 该库还通过 BarcodeWriterQRCodeWriter 提供完整的条形码生成 API。

IronBarcode的主要特点:

-静态文件 API: BarcodeReader.Read() 接受文件路径、字节数组、流或 PDF — 任何静态数据源。 -全面覆盖平台:支持 iOS、Android、Windows 和 macOS MAUI 目标平台。 相同的代码可以在所有四个平台上运行,无需针对特定平台进行分支。 -条形码生成: BarcodeWriter.CreateBarcode()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
平台支持 iOS 和 Android MAUI 系统 iOS、Android、Windows、macOS MAUI + 服务器端
条形码生成 是的——条形码写入器 + 二维码写入器
许可模式 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 选项)
阅读速度控制 ReadingSpeed.Balanced / Faster / Slower
iOS 上的 UPC-A 准确性 返回 13 位数字(错误),需要手动规范化 返回正确的 12 位 UPC-A
PDF417 可靠性 "大多数扫描从未发生"(GitHub问题) 支持
一代
条形码生成 是的 — BarcodeWriter.CreateBarcode()
二维码生成 是的 — QRCodeWriter.CreateQrCode()
输出格式为 PNG / 字节数组
平台
iOS 主界面
Android MAUI
Windows MAUI
macOS MAUI 未记录。
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 系统中,苹果的 Vision 框架负责处理帧。 该库将其显示为 MAUI CameraView 控件,并带有 OnDetectionFinished 事件。 应用程序代码从不直接处理图像字节——它只处理从事件中检测到的条形码值。

private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArgs)
    Dim barcode = e.BarcodeResults.FirstOrDefault()
    If barcode IsNot Nothing Then
        ResultLabel.Text = barcode.DisplayValue
    End If
End Sub
$vbLabelText   $csharpLabel

这种设计的后果是,没有其他入口。 摄像头并非可选项——它是库唯一识别的输入设备。 服务器、文件、PDF、Windows 机器——这些都没有该库所期望的那种摄像头。

IronBarcode方法

IronBarcode 通过其静态方法接收图像数据。 调用者提供数据(来自任何来源),库对其进行解码。 在 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
$vbLabelText   $csharpLabel

这段代码在 iOS、Android 和 Windows MAUI 上运行效果完全相同。 对于服务器端使用,相同的 BarcodeReader.Read() 方法接受上传文件的字节数组或 PDF 路径。 IronBarcode 的文档涵盖了所有支持的输入类型。

平台覆盖范围和 Windows 支持

对于构建 MAUI 应用程序的团队来说,平台覆盖范围是 BarcodeScanning.Native.Maui 的结构性限制具体体现出来的地方。

条形码扫描.MAUI 方法

BarcodeScanning.Native.Maui 不支持 MAUI 中的 Windows 目标平台。 这不是暂时的缺口,而是图书馆建筑结构造成的必然结果。 该库封装了 iOS 特有的(Vision 框架)和 Android 特有的(ML Kit)原生 API。Windows 系统本身不具备这两种 API。 构建面向 iOS、Android 和 Windows 的 MAUI 应用程序的团队(这是标准的多目标场景)不能使用 BarcodeScanning.Native.Maui 作为所有三个目标的条形码解决方案。 他们要么必须单独为 Windows 平台编写特定代码,要么必须完全替换该库。

IronBarcode方法

IronBarcode 的 BarcodeReader.Read() 调用可在 Windows、iOS、Android 和 macOS 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")
$vbLabelText   $csharpLabel

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 值存储在数据库中的应用程序可能会累积带有不应该存在的开头零的记录。

已记录的解决方法是检查格式并裁剪值:

// Workaround required for iOS UPC-A — strip the leading zero manually
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode == null) return;

    var value = barcode.DisplayValue;
    if (barcode.BarcodeFormat == BarcodeFormat.UPC_A && value.Length == 13)
        value = value.Substring(1); // strip Apple's prepended leading zero

    ProcessBarcode(value);
}
// Workaround required for iOS UPC-A — strip the leading zero manually
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArgs e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode == null) return;

    var value = barcode.DisplayValue;
    if (barcode.BarcodeFormat == BarcodeFormat.UPC_A && value.Length == 13)
        value = value.Substring(1); // strip Apple's prepended leading zero

    ProcessBarcode(value);
}
' Workaround required for iOS UPC-A — strip the leading zero manually
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArgs)
    Dim barcode = e.BarcodeResults.FirstOrDefault()
    If barcode Is Nothing Then Return

    Dim value = barcode.DisplayValue
    If barcode.BarcodeFormat = BarcodeFormat.UPC_A AndAlso value.Length = 13 Then
        value = value.Substring(1) ' strip Apple's prepended leading zero
    End If

    ProcessBarcode(value)
End Sub
$vbLabelText   $csharpLabel

如果省略格式检查,这种变通方法会悄无声息地破坏以 0 开头的 EAN-13 条形码。 PDF417 在GitHub issues 中被单独记录为"非常有问题——大多数扫描都不会发生",影响货运标签、驾驶执照和登机牌。

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")
$vbLabelText   $csharpLabel

对于条形码数据准确性直接影响库存查找、销售点交易或供应链集成的应用而言,IronBarcode 的正确格式处理消除了 BarcodeScanning.Native.Maui 在应用程序代码中留下的一类生产错误。 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() 调用
仅限 iOS 和 Android iOS、Android、Windows、macOS (MAUI) + ASP.NET、桌面
仅相机帧 文件、字节数组、流、PDF
无文件/PDF API BarcodeReader.Read(path) — 接受图像文件和 PDF 文件
没有 Windows MAUI 完全支持 Windows MAUI
无生成 API BarcodeWriter.CreateBarcode() + QRCodeWriter.CreateQrCode()

当团队考虑从 BarcodeScanning.MAUI 迁移到IronBarcode

已将 Windows MAUI 目标添加到构建中

MAUI 应用通常以 iOS 和 Android 为目标平台,随着应用的成熟或Enterprise分发需求的扩展,再逐步添加 Windows 版本。 添加 Windows 目标后,BarcodeScanning.Native.Maui 会立即成为一个阻碍因素——库中没有 Windows 实现,也没有解决方法。 在这种情况下,团队要么必须使用不同的库为 Windows 维护单独的条形码实现,要么必须将整个条形码层迁移到一个可以在所有 MAUI 目标上一致工作的库。 第二条路径操作起来更简单,并且消除了平台特定分支的维护开销。

新增文件上传或PDF处理要求

移动应用程序通常最初以实时摄像头扫描作为唯一的输入方式,之后才扩展到接受上传的图像或文档。 当用户需要扫描图库中的照片、通过电子邮件收到的图像或包含货运清单或登机牌的 PDF 中的条形码时,BarcodeScanning.Native.Maui 没有可提供的代码路径。 达到此需求阈值的团队面临一个选择:要么在 BarcodeScanning.Native.Maui 之外再添加一个条形码库来处理文件和 PDF 输入,要么迁移到一个能够处理所有输入类型的单一库。管理两个具有不同 API、不同结果类型和不同格式支持表的条形码包会增加长期的复杂性,而单一包解决方案则可以避免这一点。

服务器端条形码处理技术推出

在移动设备上扫描条形码的应用程序通常会开发一个服务器端组件——一个用于验证条形码的ASP.NET API 端点、一个用于处理 PDF 的后台作业,或者一个用于从上传的文档中提取跟踪号码的云函数。 BarcodeScanning.Native.Maui 是一个依赖于相机硬件上下文的 UI 控件库; 它无法在服务器进程中运行。 如果团队需要在移动端和服务器端使用相同的条形码读取逻辑,则服务器端必须使用不同的库。当出现服务器端需求时,团队通常会评估是使用一个同时涵盖移动端和服务器端的单一库,还是维护两个独立的实现更可取。

UPC-A 数据准确性成为生产问题

iOS UPC-A 13 位数字的行为并非总能在开发过程中被发现。 在开发过程中扫描的 UPC-A 条形码可能看起来工作正常,但 Apple 的 Vision 框架引入的前导零会出现在数据库中。 在库存记录、销售点系统或供应链集成中发现 13 位 UPC-A 值的团队,除了面临代码问题外,还面临着数据更正问题。 BarcodeScanning.Native.Maui 的GitHub问题中记录的解决方法可以纠正新的扫描结果,但无法修复历史数据。 当数据质量问题的范围变得明确时,迁移到无需应用级规范化即可返回正确 UPC-A 值的库通常是更清晰的长期解决方案。

PDF417 文档扫描要求

PDF417 是北美地区用于货运标签、驾驶执照和登机牌的条形码格式。 这些是物流、身份验证和旅游应用中常见的扫描目标。 BarcodeScanning.Native.Maui 的GitHub问题跟踪器将 PDF417 描述为"问题重重——大多数扫描都无法成功"。对于任何将 PDF417 的可靠性视为功能性要求而非锦上添花的应用来说,这个已知问题会直接阻碍应用的运行,迫使开发者评估其他替代库。

常见迁移注意事项

相机事件到媒体选择器和静态读取

迁移的核心结构变化是用 MediaPicker 捕获后紧接着 BarcodeReader.Read() 捕获来取代连续的相机事件模式。 事件处理程序、XAML 控件和 XML 命名空间声明均已移除。 取而代之的是,一个按钮触发 MediaPicker.CapturePhotoAsync(),并将产生的照片字节传递给 BarcodeReader.Read()。 这会将用户体验从实时连续取景器变为系统相机屏幕——适用于大多数商业应用。

线程编组变更

BarcodeScanning.Native.Maui 在后台线程中触发 OnDetectionFinished,因此所有更新 UI 元素的现有处理程序都会将其更新包装在 MainThread.BeginInvokeOnMainThread() 中。IronBarcode使用的 MediaPicker + async 模式,在 await 之后的延续会在调用上下文中返回,这通常是主线程。 大多数情况下,可以删除 MainThread.BeginInvokeOnMainThread() 包装器,从而简化事件处理程序代码。

UPC-A 规避移除

任何处理 BarcodeScanning.Native.Maui 的 iOS UPC-A 13 位行为的代码库都会有代码检查 BarcodeFormat.UPC_A 并调用 Substring(1) 来去除前导零。 迁移后必须删除此代码 — IronBarcode返回正确的 12 位值,保留此变通方法会错误地从有效的 UPC-A 读取中去除第一位数字。

MAUI权限

BarcodeScanning.Native.Maui 在其软件包设置过程中会自动向 Android 和 iOS 清单添加相机权限。当IronBarcode使用 MediaPicker 时,需要 AndroidManifest.xmlInfo.plist 中的标准 MAUI 相机权限——这与任何 MAUI 应用使用 MediaPicker.CapturePhotoAsync() 所需的权限相同。 在任何使用摄像头的 MAUI 项目中,这些权限通常都已经存在。

IronBarcode的其他功能

除了本次对比中涵盖的功能之外, IronBarcode还提供了一些 BarcodeScanning.Native.Maui 在任何层面上都未涉及的功能:

-条形码生成生成 Code128、QR、DataMatrix、PDF417 和其他格式的 PNG、SVG 或字节数组——可在 MAUI UI、API 响应或打印标签中使用。 -生成二维码创建带有徽标嵌入、颜色自定义和纠错级别控制的样式二维码。 -多条形码读取 ExpectMultipleBarcodes 选项一次读取单个图像中存在的所有条形码。

  • PDF 条形码提取直接读取嵌入在 PDF 文档中的条形码——无需中间图像转换。 -服务器端部署在ASP.NET、Azure Functions、Docker 和 AWS Lambda 中部署相同的条形码读取和生成逻辑,无需任何摄像头依赖。 -读取速度配置 ReadingSpeed.FasterBalancedSlower 设置允许根据图像质量调整吞吐量与准确性。
  • macOS MAUI 支持全面支持 macOS MAUI 桌面应用程序,涵盖 BarcodeScanning.Native.Maui 未记录的第四个 MAUI 目标。

.NET兼容性和未来准备情况

IronBarcode支持.NET 6、 .NET 7、 .NET 8 和.NET 9,以及.NET Framework 4.6.2 及更高版本。 这意味着它既可以在完整的 MAUI 目标集上运行,也可以在尚未迁移到现代.NET 的旧式服务器环境中运行。 IronBarcode会定期更新,并随着 2026 年.NET 10 的普及而保持兼容。BarcodeScanning.Native.Maui 是一个仅限 MAUI 使用的库,不支持.NET Framework ,也没有服务器端部署路径。 对于代码库同时涵盖 MAUI 和现有.NET Framework或.NET Core服务器应用程序的团队, IronBarcode提供跨所有环境的一致 API,而无需为每个运行时上下文单独准备条形码包。

结论

BarcodeScanning.Native.Maui 和IronBarcode解决的是不同的问题。 BarcodeScanning.Native.Maui 是一个相机控制库,可在 iOS 和 Android 上提供实时取景器和自动条形码检测功能。 IronBarcode是一个条形码读取和生成库,可处理来自任何来源的静态图像数据,并支持所有.NET平台。 架构上的差异——连续的摄像头流与离散的数据输入——决定了哪个库适合给定的需求集。

当应用程序是仅面向 iOS 和 Android 的消费者移动应用程序,并且需要使用连续帧检测的实时应用内相机预览作为 UX 模式,并且需求不会扩展到包括 Windows、文件上传、PDF 处理或服务器端条形码工作时,BarcodeScanning.Native.Maui 是正确的选择。 在这个限定范围内,它是自由的、简洁的、功能性的。

当平台覆盖范围必须包括 Windows MAUI,当IronBarcode输入除了实时摄像头之外或代替实时摄像头之外还来自文件、PDF 或字节数组,当服务器端条形码处理是架构的一部分,或者当需要生成条形码以及读取条形码时,IronBarcode 是正确的选择。 当 UPC-A 精度或 PDF417 可靠性是生产要求而不是可接受的限制时,这种方法也是合适的。 商业许可费用是获得这些功能的必要代价。

对于目前需求仅限于 BarcodeScanning.Native.Maui 库的团队而言,该库是一个合理且经济高效的选择。但对于那些需求已经或预计会扩展到两个平台上实时摄像头扫描之外的团队而言,与 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()` 函数创建彩色二维码。

Jordi Bardia
软件工程师
Jordi 最擅长 Python、C# 和 C++,当他不在 Iron Software 利用这些技能时,他就在游戏编程。分享产品测试、产品开发和研究的责任,Jordi 在持续的产品改进中增加了巨大的价值。多样的经验使他面临挑战并保持投入,他表示这是在 Iron Software 工作的最喜欢的方面之一。Jordi 在佛罗里达州迈阿密长大,并在佛罗里达大学学习计算机科学和统计学。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我