跳過到頁腳內容
與其他組件的比較

NetBarcode 與 IronBarcode:C# 條碼庫對比

NetBarcode 的 Type 枚舉中沒有二維碼條目。 當一個貨運標籤項目在第三個月增加了二維碼要求時,開發人員會求助於第二個庫。 第二個函式庫有自己的 API 介面、自己的發布計劃,以及一個共享的 SixLabors.ImageSharp 依賴項,其版本可能與 NetBarcode 所需的版本不一致。 本文將比較分析 NetBarcode 的功能、適用場景以及IronBarcode如何彌補 NetBarcode 的不足,而無需添加第二個或第三個軟體包。

了解 NetBarcode

NetBarcode 是一個開源的 .NET 條碼產生庫,以 和 許可證發布。 它旨在根據字串資料生成線性條碼圖像,並且完美地實現了這一目的。 該函式庫針對 Code128、EAN-13、UPC-A 和其他十種 1D 格式——所有這些都透過一個簡單的建構函式和一小組輸出方法公開。 它依賴 SixLabors.ImageSharp 提供圖像渲染層,並且自 1.8 版本以來,這種依賴關係透過 Image<Rgba32> 返回類型反映在公共 API 中 GetImage()

NetBarcode 並不打算成為通用條碼工具包。 它不具備讀取功能,也不支援二維格式。 這些都是經過深思熟慮的範圍界定。 該程式庫非常適合只需要一維條碼而不需要其他功能的應用,其 和 許可證使得在開源環境中採用該庫變得非常簡單。

主要架構特徵:

  • MIT 許可證:該庫本身採用 和 許可證,但其 SixLabors.ImageSharp 依賴項採用分離式商業許可證,該許可證適用於達到收入門檻的情況。 -僅一維設計: Type 枚舉定義了 14 種條碼格式,全部為線性格式; 沒有二維條目
  • SixLabors.ImageSharp 依賴項:圖像渲染委託給 ImageSharp,並且自 v1.8 版本起,GetImage() 方法返回 Image<Rgba32>,從而在公共 API 中直接暴露 ImageSharp 的類型。 -基於建構函數的 API:條碼使用 new Barcode(data, Type.X) 創建,並使用 SaveImageFile()GetImage() 儲存或擷取。 -無讀取 API: NetBarcode 僅用於產生; 目前沒有用於解碼條碼圖像的方法或類別。 -無批次處理:每個條碼都是獨立的建構函式呼叫; 沒有內建枚舉或批次管道

枚舉類型設計邊界

Type 枚舉是 NetBarcode 可以產生的權威清單。 檢查它可知該函式庫的範圍:

// NetBarcode Type enum — complete list as of v1.8
public enum Type
{
    Code128,
    Code128A,
    Code128B,
    Code128C,
    Code39,
    Code39Extended,
    Code93,
    EAN8,
    EAN13,
    UPCA,
    UPCE,
    Codabar,
    ITF,
    MSI
}

// These entries do not exist — attempting to use them produces a CS0117 compile error:
// Type.QRCode      — does not exist
// Type.DataMatrix  — does not exist
// Type.PDF417      — does not exist
// Type.Aztec       — does not exist
// NetBarcode Type enum — complete list as of v1.8
public enum Type
{
    Code128,
    Code128A,
    Code128B,
    Code128C,
    Code39,
    Code39Extended,
    Code93,
    EAN8,
    EAN13,
    UPCA,
    UPCE,
    Codabar,
    ITF,
    MSI
}

// These entries do not exist — attempting to use them produces a CS0117 compile error:
// Type.QRCode      — does not exist
// Type.DataMatrix  — does not exist
// Type.PDF417      — does not exist
// Type.Aztec       — does not exist
Public Enum Type
    Code128
    Code128A
    Code128B
    Code128C
    Code39
    Code39Extended
    Code93
    EAN8
    EAN13
    UPCA
    UPCE
    Codabar
    ITF
    MSI
End Enum

' These entries do not exist — attempting to use them produces a BC30456 compile error:
' Type.QRCode      — does not exist
' Type.DataMatrix  — does not exist
' Type.PDF417      — does not exist
' Type.Aztec       — does not exist
$vbLabelText   $csharpLabel

