跳至頁尾內容
影片

如何使用 NET MAUI 在 C# 中讀取和掃描條碼

從 BarcodeLib 遷移到 IronBarcode

本指南為 .NET 開發者提供從 BarcodeLib 遷移到IronBarcode的完整路徑。 內容包括團隊進行這一遷移的理由、逐步的包替換、每種常見 BarcodeLib 模式的程式碼遷移範例、完整的 API 映射參考,以及管理程式碼庫遷移的結構化檢查清單。

為何由 BarcodeLib 遷移

從 BarcodeLib 遷移到IronBarcode的團隊報告了以下觸發因素:

無讀取 API: BarcodeLib 從未包含讀取或解碼能力。 當一個產生條碼圖像的專案接收到新的要求,也需要掃描條碼——從上傳的圖像、倉庫掃描儀或供應商文件——BarcodeLib 無法滿足此需求。 唯一選擇是新增第二個程式庫例如 ZXing.Net,這會引入第二個依賴圖和第二個 API 表面來和 BarcodeLib 一起維護。

SkiaSharp 版本衝突: BarcodeLib 3.x 引入了 SkiaSharp 作為圖形後端來取代 System.Drawing.Common。 程式庫固定到特定的 SkiaSharp 版本範圍。 在 MAUI 專案、Blazor 專案以及任何其他依賴也引入 SkiaSharp 的專案中,解析版本經常超出 BarcodeLib 預期的範圍。 這會在還原期間產生 NU1608 警告,最壞的情況下,裝置上會有運行時組件綁定失敗。

無 PDF 支援: 生成包含嵌入條碼的 PDF 文件的應用程式(例如發票、工作訂單、合同)有時需要在後端處理時讀取這些條碼。 BarcodeLib 產生條碼圖像,但在任一端均無 PDF 支援。 使用 BarcodeLib 提取 PDF 中的條碼需要渲染 PDF 頁面到圖像,然後將這些圖像傳遞給單獨的讀取程式庫。

字節陣列輸出的流編碼步驟: BarcodeLib 3.x 返回 SKImage,這需要將 SkiaSharp 編碼步驟成為 MemoryStream 才能生產 HTTP 回應、資料庫 BLOB 列以及大多數下游消費者實際需要的 byte[] 輸出。IronBarcode在生成鏈上直接提供 .ToPngBinaryData()

基本問題

BarcodeLib 的僅生成架構意味著增加任何掃描能力都需要將第二個程式庫引入堆棧:

// BarcodeLib: generation only — reading requires a completely separate library
using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();
SKImage img = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);

// To read it back, a separate scanning library such as ZXing.Net is required —
// separate API, separate dependency graph to maintain alongside BarcodeLib.
// BarcodeLib: generation only — reading requires a completely separate library
using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();
SKImage img = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);

// To read it back, a separate scanning library such as ZXing.Net is required —
// separate API, separate dependency graph to maintain alongside BarcodeLib.
Imports BarcodeStandard
Imports SkiaSharp

Dim b = New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100)
Using stream = File.OpenWrite("barcode.png")
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
$vbLabelText   $csharpLabel

IronBarcode 在同一包內使用相同的 using 語句來處理這兩者:

// IronBarcode: generation and reading — no second library needed
using IronBarCode;

// Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng("barcode.png");

// Read back — same package, same namespace
var result = BarcodeReader.Read("barcode.png").First().Value;
Console.WriteLine(result);  // "PRODUCT-12345"
// IronBarcode: generation and reading — no second library needed
using IronBarCode;

// Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng("barcode.png");

// Read back — same package, same namespace
var result = BarcodeReader.Read("barcode.png").First().Value;
Console.WriteLine(result);  // "PRODUCT-12345"
Imports IronBarCode

' Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng("barcode.png")

' Read back — same package, same namespace
Dim result = BarcodeReader.Read("barcode.png").First().Value
Console.WriteLine(result)  ' "PRODUCT-12345"
$vbLabelText   $csharpLabel

IronBarcode與 BarcodeLib:功能比較

功能 BarcodeLib IronBarcode
條碼生成
條碼讀取/掃描 是 (BarcodeReader.Read())
QR 碼生成 否 (僅 1D) 是 (進階,帶有標誌嵌入)
PDF 條碼讀取 是(原生,無需額外程式庫)
PDF 條碼生成輸出
SkiaSharp 依賴 是 (版本衝突風險)
MAUI 專案相容性 衝突風險 (NU1608) 無衝突
流暢可連結API
直接 byte[] 輸出 手動 (通過 MemoryStream) .ToPngBinaryData()
多條碼檢測 是 (ExpectMultipleBarcodes)
讀取速度調整 N/A 是 (ReadingSpeed 列舉)
Linux / macOS支援 部分 (依賴 SkiaSharp) 全面
Docker/容器支持 需要配置
活躍維護 是 (社區) 是 (商業)
商業支援/SLA
許可證 Apache 2.0(免費) $999–$5,999 永久

