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

Barcoder 与 IronBarcode:C# 条形码库对比

要使用 条形码 生成单个 PNG,您需要安装两个软件包,导入三个命名空间,使用特定格式的类进行编码,创建一个带有选项对象的渲染器,打开一个流,渲染到该流中,然后释放该流。 这就是全部的幸福之路——而且它只涵盖写作。 条形码器根本没有读取 API。 该库的 MIT 许可证和开源特性使其乍一看就很有吸引力,尤其对于试图避免商业依赖的团队而言。 但是,这种碎片化的架构——至少需要两个NuGet包,每个条形码格式都需要一个不同的编码器类,并且渲染器管道将编码和输出完全分开——一旦需求超出最简单的单一格式生成场景,就会造成真正的摩擦。

条形码的理解

Barcoder 是一个开源的.NET条形码生成库,可在NuGet上以 MIT 许可证获取。 它可以将数据编码成条形码格式,包括 Code128、QR、DataMatrix、EAN-13、PDF417 等。 该设计理念将编码与渲染完全分离——核心库生成一个 IBarcode 对象(一种数据结构),而一个单独的渲染器包将该对象转换为图像。

这种设计的实际效果在第一次安装后就显现出来了。 要进行任何 PNG 输出,需要两个 NuGet 包:Barcoder 用于编码,Barcoder.Renderer.Image 用于渲染。 如果还需要 SVG 输出,则必须添加第三个软件包 — Barcoder.Renderer.Svg —。 这些软件包的版本是独立的,这意味着对其中一个软件包的更新不会自动与另一个软件包保持一致,因此在整个项目中保持它们同步就成了一项重复性的维护任务。

条形码器的关键架构特征:

  • PNG 输出需要两个 NuGet 包: Barcoder 用于编码,Barcoder.Renderer.Image 用于渲染为图像格式 -特定格式的编码器类:每种条形码类型都有其自己的编码器,位于其自身的命名空间中——例如 Code128EncoderQrEncoderDataMatrixEncoder 等等。
  • IBarcode 没有输出方法:编码结果是一个普通的数据对象。 渲染器必须单独构造,流必须打开、渲染到流中,然后关闭。 -图像渲染器不再支持.NET Framework :基于.NET Framework 的Teams 无法使用图像渲染器包 -无读取功能:条码编码器无法解码来自图像、文件或任何其他来源的条形码。 -独立软件包版本控制: BarcoderBarcoder.Renderer.Image 在依赖项更新期间可能会出现版本差异

多包生成工作流程

安装过程立刻就能说明范围上的差异。 使用 条形码 时,基本的 PNG 输出需要两个单独的软件包:

dotnet add package Barcoder
dotnet add package Barcoder.Renderer.Image
dotnet add package Barcoder
dotnet add package Barcoder.Renderer.Image
SHELL

生成 Code128 条形码并将其保存为 PNG 格式的完整工作流程需要三个命名空间导入、一个特定格式的编码器调用、一个带有选项对象的渲染器构造、一个文件流和一个渲染调用:

// Barcoder: 3 namespaces, 7 steps to save a PNG
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
// Barcoder: 3 namespaces, 7 steps to save a PNG
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 2,
    .BarHeightFor1DBarcode = 50
})