這並非一個等待提交 pull request 的缺失功能。枚舉類型包含十四個條目,全部為一維類型,這符合庫的預期範圍。 任何需要 QR 碼、DataMatrix、PDF417 或 阿茲特克 格式的應用程式都必須單獨取得相應的軟體包。

了解 IronBarcode

IronBarcode 是一個商業的 .NET 條碼庫,在一個軟體包中涵蓋了條碼的產生和讀取。 它由 Iron Software 開發和維護,並定期更新以適應目前的 .NET 版本。 此函式庫的靜態 API 介面設計為從一種條碼格式切換到另一種條碼格式只需更改一個常數——產生 Code128 的同一個 BarcodeWriter.CreateBarcode 呼叫也可以產生 QR 碼、DataMatrix、PDF417 和 Aztec。

IronBarcode 透過 BarcodeReader 類別處理條碼讀取,該類別接受影像檔案和 PDF 文檔,並傳回具有格式標識的解碼結果。 這意味著產生和讀取共享一個依賴項、一個許可證和一套發行說明來追蹤。

主要特點:

-統一產生和讀取: BarcodeWriterBarcodeReader 都包含在同一個 NuGet 套件中。 -支援的格式超過 50 種: 1D 格式包含所有 NetBarcode 等效格式; 二維碼格式包括二維碼、DataMatrix、PDF417、Aztec 等。

  • Fluent Chain API: BarcodeWriter.CreateBarcode(data, encoding) 傳回一個 GeneratedBarcode 對象,其輸出方法包括 SaveAsPng()SaveAsJpeg()、@@--CODE-94196--@CODE-94195--@@、@@--CODE-94196--@ 以及基於流的重載方法以及基於流的重載方法以及基於流的重載方法以及基於流的重載方法。 -不依賴 ImageSharp:IronBarcode的圖像渲染是獨立的; 未引入 SixLabors 傳遞依賴關係
  • PDF 支援:除了影像格式外,讀取 API 也直接接受 .pdf 檔案。 -商業許可證:需要許可證密鑰; 試用模式可用,購買後可移除浮水印。

功能比較

特點 NetBarcode IronBarcode
一維條碼生成
二維條碼生成
條碼讀取
PDF 支援
總符號學 14 50歲以上
ImageSharp依賴性 是的(分證)
許可模式 MIT(+ ImageSharp 條件) 商業的

詳細功能比較

特點 NetBarcode IronBarcode
世代
Code128、EAN-13、UPC-A、Code39
EAN-8、UPC-E、Code93、Codabar、ITF、MSI
QR 圖碼
數據矩陣
PDF417
阿茲特克
GS1-128,GS1 資料條
郵政格式(智慧郵件、皇家郵政)
SVG 輸出
閱讀
解碼條碼影像
讀取 PDF 文檔
多條碼檢測
自動格式偵測
API 設計
基於構造器的創建 否(靜態方法)
流暢的輸出鏈
批量處理支持 手動的 內建
許可和依賴關係
圖書館許可 商業的
ImageSharp依賴性
商業支援 社區 專業

格式覆蓋範圍

NetBarcode 方法

NetBarcode 透過 Type 枚舉提供 14 種線性條碼格式。 在這個範圍內,格式選擇很簡單-將對應的枚舉成員傳遞給建構函式即可。 界線同樣清晰:嘗試使用枚舉範圍以外的格式會產生編譯時錯誤。

// NetBarcode — formats that compile and produce output
using NetBarcode;

var code128 = new Barcode("12345678901234", Type.Code128);
code128.SaveImageFile("shipping.png");

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product.png");

// NetBarcode — formats that produce CS0117 compile errors
// var qr     = new Barcode("data", Type.QRCode);     // error CS0117
// var dm     = new Barcode("data", Type.DataMatrix);  // error CS0117
// var p417   = new Barcode("data", Type.PDF417);      // error CS0117
// var aztec  = new Barcode("data", Type.Aztec);       // error CS0117
// NetBarcode — formats that compile and produce output
using NetBarcode;