快速開始:BarcodeLib 到IronBarcode遷移

可以立即開始遷移,採取以下基本步驟。

步驟 1:替換 NuGet 包

首先移除 BarcodeLib 包:

dotnet remove package BarcodeLib
dotnet remove package BarcodeLib
SHELL

如果您不確定其引用方式,請檢查 .csproj 文件:

grep -n "BarcodeLib" YourProject.csproj
grep -n "BarcodeLib" YourProject.csproj
SHELL

移除所有與 BarcodeLib 相關的 <PackageReference> 條目。 如果您新增了明確的 <PackageReference Include="SkiaSharp"> 覆蓋來解決 BarcodeLib 的 NU1608 警告,移除這些——安裝IronBarcode後,評估 SkiaSharp 是否仍需於其他用途。 然後安裝IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

步驟 2:更新命名空間

在引用它們的每個文件中替換 BarcodeLib using 指令:

// Before
using BarcodeStandard;
using SkiaSharp;

// After
using IronBarCode;
// Before
using BarcodeStandard;
using SkiaSharp;

// After
using IronBarCode;
Imports IronBarCode
Imports SkiaSharp
$vbLabelText   $csharpLabel

步驟 3:初始化授權

在應用程式啟動時新增授權初始化:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

對於 ASP.NET Core 應用程式,在 Program.cs 中放置此程式碼於 builder.Build() 之前。 對於控制台應用,將其放在 Main() 首部。 對於由其他應用調用的類庫,在宿主應用啓動的地方初始化它。

程式碼遷移範例

基本 Code128 生成

最常見的 BarcodeLib 模式:建立實例、設置屬性、調用 Encode()

BarcodeLib 方法:

using BarcodeStandard;
using SkiaSharp;

public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
    var b = new Barcode();
    b.IncludeLabel = true;
    SKImage img = b.Encode(Type.Code128, trackingNumber, 400, 120);
    using var stream = File.OpenWrite(outputPath);
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
}
using BarcodeStandard;
using SkiaSharp;

public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
    var b = new Barcode();
    b.IncludeLabel = true;
    SKImage img = b.Encode(Type.Code128, trackingNumber, 400, 120);
    using var stream = File.OpenWrite(outputPath);
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
}
Imports BarcodeStandard
Imports SkiaSharp

Public Sub GenerateShippingLabel(trackingNumber As String, outputPath As String)
    Dim b As New Barcode()
    b.IncludeLabel = True
    Dim img As SKImage = b.Encode(Type.Code128, trackingNumber, 400, 120)
    Using stream = File.OpenWrite(outputPath)
        img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
    End Using
End Sub
$vbLabelText   $csharpLabel

IronBarcode 方法:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
    BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .AddAnnotationTextBelowBarcode(trackingNumber)
        .SaveAsPng(outputPath);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
    BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .AddAnnotationTextBelowBarcode(trackingNumber)
        .SaveAsPng(outputPath);
}
Imports IronBarCode

Public Sub GenerateShippingLabel(trackingNumber As String, outputPath As String)
    BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128) _
        .ResizeTo(400, 120) _
        .AddAnnotationTextBelowBarcode(trackingNumber) _
        .SaveAsPng(outputPath)
End Sub
$vbLabelText   $csharpLabel

屬性設置器塊折疊為流暢的鏈式結構。 .AddAnnotationTextBelowBarcode() 取代了 b.IncludeLabel = true — 它明確接受標籤字串,以便您控制條形下方顯示的文字。 .ResizeTo() 取代了寬度/高度參數。 有關進階生成選項,請參見 IronBarcode 條碼生成文件

返回 byte[] — 常見 Web API 模式

BarcodeLib 3.x 返回 SKImage。 從中提取字節需要通過 SkiaSharp 編碼成 MemoryStream。IronBarcode直接提供 .ToPngBinaryData()

BarcodeLib 方法:

using BarcodeStandard;
using SkiaSharp;
using System.IO;

public byte[] GetBarcodeBytes(string data)
{
    var b = new Barcode();
    SKImage img = b.Encode(Type.Code128, data, 300, 100);

    using var ms = new MemoryStream();
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
    return ms.ToArray();
}
using BarcodeStandard;
using SkiaSharp;
using System.IO;