Using stream As FileStream = File.OpenWrite("barcode.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

切换条形码格式不是参数更改——它需要导入不同的命名空间并调用不同的类。 Code128Encoder.Encode 接受一个布尔值,includeChecksumQrEncoder.Encode 接受一个纠错级别和两个附加的布尔值,而 DataMatrixEncoder.Encode 只接受一个字符串。 目前还没有统一的界面来创建指定格式的条形码。

了解IronBarcode

IronBarcode是一个商业的.NET条形码库,它通过一个NuGet包实现了条形码的生成和读取。 它使用围绕两个主要类构建的静态 API 模型——BarcodeWriter 用于生成,BarcodeReader 用于读取——并将所有格式选择路由到 BarcodeEncoding 枚举,而不是通过特定于格式的类或命名空间。

该库旨在最大限度地缩短从编写第一行条形码代码到获得有效输出之间的距离。 生成、读取、PDF 支持、带有嵌入式徽标的二维码以及所有输出类型都包含在一个软件包中,只需跟踪一个版本即可。

IronBarcode的主要特点:

-单个 NuGet 包: IronBarcode 涵盖所有功能——生成、读取、PDF 和所有输出格式 -统一格式选择:所有条形码类型均通过 BarcodeEncoding 枚举值进行寻址; 没有特定格式的导入或类 -结果对象上的输出方法: GeneratedBarcode 直接公开 SaveAsPngToPngBinaryDataToStreamSaveAsSvgResizeTo -原生读取功能: BarcodeReader.Read() 无需辅助库即可解码图像文件、字节数组、流和 PDF 文件。 -支持 MAUI、Docker、AWS Lambda 和 Azure:文档记录了除标准桌面和服务器场景之外的部署目标 -全面支持.NET Framework和现代.NET :.NET Framework4.6.2 至.NET 9

功能对比

特征 条形码 IronBarcode
需要NuGet包 至少 2 人 1
条形码生成
条形码读取
许可 麻省理工学院(开源) 商业翻译
.NET Framework支持 图像渲染器中已删除 .NET Framework4.6.2+
PDF阅读
带有徽标的二维码

详细功能对比

特征 条形码 IronBarcode
一代
Code128生成
二维码生成
DataMatrix 生成
EAN-13,PDF417
带有嵌入式徽标的二维码 是的 — .AddBrandLogo(path)
通过枚举选择格式 不——每种格式都有单独的编码器类 是的 — BarcodeEncoding 枚举
输出
PNG 输出 是的(通过 Barcoder.Renderer.Image) 是的 — .SaveAsPng()
SVG 输出 是(通过 Barcoder.Renderer.Svg) 是的 — .SaveAsSvg()
二进制数据输出 是的(通过 MemoryStream) 是的 — .ToPngBinaryData()
流式输出 是的(手动流管理) 是的 — .ToStream()
直接调整大小 API 否 — PixelSize 仅缩放因子 是的 — .ResizeTo(width, height)
阅读
从图像文件中读取
从PDF文件阅读
从流中读取
多条形码检测 是的 — ExpectMultipleBarcodes
阅读速度控制 是的 — ReadingSpeed 枚举
平台
.NET Core / .NET 5+
.NET Framework 图像渲染器中已删除 .NET Framework4.6.2+
.NET 9 活动不明/有限
MAUI(iOS、Android、Windows、macOS)
Docker / Azure / AWS Lambda 未记录。
包装
独立软件包版本控制风险 不——单个包裹
每个格式的命名空间 不 — 单个 using IronBarCode
许可
许可模式 麻省理工学院(开源) 商业翻译
定价 免费 Lite749美元, Plus1499美元, Professional2999美元,Unlimited版 5999美元

格式选择和生成 API

条形码格式选择的结构方式会对生成条形码的代码库的每个部分产生下游影响。

条形码方法

条形码器通过不同命名空间中的不同编码器类来选择格式。 切换格式意味着添加一个新的 using 指令,并使用具有不同方法签名的不同类:

// Code128
using Barcoder.Code128;
IBarcode barcode = Code128Encoder.Encode("data", false);

// QR Code — different namespace, different class, different parameters
using Barcoder.Qr;
IBarcode barcode = QrEncoder.Encode("data", ErrorCorrectionLevel.M, false, false);

// DataMatrix — different namespace, different class again
using Barcoder.DataMatrix;
IBarcode barcode = DataMatrixEncoder.Encode("data");
// Code128
using Barcoder.Code128;
IBarcode barcode = Code128Encoder.Encode("data", false);

// QR Code — different namespace, different class, different parameters
using Barcoder.Qr;
IBarcode barcode = QrEncoder.Encode("data", ErrorCorrectionLevel.M, false, false);

// DataMatrix — different namespace, different class again
using Barcoder.DataMatrix;
IBarcode barcode = DataMatrixEncoder.Encode("data");
Imports Barcoder.Code128
Imports Barcoder.Qr
Imports Barcoder.DataMatrix

' Code128
Dim barcode As IBarcode = Code128Encoder.Encode("data", False)

' QR Code — different namespace, different class, different parameters
barcode = QrEncoder.Encode("data", ErrorCorrectionLevel.M, False, False)

' DataMatrix — different namespace, different class again
barcode = DataMatrixEncoder.Encode("data")
$vbLabelText   $csharpLabel

每个编码器都有自己的参数合约。 向现有项目中添加新格式并非简单的文字更改——它需要导入新的命名空间、学习新的类并理解新的参数。

IronBarcode方法

IronBarcode 通过统一的 BarcodeWriter 类上的 BarcodeEncoding 枚举路由所有格式选择。 添加新格式只需对枚举值进行一个单词的更改:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Code128
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).SaveAsPng("code128.png");