var code128 = new Barcode("12345678901234", Type.Code128);
code128.SaveImageFile("shipping.png");

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product.png");

// NetBarcode — formats that produce CS0117 compile errors
// var qr     = new Barcode("data", Type.QRCode);     // error CS0117
// var dm     = new Barcode("data", Type.DataMatrix);  // error CS0117
// var p417   = new Barcode("data", Type.PDF417);      // error CS0117
// var aztec  = new Barcode("data", Type.Aztec);       // error CS0117
Imports NetBarcode

Dim code128 As New Barcode("12345678901234", Type.Code128)
code128.SaveImageFile("shipping.png")

Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product.png")

' NetBarcode — formats that produce CS0117 compile errors
' Dim qr As New Barcode("data", Type.QRCode)     ' error CS0117
' Dim dm As New Barcode("data", Type.DataMatrix) ' error CS0117
' Dim p417 As New Barcode("data", Type.PDF417)   ' error CS0117
' Dim aztec As New Barcode("data", Type.Aztec)   ' error CS0117
$vbLabelText   $csharpLabel

在某些行業,這種邊界會成為一種限制,例如藥品追蹤(根據 FDA 2D 條碼規定需要使用 DataMatrix)、航空公司登機證(Aztec)、物流清單(PDF417)和行動行銷(二維碼)。 這些要求都使得 NetBarcode 無法作為獨立解決方案使用。

IronBarcode。 方法

IronBarcode 以相同的 BarcodeWriter.CreateBarcode 方法公開所有支援的格式。 從 1D 格式過渡到 2D 格式時,API 介面不會改變-只有 BarcodeEncoding 常數有所不同。

using IronBarCode;

// 1D formats — identical API to the 2D examples below
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping.png");

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product.png");

// 2D formats — same method, different encoding constant
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");

BarcodeWriter.CreateBarcode("M1DOE/JOHN MR ABC123 JFKLHR 0012 123Y015A0001 100", BarcodeEncoding.Aztec)
    .SaveAsPng("boarding-pass.png");
using IronBarCode;

// 1D formats — identical API to the 2D examples below
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping.png");

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product.png");

// 2D formats — same method, different encoding constant
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");

BarcodeWriter.CreateBarcode("M1DOE/JOHN MR ABC123 JFKLHR 0012 123Y015A0001 100", BarcodeEncoding.Aztec)
    .SaveAsPng("boarding-pass.png");
Imports IronBarCode

' 1D formats — identical API to the 2D examples below
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping.png")

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .SaveAsPng("product.png")

' 2D formats — same method, different encoding constant
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")

BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("pharma-label.png")

BarcodeWriter.CreateBarcode("M1DOE/JOHN MR ABC123 JFKLHR 0012 123Y015A0001 100", BarcodeEncoding.Aztec) _
    .SaveAsPng("boarding-pass.png")
$vbLabelText   $csharpLabel

支援的常數完整清單可在支援的條碼格式參考中找到,涵蓋所有二維條碼產生格式以及完整的 1D 條碼集。

產生 API 設計

NetBarcode 方法

NetBarcode 的生成模型是基於建構函式的。 使用資料字串和枚舉值實例化一個 Barcode 物件。 輸出可以直接儲存為 SaveImageFile(),也可以透過 GetImage()Image<Rgba32> 的形式檢索。 自 1.8 版本起,GetImage() 的傳回類型為 SixLabors.ImageSharp 類型,這表示任何儲存或處理傳回值的程式碼都必須匯入 ImageSharp API 並在其中執行。

using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

// Constructor-based creation
var barcode = new Barcode("12345678901234", Type.Code128);

// Save to file — straightforward
barcode.SaveImageFile("code128.png");

// GetImage() returns Image<Rgba32> — ImageSharp import required
Image<Rgba32> image = barcode.GetImage();

// Further processing requires familiarity with the ImageSharp API
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

// Constructor-based creation
var barcode = new Barcode("12345678901234", Type.Code128);

// Save to file — straightforward
barcode.SaveImageFile("code128.png");

// GetImage() returns Image<Rgba32> — ImageSharp import required
Image<Rgba32> image = barcode.GetImage();

// Further processing requires familiarity with the ImageSharp API
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO

