BarcodeLib 与 IronBarcode:C# 条形码库对比
BarcodeLib 的下载量已超过 1200 万次。 大多数开发者最终发现它只能生成条形码。 他们中的很大一部分人还发现了 SkiaSharp 冲突——通常是在最糟糕的时刻,当他们刚刚将 条形码库 添加到已经依赖于 SkiaSharp 的 MAUI 或Blazor项目中时,构建开始抛出他们意想不到的 NU1608 警告,而他们当天下午却没想到要调试这些警告。 本文客观地探讨了这两个问题。 条形码库 是一个合法的库,具有明确的用途。 了解它的极限在哪里是一个实际问题。
了解条形码库
BarcodeLib 是一个用于.NET的开源条形码图像生成库,由 Brad Barnhill 在GitHub上维护。 它自 2007 年以来一直处于活跃状态,并支持超过 25 种条形码符号体系。 Apache 2.0 许可证允许其免费用于商业用途。 对于纯粹的条形码生成(即从字符串创建图像),它运行可靠,并在多年的积极使用中很好地满足了这一目的。
该API是基于实例的。 您创建一个 Barcode 对象,设置属性,并使用类型常量和数据字符串调用 Encode()。 然后,您可以根据需要保存或流式传输 System.Drawing.Image 。 该工作流程简洁易懂,对于仅需打印条形码图像的项目(例如运输标签、库存标签、零售价格标签)来说,就足够了。
BarcodeLib 的主要架构特征:
-仅生成范围:该库没有任何读取或解码 API; 它的整个公共区域都面向利用数据字符串生成图像。
-基于实例的 API:每个操作都需要实例化一个 Barcode 对象,并在调用 Encode() 之前设置宽度、高度和标签属性。
返回 System.Drawing.Image:输出为 GDI+ 图像对象,需要 MemoryStream 中间步骤才能生成用于 HTTP 响应或数据库存储的字节数组输出
-仅支持生成一维和二维码:支持超过 25 种条码类型,包括 Code128、EAN-13、UPC-A、Code39 和二维码,但不具备二维码读取功能。
- SkiaSharp 依赖项(v3.x): 3.x 系列用 SkiaSharp 替换了
System.Drawing.Common,以实现跨平台支持; 当项目中其他软件包也依赖于 SkiaSharp 时,这会引入版本冲突风险。 -免费,无需许可证密钥: Apache 2.0 许可证涵盖商业用途,无需运行时密钥或激活。
条形码库核心生成模式
标准的 条形码库 生成工作流程需要创建实例、配置属性并调用 Encode():
// BarcodeLib
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");
img.Save("barcode.png", ImageFormat.Png);
// BarcodeLib
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");
img.Save("barcode.png", ImageFormat.Png);
Imports BarcodeLib
Imports System.Drawing
Imports System.Drawing.Imaging
Dim b As New Barcode()
b.IncludeLabel = True
b.Width = 300
b.Height = 100
Dim img As Image = b.Encode(TYPE.CODE128, "PRODUCT-12345")
img.Save("barcode.png", ImageFormat.Png)
这是完整的生成工作流程。 属性设置器模式是这样的设计:所有配置都在调用 Encode() 之前在实例上进行,返回值是一个 System.Drawing.Image,必须单独保存或转换为字节。
了解IronBarcode
IronBarcode是一个商业化的.NET条形码库,在一个软件包中涵盖了条形码的生成和读取。 它通过NuGet安装,可在.NET Framework 4.6.2 至.NET 9 上运行,并可在 Windows、Linux、macOS、Docker、Azure 和 AWS Lambda 上运行。 该库由Iron Software开发和维护,并采用商业支持模式。
生成 API 是静态且流畅的——无需创建实例,也无需在主调用之前设置属性。 配置选项链式连接到 BarcodeWriter.CreateBarcode() 或 QRCodeWriter.CreateQrCode() 的结果。 链末端的输出方法 — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — 消除了 条形码库 所需的中间 MemoryStream 模式。 阅读功能是同一软件包的一部分,无需维护单独的库或 ZXing .NET集成。
IronBarcode的主要特点:
-生成和读取在一个软件包中: BarcodeWriter 处理生成; BarcodeReader 处理读取; 两者都包含在同一个NuGet安装包中
-静态流畅 API:无需实例化; 使用流畅方法配置 CreateBarcode() 之后的配置链
-直接字节数组输出: .ToPngBinaryData() 返回 byte[],不包含 MemoryStream 步骤
-两端均支持 PDF: BarcodeReader.Read() 原生接受 PDF 文件; 生成的输出可以嵌入到PDF文件中。
-无 SkiaSharp 依赖:独立于 SkiaSharp 版本图,消除了 MAUI 和其他项目中的 NU1608 冲突
-附带服务水平协议的商业许可:永久价格为 749 美元至 5,999 美元; 包括商业支持和有保证的更新频率
ReadingSpeed调优:BarcodeReaderOptions允许在交易量下牺牲扫描的彻底性来换取性能。
功能对比
| 特征 | 条形码库 | IronBarcode |
|---|---|---|
| 条形码生成 | 是 | 是 |
| 条形码读取 | 否 | 是 |
| PDF条形码读取 | 否 | 是 |
| SkiaSharp依赖冲突 | 是的(v3.x) | 否 |
| 流畅的链式 API | 否 | 是 |
| 许可证 | Apache 2.0(免费) | 749美元至5999美元永久 |
详细功能对比
| 特征 | 条形码库 | IronBarcode |
|---|---|---|
| 一代 | ||
| Code128生成 | 是 | 是 |
| EAN-13 / UPC-A 代 | 是 | 是 |
| 二维码生成 | 是的(基本) | 是的(高级版,支持嵌入徽标) |
| 25+种符号体系 | 是 | 是 |
| 流畅的链式生成 API | 否 | 是 |
直接输出 byte[] |
手动(MemoryStream) |
.ToPngBinaryData() |
| PDF 生成输出 | 否 | 是 |
| 阅读 | ||
| 从图像中读取条形码 | 否 | 是的(BarcodeReader.Read()) |
| 从 PDF 读取条形码 | 否 | 是的(原生实现,无需额外库) |
| 多条形码检测 | 否 | 是的(ExpectMultipleBarcodes) |
| 阅读速度调整 | 不适用 | 是的(ReadingSpeed枚举) |
| 平台 | ||
| 视窗 | 是 | 是 |
| Linux / macOS | 部分(依赖于 SkiaSharp) | 满的 |
| Docker/容器 | 需要配置 | 是 |
| MAUI 项目兼容性 | 冲突风险(NU1608) | 无冲突 |
| .NET Framework 4.6.2+ | 是 | 是 |
| .NET 6–9 | 是的(需要 SkiaSharp 3.x) | 是 |
| 许可 | ||
| 开源/免费 | 是的(Apache 2.0) | 否 |
| 商业支持/服务水平协议 | 否 | 是 |
| 需要许可证密钥 | 否 | 是 |
| 定价 | 免费 | 749美元至5999美元永久 |
条形码生成 API
生成 API 代表了不同的设计理念:BarcodeLib 使用可变实例配置,而IronBarcode使用不可变流畅链。
条形码库方法
BarcodeLib 需要先构造一个实例并设置属性,然后再调用 Encode()。 输出是一个 System.Drawing.Image 对象:
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, data);
using var ms = new MemoryStream();
img.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, data);
using var ms = new MemoryStream();
img.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
Imports BarcodeLib
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Public Function GenerateCode128(data As String) As Byte()
Dim b As New Barcode()
b.IncludeLabel = True
b.Width = 300
b.Height = 100
Dim img As Image = b.Encode(TYPE.CODE128, data)
Using ms As New MemoryStream()
img.Save(ms, ImageFormat.Png)
Return ms.ToArray()
End Using
End Function
返回类型 System.Drawing.Image 表示字节数组输出需要 MemoryStream 中间体。 IncludeLabel 属性是一个布尔切换开关 — 条形码库 会自动将编码后的数据字符串渲染为条形图下方的可见标签。
IronBarcode方法
IronBarcode 的生成是完全静态的。 CreateBarcode() 之后的配置链,以及输出方法直接终止该链:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.ToPngBinaryData();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.ToPngBinaryData();
}
Imports IronBarCode
Public Function GenerateCode128(data As String) As Byte()
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.AddAnnotationTextBelowBarcode(data) _
.ToPngBinaryData()
End Function
.ToPngBinaryData() 直接返回字节数组——没有中间 Image 或 MemoryStream 对象。 .AddAnnotationTextBelowBarcode() 显式地接受标签字符串,从而控制条形图下方显示的文本。 有关高级生成场景,请参阅IronBarcode条形码生成文档。
条形码读取能力
阅读是这两座图书馆之间最重要的功能性界限。 条形码库 不具备读取功能; IronBarcode在同一个软件包中包含了完整的读取引擎。
条形码库方法
BarcodeLib 没有读取 API。 没有 Decode()、Scan() 或 ReadBarcode() 方法。 这并非版本差异——阅读从来都不是图书馆设计的一部分。 任何调用解码方法的尝试都会导致编译错误:
// 条形码库 — reading does not exist
using BarcodeLib;
var b = new Barcode();
// This will not compile — there is no Decode or Read method
// var value = b.Decode("barcode.png"); // CS1061: no definition
// var value = b.Scan("barcode.png"); // CS1061: no definition
// var value = b.ReadBarcode("barcode.png"); // CS1061: no definition
// The only thing you can do is generate:
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345"); // this works
// 条形码库 — reading does not exist
using BarcodeLib;
var b = new Barcode();
// This will not compile — there is no Decode or Read method
// var value = b.Decode("barcode.png"); // CS1061: no definition
// var value = b.Scan("barcode.png"); // CS1061: no definition
// var value = b.ReadBarcode("barcode.png"); // CS1061: no definition
// The only thing you can do is generate:
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345"); // this works
Imports BarcodeLib
Dim b As New Barcode()
' This will not compile — there is no Decode or Read method
' Dim value = b.Decode("barcode.png") ' No definition
' Dim value = b.Scan("barcode.png") ' No definition
' Dim value = b.ReadBarcode("barcode.png") ' No definition
' The only thing you can do is generate:
Dim img As Image = b.Encode(TYPE.CODE128, "PRODUCT-12345") ' this works
需要同时具备 条形码库 的生成和读取功能的团队必须添加第二个库(通常是 ZXing .NET ),这会带来自身的依赖管理负担和第二个需要维护的 API 接口。
IronBarcode方法
BarcodeReader.Read() 接受图像文件、PDF 文件、流和 System.Drawing.Bitmap 对象。 读取PDF文件不需要额外的库:
using IronBarCode;
// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value); // "PRODUCT-12345"
// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;
// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value); // "PRODUCT-12345"
// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode
' Read from an image
Dim results = BarcodeReader.Read("barcode.png")
Console.WriteLine(results.First().Value) ' "PRODUCT-12345"
' Read all barcodes from a PDF — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
' Tune reading for speed vs. thoroughness
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-scan.png", options)
ReadingSpeed 枚举允许针对高容量场景调整扫描性能。 有关读取配置的指导,请参阅IronBarcode读取文档。
SkiaSharp依赖冲突
BarcodeLib 3.x 中引入的 SkiaSharp 依赖项造成了IronBarcode中不存在的一类冲突。
条形码库方法
从 条形码库 3.x 开始,该库引入了 SkiaSharp 作为图形后端,以取代 System.Drawing.Common,后者在 .NET 6 之后仅支持 Windows。BarcodeLib 绑定到特定的 SkiaSharp 版本范围。 如果一个项目已经通过另一个依赖项使用 SkiaSharp(这在 MAUI 项目中很常见,因为使用了 SkiaSharp.Views.Maui 和 Microsoft.Maui.Graphics),则解析后的版本可能超出 条形码库 的预期范围。 最轻的结果是出现 NU1608 警告,最重的结果是运行时程序集绑定失败:
警告 NU1608:检测到软件包版本超出依赖关系约束:
BarcodeLib 3.1.5 需要 SkiaSharp (>= 2.88.7 && < 2.89.0),但
SkiaSharp 3.116.1 版本问题已解决。
通过显式包引用强制解析会增加复杂性,而且无法保证成功:
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
即使进行了显式覆盖,兼容性也取决于 条形码库 的内部 API 调用是否与固定版本公开的内容相匹配。 没有任何支持合同能够保证在对项目至关重要的进度时间内修复问题。
IronBarcode方法
IronBarcode不与应用程序代码共享 SkiaSharp 依赖关系图。 无需管理版本协商,无需诊断 NU1608,也无需承担与 SkiaSharp 版本解析相关的运行时程序集绑定风险。 MAUI 项目、 Blazor项目以及任何其他依赖 SkiaSharp 的应用程序都可以安装IronBarcode,而不会出现任何版本冲突。 有关 MAUI 的特定集成模式,请参阅IronBarcode MAUI 文档。
API 映射参考
| 条形码库 | IronBarcode |
|---|---|
new Barcode() |
静态 API — 无需实例 |
b.Encode(TYPE.CODE128, "data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
b.IncludeLabel = true |
.AddAnnotationTextBelowBarcode("text") |
b.宽度 = 300; b.高度 = 100 |
.ResizeTo(300, 100) |
返回 System.Drawing.Image |
.SaveAsPng(path) / .ToPngBinaryData() |
TYPE.CODE128 |
BarcodeEncoding.Code128 |
TYPE.CODE39 |
BarcodeEncoding.Code39 |
TYPE.EAN13 |
BarcodeEncoding.EAN13 |
TYPE.UPCA |
BarcodeEncoding.UPCA |
TYPE.QR_Code |
BarcodeEncoding.QRCode (也 QRCodeWriter) |
| 无读取 API | BarcodeReader.Read(path) |
| MAUI 中 SkiaSharp 版本冲突 | 没有冲突的依赖项 |
当团队考虑从 条形码库 迁移到IronBarcode
阅读要求出现
一个已经生成货运标签数月的系统迎来了一个新的要求:该应用程序还必须处理供应商退回的标签。 仓库集成需要解析入库货物清单中的条形码。 文档管理系统需要对扫描的PDF文件中的条形码进行索引。 条形码库 无法满足这些要求——它没有读取 API。团队评估了将 ZXing .NET与 条形码库 结合使用的可能性,权衡了双库维护的负担和两个独立的依赖关系图,最终决定更简洁的方案是使用一个库,通过单个NuGet安装即可处理生成和读取操作。
SkiaSharp 在 MAUI 项目中的冲突
一个团队将 条形码库 添加到现有的 MAUI 应用程序中,并在恢复过程中立即遇到 NU1608 警告。 他们进行调查,发现 条形码库 预期的 SkiaSharp 版本范围与 MAUI 要求的版本不匹配,添加显式的 <PackageReference> 覆盖以强制解决此问题,并使构建通过。 然后,当 SkiaSharp 的本地二进制文件加载了错误的版本时,设备运行时就会崩溃。 修复此问题需要对程序集绑定日志进行更深入的调查。 切换到IronBarcode可以从根本上消除冲突——不是通过找到兼容的 SkiaSharp 版本,而是通过完全消除共享依赖项。
需要进行PDF条形码处理
能够生成带有嵌入式条形码的 PDF 文档(例如发票、工作单、发货清单)的应用程序,有时需要在下游处理过程中读取这些条形码。 条形码库 可以生成条形码图像,但两端均不支持 PDF。 使用 条形码库 从 PDF 中读取条形码需要先使用单独的 PDF 库将 PDF 渲染成图像,然后将这些图像传递给单独的读取库。IronBarcode原生处理整个链:BarcodeReader.Read("file.pdf") 遍历每一页并返回所有检测到的条形码,而无需中间渲染步骤。
二维码功能超越了基础一代
最初只需要生成基本二维码的项目,往往会发展到需要嵌入徽标、颜色自定义或纠错级别配置。 条形码库 支持通过 TYPE.QR_Code 编码的二维码,但除了标准的 Width、Height 和 IncludeLabel 属性之外,没有提供其他选项。IronBarcode的 QRCodeWriter 通过链式方法公开徽标嵌入、颜色控制和纠错调整。 对于那些二维码需求超出 条形码库 基本实现支持范围的团队来说,功能差距是促使他们做出迁移决定的主要因素。
常见迁移注意事项
实例 API 到静态 Fluent API
BarcodeLib 代码使用可变对象模式:创建一个 Barcode 实例,设置属性,调用 Encode()。IronBarcode使用静态流畅模式:调用 BarcodeWriter.CreateBarcode(),链接配置方法,以输出方法结束。 将 Barcode 实例存储为字段或在方法之间传递该实例的现有代码需要进行重构。 典型的改动是用方法链替换属性设置器代码块:
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.SaveAsPng(outputPath);
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.SaveAsPng(outputPath);
系统绘图图像到直接输出
BarcodeLib 返回 System.Drawing.Image,需要 MemoryStream 来生成字节。 任何输入到 Image 或 System.Drawing.Image 的代码都需要更新。IronBarcode的流畅链直接以所需的输出格式结束 — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — 无需中间图像对象和 MemoryStream 步骤。
TYPE Enum to BarcodeEncoding Enum
BarcodeLib 使用 TYPE 类,其中常量为大写,例如 TYPE.CODE128。IronBarcode使用 BarcodeEncoding 枚举,其 PascalCase 值如 BarcodeEncoding.Code128。 数值直接对应。 在 .cs 文件中使用 grep 命令查找 TYPE\.,即可识别所有需要更新的实例,然后通过系统性的查找和替换来覆盖常见格式:CODE128 → Code128,EAN13 → EAN13,UPCA → UPCA,QR_Code → QRCode。
SkiaSharp 参考清理
仅为了解决 条形码库 的 NU1608 警告而添加显式 <PackageReference Include="SkiaSharp"> 条目的项目,在切换到IronBarcode后可以删除这些覆盖项。 dotnet list package --include-transitive 命令用于确认 SkiaSharp 是否仍被项目中的其他软件包所需要,然后再将其删除。
IronBarcode的其他功能
除了直接生成和读取比较之外, IronBarcode还包含 条形码库 没有具备的功能:
-二维码徽标嵌入: QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") 将品牌徽标嵌入二维码中心,并具有自动纠错功能
- PDF 条形码提取:
BarcodeReader.Read("file.pdf")无需单独的 PDF 渲染库即可读取 PDF 文档每一页的条形码 -多条形码检测:BarcodeReaderOptions.ExpectMultipleBarcodes = true检测并返回单个图像中存在的所有条形码 -读取速度配置:ReadingSpeed.Faster、ReadingSpeed.Balanced和ReadingSpeed.ExtremeDetail调整扫描引擎,以实现吞吐量与准确性的平衡 -样式化二维码生成:可通过QRCodeWriter上的链式方法配置颜色、查找图案样式和纠错级别 -用于读取的流和位图输入:BarcodeReader.Read()接受文件路径、流、System.Drawing.Bitmap和AnyBitmap输入
.NET兼容性和未来准备情况
IronBarcode支持.NET Framework 4.6.2 至.NET 9,并保持与 Microsoft .NET发布计划一致的定期发布节奏。 随着.NET 10 的普及,到 2026 年,IronBarcode 的积极开发确保了向前兼容性,而无需更改项目。 该库无需修改即可在 Windows、Linux、macOS、Docker、Azure 和 AWS Lambda 上运行。 条形码库 也保持着活跃的社区开发,尽管其在 3.x 系列中的跨平台支持取决于上面比较部分中讨论的 SkiaSharp 版本兼容性。 对于面向 Linux 或容器中的现代.NET 的项目,IronBarcode 的无依赖跨平台架构避免了 条形码库 的 SkiaSharp 后端引入的版本协商。
结论
BarcodeLib 和IronBarcode代表了.NET中条形码工作的不同解决方案范围。 条形码库 是一个专注于生成功能的免费库,近二十年来一直可靠地满足其定义的使用需求。 IronBarcode是一个商业库,涵盖条码生成和读取,具有静态流畅的 API,并且不依赖 SkiaSharp。 区别不在于共同范围内的质量差异,而在于范围本身。
对于在视窗上具有稳定、仅生成需求的项目,或者在 SkiaSharp 版本格局受到控制的环境中,BarcodeLib 仍然是一个真正合适的选择。 它的 Apache 2.0 许可证、零成本和简单易用的 API 使其成为运输标签系统、库存标签生成器和类似应用程序的实用解决方案,这些应用程序永远不需要扫描条形码。 1200 万次的下载量反映出,很大一部分.NET开发人员确实有这样的使用场景。
当需求超出纯粹的图像生成范围时, IronBarcode就成为更实用的选择:当需要读取功能时,当项目是 MAUI 或跨平台应用程序(可能会出现 SkiaSharp 版本冲突)时,当 PDF 条形码处理列入路线图时,或者当需要超出基本生成范围的 QR 码功能时。 商业许可费用是关键问题——对于那些需求与IronBarcode相对于 条形码库 所增加的功能相符的团队来说,单一软件包解决方案和商业 SLA 就是价值交换。
客观来说,大多数团队一开始都不会使用IronBarcode 。 他们首先选择 BarcodeLib,因为它免费且功能齐全。 当他们的需求超出 条形码库 仅生成功能的范围时,他们就会迁移到IronBarcode 。 迁移过程有详细的文档记录,API接口的变化也是可以预测的。 了解 条形码库 的停止点(特别是它在生成阶段停止)是正确做出时间决策所需的实际信息。
常见问题解答
BarcodeLib是什么?
BarcodeLib 是一个 .NET 条形码库,用于在 C# 应用程序中生成和读取条形码。它是开发人员在为 .NET 项目选择条形码解决方案时评估的几个备选方案之一。
BarcodeLib 和 IronBarcode 的主要区别是什么?
IronBarcode 使用静态、无状态的 API,无需实例管理,而 BarcodeLib 通常需要在使用前创建和配置实例。IronBarcode 还提供原生 PDF 支持、自动格式检测以及跨所有环境的单密钥许可。
IronBarcode 的授权比 BarcodeLib 更容易吗?
IronBarcode 使用单一许可证密钥,同时涵盖开发和生产部署。与将 SDK 密钥与运行时密钥分开的许可系统相比,这简化了 CI/CD 流水线和 Docker 配置。
IronBarcode是否支持BarcodeLib支持的所有条形码格式?
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 与 BarcodeLib 相比,在批量处理方面有何不同?
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 安装程序或运行时文件。
与 BarcodeLib 不同,我可以在购买前评估 IronBarcode 吗?
是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。
BarcodeLib 和 IronBarcode 的价格有什么区别?
IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。
从 BarcodeLib 迁移到 IronBarcode 是否简单?
从 BarcodeLib 迁移到 IronBarcode 主要涉及将基于实例的 API 调用替换为 IronBarcode 的静态方法、移除许可相关的样板代码以及更新结果属性名称。大多数迁移都是减少代码,而不是增加代码。
IronBarcode 能生成带有 logo 的二维码吗?
是的。`QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以将品牌图片原生嵌入二维码中,并支持配置纠错功能。此外,它还支持通过 `ChangeBarCodeColor()` 函数创建彩色二维码。