// DataMatrix — same class, same method, one word changed
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix).SaveAsPng("dm.png");

// QR — dedicated optimized method
QRCodeWriter.CreateQrCode("data", 500).SaveAsPng("qr.png");

// QR with logo
QRCodeWriter.CreateQrCode("data", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Code128
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).SaveAsPng("code128.png");

// DataMatrix — same class, same method, one word changed
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix).SaveAsPng("dm.png");

// QR — dedicated optimized method
QRCodeWriter.CreateQrCode("data", 500).SaveAsPng("qr.png");

// QR with logo
QRCodeWriter.CreateQrCode("data", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
Imports IronBarCode

' Code128
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).SaveAsPng("code128.png")

' DataMatrix — same class, same method, one word changed
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix).SaveAsPng("dm.png")

' QR — dedicated optimized method
QRCodeWriter.CreateQrCode("data", 500).SaveAsPng("qr.png")

' QR with logo
QRCodeWriter.CreateQrCode("data", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")
$vbLabelText   $csharpLabel

生产环境使用时,请在应用程序启动时添加许可证密钥:

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

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

IronBarcode条形码生成文档涵盖了所有生成选项,包括样式、边距和颜色自定义。

渲染和输出选项

将条形码输出转换为不同的格式(文件、二进制数据、流)是一个常见的需求,但每个库的处理方式都大相径庭。

条形码方法

Barcoder 将编码与渲染分离的架构理念是合理的,但每次输出格式更改都会产生额外的开销。 保存到文件需要打开 FileStream。 获取二进制数据需要打开一个 MemoryStream 并调用 ToArray()。 每种输出场景都需要构建一个带有选项对象的渲染器:

// Barcoder: changing output dimensions requires rebuilding the renderer
var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 3,
    BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode-large.png");
renderer.Render(barcode, stream);

// Getting binary data — different stream, same renderer pipeline
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
// Barcoder: changing output dimensions requires rebuilding the renderer
var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 3,
    BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode-large.png");
renderer.Render(barcode, stream);

// Getting binary data — different stream, same renderer pipeline
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
Imports System.IO

' Barcoder: changing output dimensions requires rebuilding the renderer
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 3,
    .BarHeightFor1DBarcode = 80
})

Using stream As FileStream = File.OpenWrite("barcode-large.png")
    renderer.Render(barcode, stream)
End Using

' Getting binary data — different stream, same renderer pipeline
Using ms As New MemoryStream()
    renderer.Render(barcode, ms)
    Dim pngBytes As Byte() = ms.ToArray()
End Using
$vbLabelText   $csharpLabel

尺寸控制是间接的:PixelSize 是条形码模块尺寸的缩放倍数,而不是直接的宽度和高度规格。

IronBarcode方法

IronBarcode 返回一个 GeneratedBarcode 对象,可以通过链式方法调用访问任何输出形式。 无需渲染器构建,无需流管理:

using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100);

// File
barcode.SaveAsPng("barcode.png");

// Bytes
byte[] pngBytes = barcode.ToPngBinaryData();

// Stream
System.IO.Stream stream = barcode.ToStream();
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100);

// File
barcode.SaveAsPng("barcode.png");

// Bytes
byte[] pngBytes = barcode.ToPngBinaryData();

// Stream
System.IO.Stream stream = barcode.ToStream();
Imports IronBarCode

Dim barcode = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100)

' File
barcode.SaveAsPng("barcode.png")