' Constructor-based creation
Dim barcode As New Barcode("12345678901234", Type.Code128)

' Save to file — straightforward
barcode.SaveImageFile("code128.png")

' GetImage() returns Image(Of Rgba32) — ImageSharp import required
Dim image As Image(Of Rgba32) = barcode.GetImage()

' Further processing requires familiarity with the ImageSharp API
Using stream As New MemoryStream()
    image.SaveAsPng(stream)
    Dim bytes As Byte() = stream.ToArray()
End Using
$vbLabelText   $csharpLabel

GetImage() 方法的傳回類型將下游程式碼與 ImageSharp 函式庫關聯起來。 任何接受或儲存結果的方法都必須將其聲明為 Image<Rgba32>,從而向呼叫程式碼引入傳遞依賴。

IronBarcode。 方法

IronBarcode 使用流暢的鍊式架構。 BarcodeWriter.CreateBarcode 傳回一個 GeneratedBarcode 對象,該物件包含多個輸出方法。 影像處理是內部的-不會向呼叫程式碼公開 ImageSharp 類型。

using IronBarCode;

// Fluent generation — save directly to file
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("code128.png");

// Multiple output options on the same GeneratedBarcode object
var barcode = BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128);
barcode.SaveAsPng("code128.png");
barcode.SaveAsJpeg("code128.jpg");
byte[] bytes = barcode.ToPngBinaryData();

using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;

// Fluent generation — save directly to file
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("code128.png");

// Multiple output options on the same GeneratedBarcode object
var barcode = BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128);
barcode.SaveAsPng("code128.png");
barcode.SaveAsJpeg("code128.jpg");
byte[] bytes = barcode.ToPngBinaryData();

using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode

' Fluent generation — save directly to file
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("code128.png")

' Multiple output options on the same GeneratedBarcode object
Dim barcode = BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
barcode.SaveAsPng("code128.png")
barcode.SaveAsJpeg("code128.jpg")
Dim bytes As Byte() = barcode.ToPngBinaryData()

Using stream As New MemoryStream()
    barcode.SaveAsPng(stream)
End Using
$vbLabelText   $csharpLabel

IronBarcode 文件中詳細介紹了1D 條碼產生的選項,包括寬度、高度和標籤配置。

讀取能力

NetBarcode 方法

NetBarcode沒有讀取API。 目前沒有任何方法、類別或配置可以將條碼圖像解碼回其資料字串。 這是有意設定的範圍界限,並非在發布前故意省略的內容。 使用 NetBarcode 產生條碼,之後需要讀取條碼的項目(例如驗證列印標籤、掃描退貨或從供應商發票中提取數值)必須為此目的引入單獨的庫。

// NetBarcode — no reading method exists
// The following does not compile because the method does not exist:
// var result = barcode.Read("image.png");  // method does not exist

// The typical workaround requires ZXing.Net as a third-party dependency
// NetBarcode — no reading method exists
// The following does not compile because the method does not exist:
// var result = barcode.Read("image.png");  // method does not exist

// The typical workaround requires ZXing.Net as a third-party dependency
' NetBarcode — no reading method exists
' The following does not compile because the method does not exist:
' Dim result = barcode.Read("image.png")  ' method does not exist

' The typical workaround requires ZXing.Net as a third-party dependency
$vbLabelText   $csharpLabel

ZXing.Net 函式庫是與 NetBarcode 一起讀取時最常見的附加元件,它帶來了第三個 API 介面和第三個軟體包,需要與 NetBarcode 和任何已新增的二維碼庫一起進行版本管理。

IronBarcode。 方法

IronBarcode 將 BarcodeReader 包含在與 BarcodeWriter 相同的軟體包中。 讀取 API 接受圖像文件和 PDF 文檔,並返回一組解碼結果,每個結果都包含條碼值、格式類型和頁碼(如果是從 PDF 讀取)。

using IronBarCode;

// Read barcodes from an image file
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.BarcodeType}: {r.Value}");
}

// Read barcodes from a PDF document — no additional library required
var pdfResults = BarcodeReader.Read("invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Value}");
}
using IronBarCode;

