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 中得到体现。
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
这并非待提交 pull request 的缺失功能。枚举类型包含十四个条目,全部为一维类型,这符合库的预期范围。 任何需要 QR 码、DataMatrix、PDF417 或 阿兹特克 格式的应用都必须单独获取相应的软件包。
了解IronBarcode
IronBarcode是一个商业化的.NET条形码库,在一个软件包中涵盖了条形码的生成和读取。 它由Iron Software开发和维护,并定期更新以适应当前的.NET版本。 该库的静态 API 接口设计为从一种条形码格式切换到另一种条形码格式只需更改一个常量——生成 Code128 的同一个 BarcodeWriter.CreateBarcode 调用还可以生成 QR 码、DataMatrix、PDF417 和 Aztec。
IronBarcode 通过 BarcodeReader 类处理条形码读取,该类接受图像文件和 PDF 文档,并返回带有格式标识的解码结果。 这意味着生成和读取共享一个依赖项、一个许可证和一套发行说明来跟踪。
主要特点:
-统一生成和读取: BarcodeWriter 和 BarcodeReader 都包含在同一个 NuGet 包中
-支持的格式超过 50 种: 1D 格式包括所有 NetBarcode 等效格式; 二维码格式包括二维码、DataMatrix、PDF417、Aztec 等。
- Fluent Chain API:
BarcodeWriter.CreateBarcode(data, encoding)返回一个GeneratedBarcode对象,其输出方法包括SaveAsPng()、SaveAsJpeg()、ToPngBinaryData()以及基于流的重载方法。 -不依赖 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 | 是 | 是 |
| 二维码 | 否 | 是 |
| 数据矩阵 | 否 | 是 |
| 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
在某些行业,这种边界会成为一种限制,例如药品追踪(根据 FDA 2D 条形码规定需要使用 DataMatrix)、航空公司登机牌(Aztec)、物流清单(PDF417)和移动营销(二维码)。 这些要求都使得 NetBarcode 无法作为独立解决方案使用。
开始使用 IronBarcode 是一个专为 .NET 框架设计的条码读取和写入库。方法
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")
生成 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
GetImage() 方法的返回类型将下游代码与 ImageSharp 库关联起来。 任何接受或存储结果的方法都必须将其声明为 Image<Rgba32>,从而向调用代码引入传递依赖。
开始使用 IronBarcode 是一个专为 .NET 框架设计的条码读取和写入库。方法
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
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
ZXing .NET库是与 NetBarcode 一起读取时最常见的附加组件,它带来了第三个 API 接口和第三个软件包,需要与 NetBarcode 和任何已添加的二维码库一起进行版本管理。
开始使用 IronBarcode 是一个专为 .NET 框架设计的条码读取和写入库。方法
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
从图像读取条形码指南涵盖了读取 API 中提供的速度调整、多条形码检测和图像校正选项。
依赖性和许可方面的考虑
NetBarcode 和 ImageSharp
NetBarcode 采用麻省理工学院许可证。 它所依赖的 SixLabors.ImageSharp 库采用不同的模式:对于开源项目和年总收入低于规定阈值的公司是免费的,但超过该阈值则需要商业许可。 无论 ImageSharp 是否在项目的 .csproj 中明确列出,还是通过 NetBarcode 传递过来,此拆分均适用。
<PackageReference Include="NetBarcode" Version="1.8.2" />
<PackageReference Include="NetBarcode" Version="1.8.2" />
对于大规模处理条形码的零售或物流公司(NetBarcode 的主要目标用例)而言,其年收入通常高于 ImageSharp 商业许可适用的门槛。 合规性审计可能会揭示出软件包树中蕴含的这项义务。
v1.8 版本引入了 ImageSharp 依赖项的另一个后果:GetImage() 的返回类型从内部表示变为 SixLabors.ImageSharp.Image<Rgba32>。 现有代码在没有显式类型的情况下调用 GetImage(),导致编译时出错,因此需要为 SixLabors.ImageSharp 和 SixLabors.ImageSharp.PixelFormats 添加新的 using 指令。 当 ImageSharp 自身的 API 在未来的版本中不断发展时,NetBarcode 的公共 API 接口也会受到影响。
开始使用 IronBarcode 是一个专为 .NET 框架设计的条码读取和写入库。
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()` 函数创建彩色二维码。

