从NetBarcode迁移到 IronBarcode
本指南涵盖了从NetBarcode到IronBarcode的完整迁移路径,包括软件包删除步骤、命名空间更新、API 转换示例以及在迁移开始之前查找每个调用点的检查清单。 本指南涉及一种常见场景,即项目起始于使用NetBarcode进行1D条形码生成,后来需要2D格式、读取能力或澄清 SixLabors.ImageSharp 许可义务,这些都超出了NetBarcode的范围。
为什么要从NetBarcode迁移?
**格式限制:**NetBarcode 的 Type 枚举定义了确切的 11 种条形码格式,全部为线性。 没有 QR 码、DataMatrix、PDF417 或 Aztec 的条目。 当一个项目增加了二维码要求——例如用于非接触式配送链接、移动深度链接或药品数据矩阵要求——NetBarcode 就无法满足了。 根据该库的设计,唯一的办法就是停止使用该库来处理这种格式,并引入一个单独的软件包。 超出该11项枚举的每个额外格式需求都会为依赖树添加另一个库。
**没有读取 API:**NetBarcode生成条形码图像,但没有提供解码方法。 需要扫描退货标签、从供应商发票中提取条形码值或验证打印的条形码是否与其源数据匹配的项目必须添加单独的读取库。 ZXing .NET是最常见的选择,它在已经包含NetBarcode和(通常)QR 专用库的代码库中引入了第三个 API 接口。
ImageSharp 商业许可证: NetBarcode依赖于 SixLabors.ImageSharp,它使用分割商业许可证。 免费套餐适用于开源项目和年收入低于规定门槛的公司; 超过该门槛需要商业许可证。 此条件嵌入在传递依赖链中, NuGet在安装过程中不会将其暴露出来。 零售或物流公司如果大规模处理条形码(这正是NetBarcode的目标用例),可能在未评估自身义务的情况下就已经超过了阈值。
**多库累积:**当需要 QR 码时使用 QRCoder,当需要读取时使用 ZXing .NET的项目,会累积三个独立的条形码相关依赖项。 它们各自有自己的发布计划、对 ImageSharp 版本的要求以及需要维护的 API。 将涵盖生成、读取、一维和二维的单一库合并,消除了跨库版本管理问题。
基本问题
一个项目如果一开始只使用 NetBarcode,后来发展到需要 2D 格式,最终就会出现这种拆分导入的情况:
//NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
迁移到IronBarcode后,只需一次导入即可生成相同的两个输出:
using IronBarCode;
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");Imports IronBarCode
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")IronBarcode与 NetBarcode:功能对比
| 特征 | NetBarcode | IronBarcode |
|---|---|---|
| 一维条形码生成 | 是 | 是 |
| 二维条码生成(QR码、DataMatrix码、PDF417码、Aztec码) | 否 | 是 |
| 从图像中读取条形码 | 否 | 是 |
| 从 PDF 文档中读取条形码 | 否 | 是 |
| 一维格式计数 | 11 | 30+ |
| 二维格式计数 | 0 | 8岁以上 |
| 总符号学 | 11 | 50岁以上 |
| GS1-128,GS1 数据条 | 否 | 是 |
| 邮政格式 | 否 | 是 |
| SVG 输出 | 否 | 是 |
| 批量处理 | 手册 | 内置 |
| ImageSharp依赖性 | 是的(分裂许可证) | 否 |
| 商业支持 | 社区 | 专业 |
| 许可模式 | MIT(+ ImageSharp 条件) | 商业翻译 |
快速入门:NetBarcode 到IronBarcode 的迁移
步骤 1:替换 NuGet 软件包
移除NetBarcode及其对 ImageSharp 的传递依赖:
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
请注意,如果项目中的其他包也传递性地引用 SixLabors.ImageSharp ,则它可能会重新出现在已恢复的包列表中。 移除后,运行 dotnet list package --include-transitive 以确认 ImageSharp 是否仍然存在,及其商业许可证条件是否仍适用于项目。
步骤 2:添加IronBarcode
dotnet add package IronBarcode
NuGet 包名称是 IronBarcode; 代码中使用的命名空间是 IronBarCode(注意大写C)。
步骤 3:更新命名空间并初始化许可证
替换所有包含NetBarcode调用的文件中的旧 using 指令:
// 消除 these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;
// Add this:
using IronBarCode;
在应用程序启动时添加许可证初始化一次——在 Startup.cs 或项目的入口点:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"提供免费试用密钥供评估; 购买许可证后,生成的条形码图像中将不再带有试用水印。
代码迁移示例
Code128生成
最常见的NetBarcode使用模式可以直接转换为IronBarcode ,只需将构造函数更改为静态方法并重命名方法即可。
NetBarcode 方法:
using NetBarcode;
var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");Imports NetBarcode
Dim barcode As New Barcode("12345678901234", Type.Code128)
barcode.SaveImageFile("shipping-label.png")IronBarcode方法:
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");Imports IronBarCode
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")new Barcode(data, Type.X) 构造函数变为 BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X)。 SaveImageFile() 方法变为 SaveAsJpeg() 或 SaveAsWindowsBitmap(),根据所需的输出格式。 IronBarcode操作指南中记录了所有可用的1D 条形码生成选项。
EAN-13
零售产品条形码类型通过常量重命名和方法重命名在库之间直接映射。
NetBarcode 方法:
using NetBarcode;
var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");Imports NetBarcode
Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product-ean.png")IronBarcode方法:
using IronBarCode;
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("product-ean.png");Imports IronBarCode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
.SaveAsPng("product-ean.png")编码常量名称与NetBarcodeType 枚举成员名称相匹配,其中有直接等价的。注意 UPC-A (Type.UPCA)、UPC-E (Type.UPCE)、ITF (Type.ITF) 和 MSI (Type.MSI) 不属于NetBarcodeType 枚举——如果需要这些格式,IronBarcode 原生支持它们通过 BarcodeEncoding.ITF 和 BarcodeEncoding.MSI。
GetImage() 转换为 ToPngBinaryData()
NetBarcode 的 GetImage() 方法返回 SixLabors.ImageSharp.Image<Rgba32>,这需要在调用代码中显式导入 ImageSharp,并将下游逻辑绑定到 ImageSharp API。IronBarcode直接在 GeneratedBarcode 对象上暴露二进制和流输出方法,完全消除调用代码对 ImageSharp 的依赖。
NetBarcode 方法:
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO
Dim barcode As New Barcode("12345", Type.Code128)
Dim image As Image(Of Rgba32) = barcode.GetImage()
Using stream As New MemoryStream()
image.SaveAsPng(stream)
Dim bytes As Byte() = stream.ToArray()
End UsingIronBarcode方法:
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);
// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();
// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);Imports IronBarCode
Dim barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
' Retrieve bytes directly — no ImageSharp type in calling code
Dim bytes As Byte() = barcode.ToPngBinaryData()
' Or write to a stream directly
Using stream As New MemoryStream()
barcode.SaveAsPng(stream)
End Using对 Image<Rgba32> 结果进行进一步 ImageSharp 操作的代码——调整大小、合成、格式转换——将需要逐一评估这些操作,因为IronBarcode不会暴露 ImageSharp 对象。
同时替换NetBarcode和 QRCoder
同时运行NetBarcode和 QRCoder 的项目可以同时替换两者。IronBarcode的二维生成使用与一维生成相同的 BarcodeWriter.CreateBarcode 方法; 唯一不同的是 BarcodeEncoding 常量。 有关编码选项和配置,请参阅二维条形码生成指南。
NetBarcode 和 QRCoder 方法:
using NetBarcode;
using QRCoder;
// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));Imports NetBarcode
Imports QRCoder
' 1D with NetBarcode
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")
' QR with QRCoder
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20))IronBarcode方法:
using IronBarCode;
// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
.SaveAsPng("pharma-label.png");Imports IronBarCode
' 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
' QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
' Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
.SaveAsPng("pharma-label.png")增加阅读功能
如果该项目还使用了 ZXing .NET进行读取,则可以与NetBarcode一起删除该依赖项。IronBarcode的 BarcodeReader 处理具有自动格式检测的图像和 PDF 文档。
ZXing .NET方法:
using ZXing;
using ZXing.Common;
using ZXing.Rendering;
var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };
// Bitmap loading and format-specific handling required before decode callImports ZXing
Imports ZXing.Common
Imports ZXing.Rendering
Dim reader = New BarcodeReaderGeneric()
reader.Options = New DecodingOptions With {.TryHarder = True}
' Bitmap loading and format-specific handling required before decode callIronBarcode方法:
using IronBarCode;
// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
Console.WriteLine($"{r.Format}: {r.Value}");
}
// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}Imports IronBarCode
' Read from an image file — automatic format detection
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
Console.WriteLine($"{r.Format}: {r.Value}")
Next
' Read from a PDF document — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each r In pdfResults
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}")
Next有关读取选项的完整文档可在"从图像读取条形码"指南中找到,其中涵盖速度调整、多条形码检测和图像校正设置。
##NetBarcodeAPI 到IronBarcode映射参考
| 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.Code39) | BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) | 直接映射 |
new Barcode(data, Type.EAN8) | BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) | 直接映射 |
new Barcode(data, Type.Codabar) | BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) | 直接映射 |
new Barcode(data, Type.Code93) | BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) | 直接映射 |
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; | 消除 | 不再需要 |
using SixLabors.ImageSharp.PixelFormats; | 消除 | 不再需要 |
using SixLabors.Fonts; | 消除 | 不再需要 |
编码常量的完整列表请参阅支持的条形码格式参考文档。
常见迁移问题和解决方案
问题 1:移除软件包后,ImageSharp 的传递依赖仍然存在
**问题:**运行 dotnet remove package NetBarcode 后,dotnet restore 显示依赖树中仍存在 SixLabors.ImageSharp,因为项目中的另一个包也引用了它。
**解决方案:**运行 dotnet list package --include-transitive 以识别哪个包仍在将 ImageSharp 拉入。如果仅是 NetBarcode,移除显式包引用并恢复应清除它。 如果另一个软件包负责,该软件包的ImageSharp依赖关系及其商业许可证条件将在范围内独立于NetBarcode移除。
dotnet list package --include-transitive | grep -i imagesharp
第二期:图像<Rgba32>移除后无法解析类型
**问题:**移除 SixLabors.ImageSharp 包后,任何声明为 Image<Rgba32> 的变量或参数类型为 SixLabors.ImageSharp.Image<Rgba32> 的都会产生编译错误,因为类型不再可用。
**解决方案:**将每个用法替换为相应的IronBarcode输出方法。 如果变量用于获取字节码,请替换为 .ToPngBinaryData()。 如果写入到流中,替换为 .SaveAsPng(stream)。 如果保存到文件,替换为 .SaveAsPng(path)。
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);
// After — no external image type required
barcode.SaveAsPng(stream);' Before — requires SixLabors.ImageSharp reference
Dim img As Image(Of Rgba32) = barcode.GetImage()
img.SaveAsPng(stream)
' After — no external image type required
barcode.SaveAsPng(stream)问题 3:v1.8 版本重大变更背景
**问题:**在 v1.8 之前针对NetBarcode编写的代码库可能有 GetImage() 调用,存储结果而没有显式类型,依赖于 v1.8 之前的内部返回类型。 即使没有IronBarcode迁移,NetBarcode 更新后这些调用也可能已经失效。
**解决方案:**利用IronBarcode迁移的机会同时解决任何 v1.8 之前已经存在的崩坏。应该通过项目范围的搜索定位所有 GetImage() 调用站点,并在迁移过程中替换为适当的IronBarcode输出方法。 下面迁移清单中的 grep 命令用于识别这些位置。
NetBarcode迁移清单
迁移前
在进行任何更改之前,请先审核所有NetBarcode使用情况:
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
- 找出所有需要更改 using 指令的文件
- 注意所有
GetImage()调用站点及下游使用的Image<Rgba32>对象 - 检查 QRCoder 或 ZXing .NET是否存在,并可在同一步骤中将其移除。
- 运行
dotnet list package --include-transitive记录当前 ImageSharp 依赖状态,然后再删除 - 获取IronBarcode许可证密钥(无需购买即可获得免费试用密钥)
代码更新
- 运行
dotnet remove package NetBarcode - 如果未被其他包使用,运行
dotnet remove package SixLabors.ImageSharp - 运行
dotnet add package IronBarcode - 在应用程序启动时添加
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; - 在每个受影响的文件中用
using IronBarCode;替换using NetBarcode; - 从所有文件中移除
using SixLabors.ImageSharp.PixelFormats;和using SixLabors.Fonts; - 使用 API 映射表将每个
new Barcode(data, Type.X)调用转换为BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X) - 用
SaveAsPng()或适当的格式特定方法替换SaveImageFile() - 根据需要将
GetImage()调用替换为SaveAsPng()或SaveAsPng(stream) - 如果移除 QRCoder: 用
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)替换QRCodeGenerator+PngByteQRCode链 - 如果移除 ZXing.Net: 用
BarcodeReader.Read(path)替换阅读器设置
迁移后测试
- 构建项目并确认无编译错误
- 对生成的条形码输出运行现有的单元测试
- 通过目视检查条形码图像,确保其符号正确且内容清晰可读。
- 如果在迁移过程中添加了二维码格式,请验证二维码输出。
- 测试条形码扫描功能的读取功能(如果已添加条形码扫描功能)。
- 运行
dotnet list package --include-transitive以确认如果已删除,ImageSharp 不再存在 - 验证许可证密钥初始化是否在首次条形码操作之前运行
迁移到IronBarcode的主要优势
**统一格式覆盖:**迁移后,QR 代码、DataMatrix、PDF417、Aztec 和其他所有二维格式均可通过用于 Code128 和 EAN-13 的相同 API 调用获得。当格式要求扩展时,无需第二个库,只需更改格式类型之间的 BarcodeEncoding 常量。
内置读取:BarcodeReader.Read() 处理具有自动格式检测的图像文件和 PDF 文档。 以前需要 ZXing .NET进行读取的项目可以消除这种依赖性,并整合到一个条形码库中,从而减少项目中的开发人员必须学习的 API 范围。
IronBarcode不依赖 SixLabors.ImageSharp,也不依赖于 ImageSharp 。 迁移后,NetBarcode传递依赖中嵌入的分裂商业许可证条件不再适用于项目。 许可证合规审查变得更加简单,因为条形码库的义务直接陈述,并不依赖于第三方图像处理库的收入门槛。
稳定的公共 API: IronBarcode不会在其公共 API 接口中公开第三方类型。 从 BarcodeWriter.CreateBarcode 的 GeneratedBarcode 返回类型是IronBarcode自己的类型,这意味着IronBarcode内部渲染的未来更新不会像NetBarcode在 v1.8 中的 GetImage() 类型更改那样导致调用代码中的重大变更。
**维护单一依赖项:**用IronBarcode替换 NetBarcode、QRCoder 和 ZXing .NET,可将三个升级周期、三套发行说明和三个潜在的版本冲突减少到一个。 随着.NET版本的更新和依赖项更新的必要性,维护工作量会随着单个库的减少而增加,而不是像以前那样需要三个库。

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。