// Read barcodes from an image file
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.BarcodeType}: {r.Value}");
}

// Read barcodes from a PDF document — no additional library required
var pdfResults = BarcodeReader.Read("invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Value}");
}
Imports IronBarCode

' Read barcodes from an image file
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
    Console.WriteLine($"{r.BarcodeType}: {r.Value}")
Next

' Read barcodes from a PDF document — no additional library required
Dim pdfResults = BarcodeReader.Read("invoice.pdf")
For Each r In pdfResults
    Console.WriteLine($"Page {r.PageNumber}: {r.Value}")
Next
$vbLabelText   $csharpLabel

從影像讀取條碼指南涵蓋了讀取 API 中提供的速度調整、多條碼偵測和影像校正選項。

依賴和許可的考慮

NetBarcode 和 ImageSharp

NetBarcode 採用 和 許可證。 它所依賴的 SixLabors.ImageSharp 庫採用不同的模式:對於開源專案和年總收入低於規定門檻的公司是免費的,但超過該門檻則需要商業許可。 無論 ImageSharp 是否在專案的 .csproj 中明確列出,還是透過 NetBarcode 傳遞過來,此拆分均適用。


<PackageReference Include="NetBarcode" Version="1.8.2" />

<PackageReference Include="NetBarcode" Version="1.8.2" />
XML

對於大規模處理條碼的零售或物流公司(NetBarcode 的主要目標用例)而言,其年收入通常高於 ImageSharp 商業許可適用的門檻。 合規性審計可能會揭示出軟體包樹中蘊含的這項義務。

v1.8 版本引入了 ImageSharp 依賴項的另一個後果:GetImage() 的回傳類型從內部表示變為 SixLabors.ImageSharp.Image<Rgba32>。 現有程式碼在沒有明確類型的情況下呼叫 GetImage(),導致編譯時出錯,因此需要為 SixLabors.ImageSharpSixLabors.ImageSharp.PixelFormats 新增新的 using 指令。 當 ImageSharp 本身的 API 在未來的版本中持續發展時,NetBarcode 的公共 API 介面也會受到影響。

IronBarcode。

IronBarcode 不依賴 SixLabors.ImageSharp。 其授權條款直接在IronBarcode 授權頁面上列明,沒有拆分門檻或傳遞商業義務。 提供試用金鑰供評估; 購買的許可證可以移除生成輸出中的試用浮水印。

API 對應參考。

NetBarcode IronBarcode 筆記
new Barcode(data, Type.Code128) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) 構成器 → 靜態方法
new Barcode(data, Type.EAN13) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) 直接對應
new Barcode(data, Type.UPCA) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.UPCA) 直接對應
new Barcode(data, Type.Code39) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) 直接對應
new Barcode(data, Type.EAN8) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) 直接對應
new Barcode(data, Type.UPCE) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.UPCE) 直接對應
new Barcode(data, Type.ITF) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.ITF) 直接對應
new Barcode(data, Type.Codabar) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) 直接對應
barcode.SaveImageFile("x.png") .SaveAsPng("x.png") 方法重命名
barcode.SaveImageFile("x.jpg") .SaveAsJpeg("x.jpg") 方法重命名
barcode.GetImage()Image<Rgba32> .ToPngBinaryData().SaveAsPng() 沒有 ImageSharp 類型暴露
沒有 Type.QRCode BarcodeEncoding.QRCode 新功能
沒有 Type.DataMatrix BarcodeEncoding.DataMatrix 新功能
沒有 Type.PDF417 BarcodeEncoding.PDF417 新功能
沒有 Type.Aztec BarcodeEncoding.Aztec 新功能
無讀取 API BarcodeReader.Read(path) 新功能
using NetBarcode; using IronBarCode; 命名空間替換
using SixLabors.ImageSharp; 消除 不再需要

完整的格式參考可在支援的條碼格式文件中找到。

當團隊考慮從 NetBarcode 遷移到IronBarcode時

二維碼和二維格式要求