public byte[] GetBarcodeBytes(string data)
{
    var b = new Barcode();
    SKImage img = b.Encode(Type.Code128, data, 300, 100);

    using var ms = new MemoryStream();
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
    return ms.ToArray();
}
Imports BarcodeStandard
Imports SkiaSharp
Imports System.IO

Public Function GetBarcodeBytes(data As String) As Byte()
    Dim b As New Barcode()
    Dim img As SKImage = b.Encode(Type.Code128, data, 300, 100)

    Using ms As New MemoryStream()
        img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
        Return ms.ToArray()
    End Using
End Function
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;

public byte[] GetBarcodeBytes(string data)
{
    return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .ToPngBinaryData();
}
using IronBarCode;

public byte[] GetBarcodeBytes(string data)
{
    return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .ToPngBinaryData();
}
Imports IronBarCode

Public Function GetBarcodeBytes(data As String) As Byte()
    Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
        .ResizeTo(300, 100) _
        .ToPngBinaryData()
End Function
$vbLabelText   $csharpLabel

中間的 MemoryStream 步驟消失了。 .ToPngBinaryData() 直接返回 byte[],這正是 HTTP 回應主體、資料庫 BLOB 列和文件寫入器實際需要的。

Web API 控制器操作

BarcodeLib 方法:

using BarcodeStandard;
using SkiaSharp;
using Microsoft.AspNetCore.Mvc;
using System.IO;

[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
    [HttpGet("{sku}")]
    public IActionResult GetLabel(string sku)
    {
        var b = new Barcode();
        SKImage img = b.Encode(Type.Code128, sku, 400, 120);

        using var ms = new MemoryStream();
        img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
        return File(ms.ToArray(), "image/png");
    }
}
using BarcodeStandard;
using SkiaSharp;
using Microsoft.AspNetCore.Mvc;
using System.IO;

[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
    [HttpGet("{sku}")]
    public IActionResult GetLabel(string sku)
    {
        var b = new Barcode();
        SKImage img = b.Encode(Type.Code128, sku, 400, 120);

        using var ms = new MemoryStream();
        img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
        return File(ms.ToArray(), "image/png");
    }
}
Imports BarcodeStandard
Imports SkiaSharp
Imports Microsoft.AspNetCore.Mvc
Imports System.IO

<ApiController>
<Route("api/labels")>
Public Class LabelsController
    Inherits ControllerBase

    <HttpGet("{sku}")>
    Public Function GetLabel(sku As String) As IActionResult
        Dim b As New Barcode()
        Dim img As SKImage = b.Encode(Type.Code128, sku, 400, 120)

        Using ms As New MemoryStream()
            img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
            Return File(ms.ToArray(), "image/png")
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
    [HttpGet("{sku}")]
    public IActionResult GetLabel(string sku)
    {
        byte[] pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
            .ResizeTo(400, 120)
            .ToPngBinaryData();

        return File(pngBytes, "image/png");
    }
}
using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
    [HttpGet("{sku}")]
    public IActionResult GetLabel(string sku)
    {
        byte[] pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
            .ResizeTo(400, 120)
            .ToPngBinaryData();

        return File(pngBytes, "image/png");
    }
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/labels")>
Public Class LabelsController
    Inherits ControllerBase

    <HttpGet("{sku}")>
    Public Function GetLabel(sku As String) As IActionResult
        Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
            .ResizeTo(400, 120) _
            .ToPngBinaryData()

        Return File(pngBytes, "image/png")
    End Function
End Class
$vbLabelText   $csharpLabel

通過刪除 MemoryStream 區塊和 SkiaSharp 編碼步驟,控制器操作收縮。字節陣列直接從 .ToPngBinaryData() 流入 File()

QR 碼生成

BarcodeLib 3.x 不生成 QR 碼——BarcodeStandard.Type enum 內不包含 2D 條目。 需要 QR 旁邊的 BarcodeLib 的項目通常新增了第二個程式庫如 QRCoder。IronBarcode使用專用的 QRCodeWriter 類,並附有額外的選項來嵌入標誌和樣式。

BarcodeLib 方法:

// BarcodeLib has no QR Code (or any 2D) support.
// Generating a QR code from a BarcodeLib project required adding a
// second library such as QRCoder:
//
// using QRCoder;
// var qrGen = new QRCodeGenerator();
// var data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q);
// // ... separate API, separate dependency to maintain.
// BarcodeLib has no QR Code (or any 2D) support.
// Generating a QR code from a BarcodeLib project required adding a
// second library such as QRCoder:
//
// using QRCoder;
// var qrGen = new QRCodeGenerator();
// var data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q);
// // ... separate API, separate dependency to maintain.
' BarcodeLib has no QR Code (or any 2D) support.
' Generating a QR code from a BarcodeLib project required adding a
' second library such as QRCoder:
'
' Imports QRCoder
' Dim qrGen As New QRCodeGenerator()
' Dim data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q)
' ' ... separate API, separate dependency to maintain.
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;

// Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
    .SaveAsPng("qr.png");

// QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
using IronBarCode;

// Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
    .SaveAsPng("qr.png");

// QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
Imports IronBarCode

' Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300) _
    .SaveAsPng("qr.png")

' QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")
$vbLabelText   $csharpLabel

QRCodeWriter.CreateQrCode() 將資料字串和像素大小作為參數。 通過鏈式方法可以實現嵌入標誌、顏色定制和錯誤校正等級。 有關 QR 碼樣式選項,請參見 IronBarcode QR 碼文件

EAN-13 和 UPC-A

零售庫存系統中常見。 枚舉名稱更改但值是直接對等的。

BarcodeLib 方法:

using BarcodeStandard;
using SkiaSharp;

// EAN-13 product barcode
var b = new Barcode();
SKImage ean = b.Encode(Type.Ean13, "5901234123457", 250, 100);
using (var s = File.OpenWrite("product-ean.png"))
    ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);

// UPC-A for US retail
SKImage upc = b.Encode(Type.UpcA, "012345678905", 250, 100);
using (var s = File.OpenWrite("product-upc.png"))
    upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
using BarcodeStandard;
using SkiaSharp;

// EAN-13 product barcode
var b = new Barcode();
SKImage ean = b.Encode(Type.Ean13, "5901234123457", 250, 100);
using (var s = File.OpenWrite("product-ean.png"))
    ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);

// UPC-A for US retail
SKImage upc = b.Encode(Type.UpcA, "012345678905", 250, 100);
using (var s = File.OpenWrite("product-upc.png"))
    upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
Imports BarcodeStandard
Imports SkiaSharp
Imports System.IO

' EAN-13 product barcode
Dim b As New Barcode()
Dim ean As SKImage = b.Encode(Type.Ean13, "5901234123457", 250, 100)
Using s = File.OpenWrite("product-ean.png")
    ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s)
End Using

' UPC-A for US retail
Dim upc As SKImage = b.Encode(Type.UpcA, "012345678905", 250, 100)
Using s = File.OpenWrite("product-upc.png")
    upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s)
End Using
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;

// EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .ResizeTo(250, 100)
    .SaveAsPng("product-ean.png");

// UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA)
    .ResizeTo(250, 100)
    .SaveAsPng("product-upc.png");
using IronBarCode;

// EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .ResizeTo(250, 100)
    .SaveAsPng("product-ean.png");

// UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA)
    .ResizeTo(250, 100)
    .SaveAsPng("product-upc.png");
Imports IronBarCode

' EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .ResizeTo(250, 100) _
    .SaveAsPng("product-ean.png")

' UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA) _
    .ResizeTo(250, 100) _
    .SaveAsPng("product-upc.png")
$vbLabelText   $csharpLabel

新增條碼讀取(全新功能)

BarcodeLib 無讀取 API。 如果您的遷移是因為新的需求,要求掃描條碼——從上傳的圖像、倉庫掃描器或掃描的文件——那麼不需要第二個庫來處理:

BarcodeLib 方法:

// BarcodeLib — no reading API exists
// Adding reading requires a separate library such as ZXing.Net:
// dotnet add package ZXing.Net
// using ZXing;
// var reader = new BarcodeReader();
// // ... separate API, separate dependency graph to manage
// BarcodeLib — no reading API exists
// Adding reading requires a separate library such as ZXing.Net:
// dotnet add package ZXing.Net
// using ZXing;
// var reader = new BarcodeReader();
// // ... separate API, separate dependency graph to manage
' BarcodeLib — no reading API exists
' Adding reading requires a separate library such as ZXing.Net:
' dotnet add package ZXing.Net
' Imports ZXing
' Dim reader As New BarcodeReader()
' ' ... separate API, separate dependency graph to manage
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;

// Read a barcode from an image file
var results = BarcodeReader.Read("incoming-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
}

// Read all barcodes from a multi-page PDF — no PDF library required
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}

// Configure for high-volume scanning with multiple barcodes per image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var warehouseResults = BarcodeReader.Read("dock-scan.png", options);
using IronBarCode;