' Bytes
Dim pngBytes As Byte() = barcode.ToPngBinaryData()

' Stream
Dim stream As System.IO.Stream = barcode.ToStream()
$vbLabelText   $csharpLabel

.ResizeTo(width, height) 接受显式像素尺寸,并与同一对象上的任何输出方法链接。

读取条形码

Barcoder 中缺少读取 API 是一个硬性的架构限制,而不是配置选择。

条形码方法

条形码器不具备读取或解码功能。 目前没有 API,也没有计划推出 API,库中也没有任何变通方法。 如果应用程序需要读取条形码,则必须将第二个库(一个单独的NuGet依赖项,具有自己的 API 接口和自己的版本跟踪)与 条形码 一起添加。 这意味着至少需要两个与读取相关的依赖项:用于生成的条形码,以及用于读取的其他东西。

IronBarcode方法

IronBarcode使用同一软件包和一致的 API 模式,同时支持条码生成和读取。 BarcodeReader.Read() 方法原生支持图像文件、字节数组、流和 PDF 文件:

using IronBarCode;

// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
    Console.WriteLine(result.Value);
    Console.WriteLine(result.Format);
}

// 从PDF文件阅读 — no conversion step, no extra dependency
var pdfResults = BarcodeReader.Read("document.pdf");

// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-label.png", options);
using IronBarCode;

// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
    Console.WriteLine(result.Value);
    Console.WriteLine(result.Format);
}

// 从PDF文件阅读 — no conversion step, no extra dependency
var pdfResults = BarcodeReader.Read("document.pdf");

// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-label.png", options);
Imports IronBarCode

' Read from image file
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
    Console.WriteLine(result.Value)
    Console.WriteLine(result.Format)
Next

' 从PDF文件阅读 — no conversion step, no extra dependency
Dim pdfResults = BarcodeReader.Read("document.pdf")

' Read multiple barcodes from one image
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-label.png", options)
$vbLabelText   $csharpLabel

读取 PDF 文件是原生操作——无需中间图像提取、转换库或额外软件包。 IronBarcode条形码读取文档涵盖多页 PDF、感兴趣区域读取和性能调优。

API 映射参考