評估 NetBarcode 替代方案最常見的觸發因素是對二維碼的新需求。 最初為零售標籤或貨運清單產生一維條碼的應用,通常會有後續需求產生二維碼——非接觸式連結、行動應用深度連結、行銷活動。 因為 Type 枚舉沒有 QR 條目,所以 NetBarcode 無法滿足此要求。 如果團隊添加單獨的 QR 庫來彌補差距,那麼在製藥整合需要 數據矩陣 或物流承運商要求在運輸標籤上使用 PDF417 時,他們將面臨第二次評估。

條碼讀取變得不可或缺

有些項目從純粹的生成開始,後來又增加了驗證或文件處理要求:確認列印的條碼與其來源資料匹配,從供應商發票中提取條碼值,或掃描退貨標籤。 NetBarcode 沒有提供此路徑。 增加 ZXing.Net 或類似的讀取庫,就意味著需要在同一個程式碼庫中學習和維護第三個 API,而該程式碼庫已經包含了 NetBarcode 和 QR 庫。 即使在未來的階段,如果專案需要滿足閱讀需求,那麼選擇一個從一開始就能解決這兩個問題的圖書館通常會更有效率。

ImageSharp商業許可審核

對第三方依賴項的法律和合規性審查有時會發現 NetBarcode 軟體包樹中嵌入的 SixLabors.ImageSharp 商業許可條件。 對於年總收入超過門檻的公司,無論 ImageSharp 是有意選擇還是透過 NetBarcode 間接取得,都適用該義務。 如果團隊在審計過程中(而不是在採用之前)發現這個問題,則需要進行追溯性補救,而不是計劃性遷移。 在專案啟動前評估依賴項許可證是更明智的做法。

降低多庫複雜性

已經累積了用於生成一維條碼的 NetBarcode、用於二維輸出的 QR 專用庫以及用於讀取的 ZXing.Net 的團隊發現,他們需要在三個不同的軟體包之間保持版本相容性。 每次升級週期都需要檢查這三個庫是否對其共享的 ImageSharp 版本達成一致。 專案中的每個新開發人員都會遇到三個不同的 API,而這些 API 在概念上都是同一個問題。 將條碼庫整合為單一的條碼庫,可以簡化上線流程,減少版本衝突,並將維護工作集中在一個發布週期內。

常見的遷移考量

包交換和傳遞依賴清理

第一步是移除 NetBarcode(dotnet remove package NetBarcode)。如果專案中的其他套件也間接引入了 SixLabors.ImageSharp 套件,那麼它可能會重新出現在依賴關係樹中。 刪除後,使用 dotnet list package --include-transitive 檢查恢復的軟體包列表,以確認 ImageSharp 是否仍然存在,以及其商業許可條件是否仍然適用。

GetImage() 傳回類型替換

任何將 GetImage() 的結果儲存為 Image<Rgba32> 的程式碼都必須更新。 ImageSharp 類型在IronBarcode中沒有直接對應的類型; 替換方式取決於影像在下游的用途。 將影像儲存到流中的程式碼可以直接替換為 .SaveAsPng(stream) 物件上的 GeneratedBarcode 物件。 檢索原始位元組的程式碼可以使用 .ToPngBinaryData()。 對傳回的影像執行進一步 ImageSharp 操作的程式碼需要單獨評估這些操作。

命名空間更新

導入了 using NetBarcode;using SixLabors.ImageSharp;using SixLabors.ImageSharp.PixelFormats;using SixLabors.Fonts; 的檔案需要將這些指令替換為 using IronBarCode;。 在專案範圍內搜尋這些 using 語句,可以識別出在嘗試建置之前需要注意的每個檔案。

IronBarcode的其他功能

除了本次對比中涵蓋的核心生成和讀取功能外,IronBarcode 還提供:

  • SVG 條碼輸出產生適用於列印工作流程和可縮放標籤設計的向量格式條碼圖片 -條碼樣式配置產生的條碼的條形顏色、背景顏色、註解字體、邊距和旋轉角度
  • GS1-128 和 GS1 DataBar用於零售和供應鏈合規性的應用標識符結構化條碼 -郵政格式智慧型郵件、皇家郵政和其他用於郵件應用的郵政符號
  • PDF條碼擷取無需單獨的PDF庫,即可直接從多頁PDF文件中讀取條碼。 -批量產生在單一管道內有效處理條碼資料集合。
  • MAUI 和行動目標IronBarcode支援 .NET MAUI 應用程序,用於跨平台移動和桌面條碼工作流程。