// Read a barcode from an image file
var results = BarcodeReader.Read("incoming-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
}

// Read all barcodes from a multi-page PDF — no PDF library required
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}

// Configure for high-volume scanning with multiple barcodes per image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var warehouseResults = BarcodeReader.Read("dock-scan.png", options);
Imports IronBarCode

' Read a barcode from an image file
Dim results = BarcodeReader.Read("incoming-label.png")
For Each result In results
    Console.WriteLine($"Value: {result.Value}")
    Console.WriteLine($"Format: {result.Format}")
Next

' Read all barcodes from a multi-page PDF — no PDF library required
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each result In pdfResults
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next

' Configure for high-volume scanning with multiple barcodes per image
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}
Dim warehouseResults = BarcodeReader.Read("dock-scan.png", options)
$vbLabelText   $csharpLabel

BarcodeReader.Read() 接受圖像文件、PDF 文件、流和 System.Drawing.Bitmap 物件。 ReadingSpeed 枚舉讓您在大批量掃描時可在全面性和性能之間取捨。 有關讀取配置選項,請參見 IronBarcode 讀取文件

解決 SkiaSharp 衝突

如果遷移是因為出現 NU1608 警告,請在切換包後驗證衝突已解決。 在運行 dotnet remove package BarcodeLibdotnet add package IronBarcode 後,重建並檢查輸出:

dotnet build 2>&1 | grep -i "NU1608|SkiaSharp"
dotnet build 2>&1 | grep -i "NU1608|SkiaSharp"
SHELL

如果不顯示輸出,則衝突已解決。 如果 SkiaSharp 警告仍然存在,它們來自於您依賴圖中不同的包——IronBarcode 不是來源。

BarcodeLib 方法:


<ItemGroup>
  <PackageReference Include="BarcodeLib" Version="3.1.5" />

  <PackageReference Include="SkiaSharp" Version="3.116.1" />
</ItemGroup>

<ItemGroup>
  <PackageReference Include="BarcodeLib" Version="3.1.5" />

  <PackageReference Include="SkiaSharp" Version="3.116.1" />
</ItemGroup>
XML

IronBarcode 方法:


<ItemGroup>
  <PackageReference Include="IronBarcode" Version="*" />

  <PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>

<ItemGroup>
  <PackageReference Include="IronBarcode" Version="*" />

  <PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
XML

BarcodeLib API 到IronBarcode映射參考

BarcodeLib IronBarcode
new Barcode() 靜態 API — 不需要實例
b.Encode(Type.Code128, "data", w, h) BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
b.IncludeLabel = true .AddAnnotationTextBelowBarcode("text")
寬度/高度傳遞到 Encode() .ResizeTo(width, height)
返回 SKImage .SaveAsPng(path) / .ToPngBinaryData()
Type.Code128 BarcodeEncoding.Code128
Type.Code39 BarcodeEncoding.Code39
Type.Ean13 BarcodeEncoding.EAN13
Type.UpcA BarcodeEncoding.UPCA
無 QR 支援 (僅 1D) BarcodeEncoding.QRCode (也包括 QRCodeWriter)
Type.Itf14 BarcodeEncoding.ITF14
Type.Codabar BarcodeEncoding.Codabar
無讀取 API BarcodeReader.Read(path)
MAUI 中的 SkiaSharp 版本衝突 無衝突依賴
img.Encode(...).SaveTo(stream) .SaveAsPng(path)
MemoryStream + SkiaSharp 編碼 .ToPngBinaryData()

常見遷移問題及解決方案

問題 1:型別枚舉命名空間更改

BarcodeLib 3.x: 使用 BarcodeStandard.Type.Code128 (PascalCase,在 BarcodeStandard 命名空間)。 舊的 2.x 程式碼可能使用 BarcodeLib.TYPE.CODE128 (大寫常數,BarcodeLib 命名空間) — 在實際的程式碼庫中遷移時兩種形式都有出現。

解決方案: 使用 BarcodeEncoding.Code128 進行替換。 在 .cs 文件中,用 grep 找出所有出現的情況:

grep -rn "Type\.\|TYPE\." --include="*.cs" .
grep -rn "Type\.\|TYPE\." --include="*.cs" .
SHELL

常見替換:Type.Code128 / TYPE.CODE128Type.Ean13 / TYPE.EAN13Type.UpcA / TYPE.UPCAType.Itf14 / TYPE.ITF14Type.Codabar / TYPE.CO/DABARBarcodeEncoding.Codabar。 BarcodeLib 無 QR 進入; 任何 TYPE.QR_Code 都是來自 2.x 版本或分支的無用程式碼 — 用 BarcodeEncoding.QRCode 替換(或使用 QRCodeWriter 進行樣式化輸出)。