条形码 IronBarcode
Code128Encoder.Encode("data", false) BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
QrEncoder.Encode("data", ErrorCorrectionLevel.M, false, false) QRCodeWriter.CreateQrCode("data", 500)
DataMatrixEncoder.Encode("data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix)
new ImageRenderer(new ImageRendererOptions { ... }) 不需要——输出来自 GeneratedBarcode
renderer.Render(barcode, stream) .SaveAsPng(path) / .ToPngBinaryData() / .ToStream()
IBarcode(数据结构,无输出方法) GeneratedBarcode(包含 SaveAsPngToPngBinaryDataToStreamResizeTo 等)
Barcoder + Barcoder.Renderer.Image (2 个软件包) IronBarcode (1 个软件包)
using Barcoder.Code128 using IronBarCode(单一命名空间,所有格式)
using Barcoder.Qr using IronBarCode
using Barcoder.DataMatrix using IronBarCode
无读取 API BarcodeReader.Read(path / bytes / stream / pdf)
没有.NET Framework图像渲染器 .NET Framework4.6.2+
PixelSize + BarHeightFor1DBarcode 选项 .ResizeTo(width, height)

当团队考虑从 条形码 迁移到IronBarcode时

阅读被列入要求中。

许多项目最初都是纯粹的生成流程——打印标签、生成文档代码、在报告中嵌入条形码。 条形码 为这些项目提供初始支持。 当同一个应用程序稍后需要验证传入的条形码、处理扫描的文档或解码上传的 PDF 中的条形码时,Barcoder 无法提供任何解决方案。 团队必须评估第二个库,了解其 API,单独管理其NuGet版本,并处理两个库之间的集成接口。 达到这一步的团队通常会合并到一个可以处理双方的库中,而不是维护两个独立的条形码依赖项。

.NET Framework兼容性中断

Barcoder.Renderer.Image 已放弃对.NET Framework的支持。 在.NET Framework 4.x 上维护服务或桌面应用程序的团队,如果在例行依赖项维护期间更新图像渲染器包,则会遇到生成失败。 这不是配置错误——这是库的平台支持决定。 IronBarcode支持.NET Framework 4.6.2 至.NET 9,无需针对不同目标进行特殊打包或条件依赖。

软件包版本漂移导致协调问题

由于 BarcoderBarcoder.Renderer.Image 是独立版本化的,在依赖项刷新期间,如果只更新其中一个而不更新另一个,可能会引入细微的不兼容性。 在一个包含多个项目的存储库中——每个项目都使用不同版本的渲染器包——确保跨项目的行为一致就变成了一个协调问题,而且这个问题会随着团队规模的扩大而加剧。 使用IronBarcode整合团队后发现,管理一个软件包和一个版本可以彻底消除此类问题。

格式覆盖范围随时间推移而扩大

一个项目可能从 Code128 标签开始,之后添加二维码作为面向客户的链接,然后添加 DataMatrix 以满足合规性要求。 使用 条形码 时,每增加一种格式都意味着需要导入一个新的命名空间,一个具有不同方法参数的不同编码器类,并且可能需要一个新的NuGet包。 使用 IronBarcode,添加格式是对现有调用中 BarcodeEncoding 枚举值的更改。 对于计划扩展条形码格式覆盖范围的团队来说,基于枚举的模型更容易维护。

MAUI 和跨平台部署要求

Barcoder 没有提供对 MAUI、Docker、AWS Lambda 或 Azure 部署的支持文档。 构建跨平台 MAUI 应用程序或将条形码处理部署到无服务器基础架构的团队发现,Barcoder 的文档和测试并未涵盖这些目标。 IronBarcode文档并积极测试在 iOS、Android、Windows、macOS MAUI 目标、Docker 容器和主要云平台上的部署。

常见迁移注意事项

IBarcode 更改为 GeneratedBarcode 类型更改

存储 IBarcode 变量并将其传递给渲染器的条形码代码必须进行重构。 在IronBarcode中,GeneratedBarcode 有其自身的输出方法——没有单独的渲染步骤。任何当前接受 IBarcode 的方法签名都应该更改为接受 GeneratedBarcode,并且该方法内部的渲染调用应该改为直接调用,例如 .SaveAsPng().ToPngBinaryData()。 类型系统会在编译期间显示所有需要更新的位置——在移除 条形码 包后,IBarcode 将无法解析。

PixelSize 没有直接等效项

条形码的 PixelSize 是条形码自然模块尺寸的缩放倍数,而不是明确的像素尺寸。 输出宽度取决于条形码内容、格式和倍数的组合。IronBarcode使用 .ResizeTo(width, height),并明确指定像素尺寸。 迁移过程中,测量现有条形码代码实际输出的尺寸,并在 .ResizeTo() 调用中使用这些值:

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .ResizeTo(300, 80)
    .SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .ResizeTo(300, 80)
    .SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
    .ResizeTo(300, 80) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

命名空间合并

条形码项目会累积 using Barcoder.* 语句——每个使用的格式一个语句。 在迁移过程中,所有这些都合并为一个 using IronBarCode;。 在解决方案中搜索 using Barcoder 将找到所有需要更新的文件。 受影响的文件数量通常比团队预期的要多,因为每个涉及条形码格式的文件都会导入其自身特定于格式的命名空间。

SVG 输出路径更改

使用 Barcoder.Renderer.SvgSvgRenderer 类的项目将渲染器管道替换为对 GeneratedBarcode 的直接方法调用:

// Before
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);

// After
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .SaveAsSvg("barcode.svg");
// Before
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);

// After
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .SaveAsSvg("barcode.svg");
Imports System.IO

' Before
Dim svgRenderer As New SvgRenderer()
Using stream As FileStream = File.OpenWrite("barcode.svg")
    svgRenderer.Render(barcode, stream)
End Using

' After
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
    .SaveAsSvg("barcode.svg")
$vbLabelText   $csharpLabel

所有 SVG 渲染站点迁移完毕后,即可删除 Barcoder.Renderer.Svg 软件包。

IronBarcode的其他功能

除了上述比较点之外, IronBarcode还包含 条形码 所不具备的功能:

-带有嵌入式徽标的二维码 .AddBrandLogo(path) 将品牌图像嵌入二维码中心,而不会影响扫描功能 -原生 PDF 条形码读取 BarcodeReader.Read("document.pdf") 直接处理 PDF 文件,无需先提取图像。 -多条形码检测 ExpectMultipleBarcodes 选项通过一次调用读取单个图像或 PDF 页面中的所有条形码 -读取速度控制 ReadingSpeed.BalancedFasterSlower 针对不同的使用场景调整精度和速度之间的权衡

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

IronBarcode支持.NET Framework 4.6.2、 .NET Core 2.x、 .NET 5、 .NET 6、 .NET 7、 .NET 8 和.NET 9。该项目仍在积极开发中,定期更新,并且已将兼容.NET 10(预计于 2026 年底发布)纳入已公布的路线图。Barcoder 的图像渲染器已停止支持.NET Framework ,并且最近几个版本中该代码库的更新活动有限,因此该库对.NET 9 及未来版本的兼容性尚不明确。 对于需要较长支持期和与即将推出的.NET版本可预测兼容性的团队而言,IronBarcode 积极的发布节奏提供了更大的保障。

结论

Barcoder 和IronBarcode的功能范围截然不同。Barcoder 是一个仅用于生成数据的库,它在编码和渲染之间实现了原则性的分离——IBarcode 数据结构和渲染管线在设计上是两个独立的层。 IronBarcode是一个完整的条形码库,其中生成和读取共享一个软件包、一个命名空间和一致的静态 API。 当需求扩展时,架构上的差异就显得最为明显:Barcoder 的多包、多命名空间、无读取设计使得每次添加都是一项结构性任务,而IronBarcode将新格式或功能的添加视为配置更改。

如果一个项目确实只需要生成条形码,并且仅面向.NET Core ,只会使用少量条形码格式,并且 MIT 许可证是硬性要求,那么 条形码 就是正确的选择。 该库在这些范围内按文档所述运行,对于没有读取要求且没有.NET Framework目标的严格范围项目而言,零成本的开源选项是合理的。

如果项目需要读取和生成条形码,目标平台是.NET Framework或跨平台 MAUI 部署,预计会随着时间推移添加条形码格式,或者需要在 Docker 或云环境中部署,那么IronBarcode就是正确的选择。 单包模型和基于枚举的格式选择消除了随着项目范围扩大而使用 条形码 累积的开销。

实际的决定取决于发展轨迹。 对于一个确定只是简单的单一格式生成器且没有读取要求的项目来说,条形码器可以很好地满足需求。 如果一个项目的条形码需求存在任何模糊之处——例如添加格式、添加读取功能、跨平台部署——那么该项目将会比预期更快地遇到 条形码 的架构限制。 这两个库都是可靠的工具; 问题是,哪一个更符合实际的工作范围。

常见问题解答

什么是条形码?

Barcoder 是一个 .NET 条形码库,用于在 C# 应用程序中生成和读取条形码。它是开发人员在为 .NET 项目选择条形码解决方案时评估的几个备选方案之一。

Barcoder 和 IronBarcode 的主要区别是什么?

IronBarcode 使用静态、无状态的 API,无需实例管理,而 Barcoder 通常需要在使用前创建实例并进行配置。IronBarcode 还提供原生 PDF 支持、自动格式检测以及跨所有环境的单密钥许可。

IronBarcode 的授权比 Barcoder 更容易吗?

IronBarcode 使用单一许可证密钥,同时涵盖开发和生产部署。与将 SDK 密钥与运行时密钥分开的许可系统相比,这简化了 CI/CD 流水线和 Docker 配置。

IronBarcode是否支持Barcoder支持的所有条形码格式?

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 与 Barcoder 相比,在批量处理方面有何不同?

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 安装程序或运行时文件。

与 Barcoder 不同,我可以在购买前评估 IronBarcode 吗?

是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。

Barcoder 和 IronBarcode 的价格差异是多少?

IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。

从 Barcoder 迁移到 IronBarcode 是否很简单?

从 Barcoder 迁移到 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 小时在线。
聊天
电子邮件
打电话给我