.NET相容性與未來準備

IronBarcode 的目標平台是 .NET 8 和 .NET 9,對於尚未遷移到現代 .NET 的項目,它也保持與 .NET Standard 的兼容性。 由於 .NET 10 預計將於 2026 年底發布,Iron Software 的定期發布節奏確保了相容性更新能夠跟上每個主要的 .NET 版本。 NetBarcode 的目標平台是 .NET Standard 2.0,可以透過此相容層在目前的執行時間環境中運行,儘管該程式庫的更新頻率和 2D 格式集受其設計範圍的限制。

結論

NetBarcode 和IronBarcode代表了條碼庫範圍的不同位置。 NetBarcode 是一個專注、簡潔的一維條碼產生實作:支援十四種格式,提供簡單易懂的建構函式 API,並採用 和 許可證,確保 ImageSharp 收入門檻內的開源專案能夠順利採用。IronBarcode是一個更全面的工具包,涵蓋 50 多種格式的條碼產生、圖像和 PDF 讀取,以及對 1D 和 2D 格式一視同仁的流暢 API。

對於那些需求真正僅限於線性條碼生成的項目——例如為傳統零售掃描器生成 EAN-13 和 UPC-A 代碼的銷售點系統,或者壽命固定且較短的內部工具——NetBarcode 可以在不引入商業依賴的情況下提供所需的功能。 該庫在其範圍內構建良好,並且從第一次查看 Type 枚舉就可以明確看出其範圍。

對於格式範圍可能擴大、最終需要讀取或需要對 ImageSharp 傳遞依賴項進行合規性審查的項目,IronBarcode 透過一個軟體包解決了所有這三個問題。 團隊如果一開始使用 NetBarcode 產生一維條碼,後來又增加 QRCoder 產生二維條碼,再增加 ZXing.Net 讀取條碼,就會累積三個獨立的庫維護義務;IronBarcode將這些功能整合為一個。

這項選擇直接源自於專案的需求。 如果 14 種 1D 格式且不具備讀取能力完全符合規格,那麼 NetBarcode 在技術上是一個合理的選擇。 如果規格包含任何 2D 格式、任何讀取工作流程,或對 ImageSharp 授權條件有任何疑問,IronBarcode 是更完整的解決方案。

常見問題解答

NetBarcode是什麼?

NetBarcode 是一個 .NET 條碼庫,用於在 C# 應用程式中產生和讀取條碼。它是開發人員在為 .NET 專案選擇條碼解決方案時評估的幾個替代方案之一。

NetBarcode 和 IronBarcode 的主要差異是什麼?

IronBarcode 使用靜態、無狀態的 API,無需實例管理,而 NetBarcode 通常需要在使用前建立和設定實例。 IronBarcode 還提供原生 PDF 支援、自動格式偵測以及跨所有環境的單金鑰許可。

IronBarcode 的授權比 NetBarcode 更容易嗎?

IronBarcode 使用單一授權金鑰,同時涵蓋開發和生產部署。與將 SDK 金鑰與執行時間金鑰分開的授權系統相比,這簡化了 CI/CD 管線和 Docker 配置。

IronBarcode是否支援NetBarcode支援的所有條碼格式?

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與NetBarcode相比,在大量處理方面有何不同?

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 安裝程式或運行時檔案。

與NetBarcode不同,我可以在購買前評估IronBarcode嗎?

是的。 IronBarcode 的試用模式會傳回完整的解碼條碼值-只有產生的輸出影像才會有浮水印。您可以在購買前,用自己的文件測試讀取準確率。

NetBarcode 和 IronBarcode 的價格有什麼不同?

IronBarcode 的永久單開發者許可證起價為 749 美元,涵蓋開發和生產環境。定價詳情和大量許可選項請造訪 IronBarcode 授權頁面。無需單獨的運行時許可證。

從NetBarcode遷移到IronBarcode是否很簡單?

從 NetBarcode 遷移到 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 小時在線上。
聊天
電子郵件
打電話給我