問題 2:SKImage / Image 返回型別

BarcodeLib: b.Encode() 在 3.x 返回 SKImage,在 2.x 返回 System.Drawing.Image。 這兩種型別不會在IronBarcode上編譯。

解決方案: 刪除中間圖像變數,並使用流暢鏈上的相應終端方法替換保存邏輯:

// Before (BarcodeLib 3.x)
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();

// After
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .ToPngBinaryData();
// Before (BarcodeLib 3.x)
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();

// After
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .ToPngBinaryData();
Imports System.IO

' Before (BarcodeLib 3.x)
Dim img As SKImage = b.Encode(Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
    Return ms.ToArray()
End Using

' After
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

搜尋 SKImage img = b.EncodeImage img = b.Encode 樣式以找到所有受影響的位置。

問題 3:寬度和高度參數

BarcodeLib: 寬度和高度是 3.x 中 Encode(Type, string, int, int) 的位置參數,並在舊的 2.x 程式碼中是獨立的 b.Width / b.Height 屬性分配。 這兩種形式都需要移植。

解決方案: 寬度/高度成為單一的 .ResizeTo(width, height) 調用,連結在 CreateBarcode() 之後。 找出調用站點:

# Find Encode() calls and any Width/Height property assignments
grep -n "\.Encode(\|\.Width = \|\.Height = " --include="*.cs" -r .
# Find Encode() calls and any Width/Height property assignments
grep -n "\.Encode(\|\.Width = \|\.Height = " --include="*.cs" -r .
SHELL

然後用單一 .ResizeTo(width, height) 連結調用替換尺寸參數或屬性對應。

問題 4:Includelabel 布林切換

BarcodeLib: b.IncludeLabel = true 是一個布林值,自動將編碼的資料字串作為條形下可見文字呈現。

解決方案: 使用 .AddAnnotationTextBelowBarcode("text"),其顯式接收標籤字串。 在大多數情況下,將相同的資料字串傳遞到條碼中。 如果原始程式碼使用了 IncludeLabel = true 並依賴於 BarcodeLib 自動渲染資料為標籤,明確地傳遞相同的資料字串:

BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .AddAnnotationTextBelowBarcode(data)  // pass the same string
    .SaveAsPng(outputPath);
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .AddAnnotationTextBelowBarcode(data)  // pass the same string
    .SaveAsPng(outputPath);
Dim barcodeWriter = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
barcodeWriter.AddAnnotationTextBelowBarcode(data) ' pass the same string
barcodeWriter.SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

問題 5:移除 BarcodeLib 後留下的 SkiaSharp 引用

BarcodeLib: 專案經常累積明確的 <PackageReference Include="SkiaSharp"> 條目,專門用於覆蓋 BarcodeLib 的版本限制。 移除 BarcodeLib 後,這些成為孤立的。

解決方案: 切換到IronBarcode後,驗證 SkiaSharp 是否仍然被其他包需要,然後再移除明確的引用:

# Check if SkiaSharp is still referenced by anything other than the explicit override
dotnet list package --include-transitive 2>&1 | grep -i skia
# Check if SkiaSharp is still referenced by anything other than the explicit override
dotnet list package --include-transitive 2>&1 | grep -i skia
SHELL

如果 SkiaSharp 只因現在已移除的明確 <PackageReference> 而出現,請移除該條目。 如果仍由 MAUI 或其他依賴引入,則保留——IronBarcode 不會與之衝突。

BarcodeLib 遷移檢查表

遷移前任務

在開始之前運行這些搜索以了解所需變更的範圍:

# Find all BarcodeLib using directives (both 3.x BarcodeStandard and older BarcodeLib)
grep -rn "using BarcodeStandard\|using BarcodeLib" --include="*.cs" .

# Find Barcode object instantiation
grep -rn "new Barcode()" --include="*.cs" .

# Find Encode calls
grep -rn "\.Encode(" --include="*.cs" .

# Find Type enum usage (3.x PascalCase and 2.x uppercase)
grep -rn "Type\.Code128\|Type\.Ean13\|Type\.UpcA\|TYPE\.CODE128\|TYPE\.EAN13\|TYPE\.UPCA" --include="*.cs" .

# Find IncludeLabel usage
grep -rn "IncludeLabel" --include="*.cs" .

# Find the package references in project files
grep -rn "BarcodeLib" --include="*.csproj" .

# Find NU1608 evidence in lock files
grep -rn "NU1608" .
# Find all BarcodeLib using directives (both 3.x BarcodeStandard and older BarcodeLib)
grep -rn "using BarcodeStandard\|using BarcodeLib" --include="*.cs" .

# Find Barcode object instantiation
grep -rn "new Barcode()" --include="*.cs" .

# Find Encode calls
grep -rn "\.Encode(" --include="*.cs" .

# Find Type enum usage (3.x PascalCase and 2.x uppercase)
grep -rn "Type\.Code128\|Type\.Ean13\|Type\.UpcA\|TYPE\.CODE128\|TYPE\.EAN13\|TYPE\.UPCA" --include="*.cs" .

# Find IncludeLabel usage
grep -rn "IncludeLabel" --include="*.cs" .

# Find the package references in project files
grep -rn "BarcodeLib" --include="*.csproj" .

# Find NU1608 evidence in lock files
grep -rn "NU1608" .
SHELL

記錄所有由每次搜索影響的文件。 注意哪些專案直接引用 BarcodeLib,以及哪些專案從屬性繼承它。 識別任何僅為解決 BarcodeLib 衝突而新增的明確 SkiaSharp 版。

程式碼更新任務

  1. 為每個專案運行 dotnet remove package BarcodeLib
  2. 移除任何僅為修補 BarcodeLib 衝突而新增的明確 SkiaSharp 版本替代引用
  3. 為每個專案運行 dotnet add package IronBarcode
  4. 在每個專案中將 IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; 新增到應用程式啟動
  5. using IronBarCode; 替換所有 .cs 文件中的 using BarcodeStandard;(或較舊程式碼中的 using BarcodeLib;)和 using SkiaSharp;
  6. 移除 using System.Drawing.Imaging; 匯入漏留 2.x ImageFormat.Png 使用的
  7. BarcodeWriter.CreateBarcode()流暢鏈替換 new Barcode() + Encode() 調用
  8. 替換 Type.Code128 / TYPE.CODE128BarcodeEncoding.Code128 和所有其他枚舉值
  9. 替換寬度/高度參數(或 2.x b.Width = N; b.Height = M;) with .ResizeTo(N, M) 鏈式呼叫
  10. .AddAnnotationTextBelowBarcode(data) 替換 b.IncludeLabel = true;
  11. .SaveAsPng(path).ToPngBinaryData() 替換 img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(...)
  12. 移除中間 SKImage / Image 變數和 MemoryStream 區塊,因為 .ToPngBinaryData() 將它們替代
  13. 在需要的地方新增條碼讀取程式碼(BarcodeReader.Read()

遷移後測試

  • 在還原輸出中確認沒有 NU1608 警告剩餘時編譯專案
  • 運行 dotnet build 2>&1 | grep -i "NU1608|SkiaSharp" 以驗證 SkiaSharp 衝突已完全解決
  • 將生成的條碼和 BarcodeLib 的已知良好樣本的視覺輸出進行比較
  • 驗證 QR 碼是否使用移動掃描器或 BarcodeReader.Read() 方法正確解碼
  • 如果適用,在零售掃描器硬體上測試 EAN-13 和 UPC-A 條形碼
  • 驗證所有輸出目標中的圖像顯示正確:文件系統、HTTP 回應、資料庫儲存
  • 在真實文件上測試任何 PDF 條碼讀取方案,使用 BarcodeReader.Read("file.pdf")
  • 如果專案目標為 Linux 或 macOS,則確認跨平台構建成功
  • 驗證 MAUI 在 Android 和 iOS 目標上完成構建而無 SkiaSharp 綁定錯誤

遷移到IronBarcode的主要優勢

無需第二個程式庫的條碼閱讀: 需要讀取能力的團隊最直接的收益是消除第二程式庫依賴。 BarcodeReader.Read() 位於同一包內,使用相同的 using IronBarCode; 語句,無需額外的 NuGet 安裝。 ZXing.Net 及其自身的依賴圖不再是專案的一部分。

無 SkiaSharp 版本衝突:IronBarcode與應用程式程式碼不共享 SkiaSharp 依賴圖。 MAUI 專案、Blazor 專案和任何多個包聚焦於 SkiaSharp 的專案可以安裝 IronBarcode,而無需擔心 NU1608 警告或運行時綁定失敗。 BarcodeLib 引入的版本談判已經消失。

直接字節陣列輸出: .ToPngBinaryData() 在流暢鏈末端返回 byte[]。 BarcodeLib 為字節陣列輸出所需要的 MemoryStream 中介物已從每個控制器動作、服務方法和生成條碼的 API 處理器中消除。

PDF 條碼處理: BarcodeReader.Read() 原生接受 PDF 文件。 生成帶有嵌入條碼的 PDF 文件的應用程式可以直接讀取這些條碼,而不需單獨的 PDF 渲染程式庫。 完整的鏈條——生成、PDF 嵌入和讀取——由IronBarcode處理。

商業支援與 SLA:IronBarcode由 Iron Software 的商業支援模式支援,具有明確的更新節奏。 當新的 .NET 版本問世或 .NET 生態系統出現重大變更時,IronBarcode 根據商業 SLA 而非社區可用性發布相容更新。

無需第二個程式庫的 QR 碼生成: QRCodeWriter 支援標誌嵌入、顏色定制和錯誤校正等級配置,通過鏈式方法實現。 BarcodeLib 3.x 僅生成 1D 符號學——需要 QR 與 BarcodeLib 同時需要的專案以前常常新增第二個程式庫如 QRCoder。 QR 碼需求擴展的團隊可以在同一包中獲得這些功能,而不改變他們的生成工作流程。

常見問題

為什麼我要從BarcodeLib遷移到IronBarcode?

常見的理由包括簡化授權(去除SDK +運行時鑰匙的複雜性)、消除吞吐量限制、獲得原生PDF支持、改善Docker/CI/CD部署,並減少生產程式碼中的API樣板。

如何用IronBarcode替換BarcodeLib的API呼叫?

用IronBarCode.License.LicenseKey = "key"替換實例建立和授權樣板。用BarcodeReader.Read(path)替換讀取呼叫,用BarcodeWriter.CreateBarcode(data, encoding)替換寫入呼叫。靜態方法不需要實例管理。

從BarcodeLib遷移到IronBarcode時程式碼會有多少變動?

大多數遷移會導致較少的程式碼行。授權樣板、實例構造函式和顯式格式配置被移除。核心讀/寫操作映射為較短的IronBarcode等價物,且結果物件更清晰。

在遷移期間,我需要同時安裝BarcodeLib和IronBarcode嗎?

不需要。大多數遷移是直接替換而不是並行操作。一次遷移一個服務類,替換NuGet引用,並更新實例化和API呼叫模式後再移動到下一個類。

IronBarcode的NuGet包名稱是什麼?

包名是'IronBarCode'(大寫B和C)。可以用'Install-Package IronBarCode'或'dotnet add package IronBarCode'安裝。程式碼中的using指令是'using IronBarCode;'。

與BarcodeLib相比,IronBarcode如何簡化Docker部署?

IronBarcode是沒有外部SDK文件或掛載許可配置的NuGet封裝。在Docker中,設置IRONBARCODE_LICENSE_KEY環境變數,包在啟動時處理許可驗證。

從BarcodeLib遷移後,IronBarcode會自動檢測所有條碼格式嗎?

是的。IronBarcode自動檢測所有支持的格式的符號學。不需要顯式的BarcodeTypes枚舉。如果格式已經知道並且性能很重要,BarcodeReaderOptions允許限制搜索空間作為優化。

IronBarcode是否可以不使用單獨的庫讀取PDF中的條碼?

可以。BarcodeReader.Read("document.pdf")原生處理PDF文件。結果包括每個條碼發現的頁碼、格式、值和置信度。不需要外部PDF渲染步驟。

IronBarcode如何處理並行條碼處理?

IronBarcode的靜態方法是無狀態且執行緒安全的。直接使用Parallel.ForEach遍歷文件列表,不需要每個執行緒的實例管理。BarcodeReaderOptions.MaxParallelThreads控制內部執行緒預算。

從BarcodeLib遷移到IronBarcode時,哪些結果屬性會改變?

常見的重命名:BarcodeValue變為Value,BarcodeType變為Format。IronBarcode結果還新增了Confidence和PageNumber。整個解決方案的搜索和替換可處理現有結果處理程式碼中的重新命名。

我如何在CI/CD管道中設置IronBarcode授權?

將IRONBARCODE_LICENSE_KEY作為管道機密儲存,在應用程式啟動程式碼中分配IronBarCode.License.LicenseKey。一個機密涵蓋所有環境,包括開發、測試、分期和生產。

IronBarcode是否支持生成帶有自定義樣式的QR碼?

支持。QRCodeWriter.CreateQrCode()支持通過ChangeBarCodeColor()自定義顏色,通過AddBrandLogo()嵌入logo,可配置錯誤校正級別,以及包括PNG、JPG、PDF和流在內的多種輸出格式。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話