从 条形码 迁移到 IronBarcode
本指南涵盖了从 条形码 到IronBarcode的完整迁移路径。 它介绍了三步设置变更,为每种常见模式提供了变更前后的代码示例,将 条形码 API 映射到其IronBarcode等效项,记录了迁移过程中出现的问题,并提供了一个搜索词清单,用于在认为迁移完成之前审核您的代码库。
为什么要从 条形码 迁移?
双SKU采购成本: 条形码 为Generator SDK(仅线性和线性+2D级别)提供永久定价,并将Reader SDK列为单独定价的产品。 需要这两种功能的组织必须完成两次采购流程,针对两个SKU——选择所用符号的正确Generator级别,然后单独购买Reader——才能确定总成本。 摩擦是由于两次采购而不是单个项目项的重复。
**分离式产品开销:**生成和读取是两个独立的产品,分别具有独立的NuGet包、独立的许可证命名空间、独立的许可证密钥和独立的版本计划。 使用这两个产品的项目必须在启动时配置两个许可证密钥,在升级过程中跟踪两个软件包版本,并保持对两个独立发布周期的了解。 如果将阅读要求添加到原本只考虑生成功能的项目中,则第二个产品必须重复整个采购和集成过程。
PDF 工作流程缺陷: 条形码 本身不支持从 PDF 文档中读取条形码。 处理嵌入在发票、发货清单、采购订单或档案扫描件中的条形码的项目必须单独获取一个 PDF 转图像渲染库,将其集成到流程中,单独管理其许可证,并将渲染后的页面逐个传递给 条形码 Reader SDK。这样就产生了一个双重依赖的解决方案,而原本一个依赖的解决方案就足够了。
API 详细信息: 条形码 生成器需要实例化一个 Barcode 对象,分配多个属性——包括具有合理默认值的属性,例如 BarWidth 和 BarHeight——然后调用生成方法。 使用静态工厂 API 可以用更少的代码生成相同的输出。 通过批量生成,属性赋值模式会产生大量重复代码,这些代码必须进行审查和维护。
基本问题
对于任何既需要生成又需要读取的项目来说,双许可证配置是最直接的摩擦点。 条形码 需要在启动时分别调用两个不同的许可证命名空间:
// OnBarcode: two products, two DLL references, no runtime key
// 条形码 uses pre-licensed DLLs — the purchased DLL is already activated.
// There is no runtime SetLicense() call; the license is baked into the downloaded assembly.
using OnBarcode.Barcode;
using OnBarcode.Barcode;
IronBarcode将其简化为一个属性赋值,该赋值涵盖所有功能——生成、读取、PDF 支持和批量操作——所有这些都归于一个键之下:
// IronBarcode: one package, one key, one line
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"应用程序中的每一个条形码操作——无论是生成、读取还是处理 PDF——都在该单一配置下运行。
IronBarcode与 OnBarcode:功能对比
| 特征 | 条形码 | IronBarcode |
|---|---|---|
| 条形码生成 | 是 | 是 |
| 条形码读取 | 独立产品,单独购买 | 包括 |
| PDF条形码读取 | 原生不支持 | 原生应用——无需外部库 |
| 读取时自动检测格式 | 否 — 需要明确的 BarcodeType[] | 是 |
| 结果元数据(格式、位置、页码) | 不可用 — 仅限原始 string[] | 是 — 带完整元数据的 BarcodeResults |
| 带有徽标叠加层的二维码 | 需要手动编写 GDI+ 代码 | 内置 |
| 出版定价 | 是的——每个产品页面(Generator级别+单独的Reader) | 是的——单页包含所有功能 |
| 一个许可证密钥即可使用所有功能 | 不——每个产品都有单独的密钥 | 是 |
| NuGet分发 | 可用,伴随旧版DLL下载 | 自发布以来即可使用 |
| 源代码访问 | 仅限无限流量套餐 | 不可用 |
| 支持.NET 8/9 | 是 | 是 |
| Docker/云许可证配置 | 手册 | 环境变量支持 |
快速入门:OnBarcode 到IronBarcode 的迁移
步骤 1:移除 条形码 包引用
如果您的项目使用了NuGet包,请删除这两项:
dotnet remove package OnBarcode.Barcode.Generator
dotnet remove package OnBarcode.Barcode.Reader
如果您的项目使用旧的基于DLL的分发,也请从您的.csproj中移除手动引用块:
<!-- Remove this block entirely -->
<ItemGroup>
<Reference Include="OnBarcode.Barcode">
<HintPath>lib\OnBarcode.Barcode.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
从lib/目录或存储DLL文件的任何地方删除这些DLL文件。 如果将旧程序集与新的NuGet包一起保留,则会在编译时产生命名空间冲突。
步骤 2:添加IronBarcode
一个软件包涵盖生成、读取和 PDF 支持:
dotnet add package IronBarcode
阅读时无需第二个软件包。 支持 PDF 不需要第二个软件包。
步骤 3:更新命名空间并替换双许可证配置
将两个 条形码 使用指令替换为单个IronBarcode导入:
// Remove
using OnBarcode.Barcode;
using OnBarcode.Barcode;
// Add
using IronBarCode;Imports IronBarCode用一个单一的键分配替换双DLL引用。 在应用程序启动初期,任何条形码操作运行之前,只需添加一次此代码:
// Remove the 条形码 DLL references and using directives
// Add
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
代码迁移示例
Code 128条码生成
Code 128 的基本案例说明了属性赋值模式与静态工厂模式的区别。
条形码方法:
using OnBarcode.Barcode;
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = "SHIP-2024-001";
barcode.Resolution = 96;
barcode.X = 1;
barcode.BarcodeHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode("shipping-label.png");Imports OnBarcode.Barcode
Dim barcode As New Linear()
barcode.Type = BarcodeType.CODE128
barcode.Data = "SHIP-2024-001"
barcode.Resolution = 96
barcode.X = 1
barcode.BarcodeHeight = 80
barcode.ShowText = True
barcode.drawBarcode("shipping-label.png")IronBarcode方法:
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");Imports IronBarCode
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")数据和编码类型作为参数传递给CreateBarcode。 分辨率和条形高度等属性并非生成可扫描输出的必要条件; 默认设置适用于大多数用途。 当需要自定义尺寸时,可以在SaveAsPng之间以链式调用的方式添加,而不会引入可变对象状态。
生成带有徽标的二维码
带有标志的QR码需要OnBarcode回退到System.Drawing进行图像叠加步骤。IronBarcode提供此作为内置操作。
条形码方法:
using OnBarcode.Barcode;
using System.Drawing;
QRCode qr = new QRCode();
qr.Data = "https://example.com/product/4891";
qr.QRCodeDataMode = QRCodeDataMode.Auto;
qr.QRCodeECL = QRCodeECL.H; // H-level error correction required for logo overlay
Image qrImage = qr.drawBarcode();
using (Graphics g = Graphics.FromImage(qrImage))
{
Image logo = Image.FromFile("brand-logo.png");
int logoSize = qrImage.Width / 5;
int x = (qrImage.Width - logoSize) / 2;
int y = (qrImage.Height - logoSize) / 2;
g.DrawImage(logo, x, y, logoSize, logoSize);
}
qrImage.Save("product-qr.png");Imports OnBarcode.Barcode
Imports System.Drawing
Dim qr As New QRCode()
qr.Data = "https://example.com/product/4891"
qr.QRCodeDataMode = QRCodeDataMode.Auto
qr.QRCodeECL = QRCodeECL.H ' H-level error correction required for logo overlay
Dim qrImage As Image = qr.drawBarcode()
Using g As Graphics = Graphics.FromImage(qrImage)
Dim logo As Image = Image.FromFile("brand-logo.png")
Dim logoSize As Integer = qrImage.Width \ 5
Dim x As Integer = (qrImage.Width - logoSize) \ 2
Dim y As Integer = (qrImage.Height - logoSize) \ 2
g.DrawImage(logo, x, y, logoSize, logoSize)
End Using
qrImage.Save("product-qr.png")IronBarcode方法:
using IronBarCode;
var qr = QRCodeWriter.CreateQrCodeWithLogo("https://example.com/product/4891", "brand-logo.png", 500);
qr.SaveAsPng("product-qr.png");Imports IronBarCode
Dim qr = QRCodeWriter.CreateQrCodeWithLogo("https://example.com/product/4891", "brand-logo.png", 500)
qr.SaveAsPng("product-qr.png")纠错级别、徽标尺寸计算和图像合成均由内部处理。 无需System.Drawing依赖。
从图像中读取条形码
从图像文件中读取数据最能清晰地说明产品整合情况。 使用 条形码 时,读取需要单独的 Reader SDK、单独的许可证调用和明确的格式规范。 使用IronBarcode,只需使用同一个包和密钥进行一次静态调用即可。
条形码方法:
using OnBarcode.Barcode;
// 条形码 reader is distributed as a pre-licensed DLL — no runtime SetLicense() call.
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
string[] results = scanner.Scan("received-label.png");
foreach (string value in results)
Console.WriteLine(value);
IronBarcode方法:
using IronBarCode;
var results = BarcodeReader.Read("received-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");Imports IronBarCode
Dim results = BarcodeReader.Read("received-label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next无需创建实例,无需格式化数组,无需单独配置许可证。 系统会自动检测格式。 每个结果都包含解码值和检测到的格式。 有关读取选项和支持的图像类型的详细信息,请参阅如何从图像中读取条形码的指南。
从 PDF 文件中读取条形码
此迁移示例适用于在将 PDF 页面渲染为图像之前,使用第三方库将这些图像传递给 条形码 Reader SDK 的团队。
条形码方法:
// 条形码 has no native PDF support.
// A separate PDF rendering library was required — for example PdfiumViewer or Aspose.PDF.
var pageImages = RenderPdfPagesToImages("invoices.pdf"); // external library call
using OnBarcode.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
foreach (var pageImage in pageImages)
{
string[] results = scanner.Scan(pageImage);
foreach (string value in results)
Console.WriteLine(value);
}
IronBarcode方法:
using IronBarCode;
var results = BarcodeReader.Read("invoices.pdf");
foreach (var result in results)
Console.WriteLine($"Page {result.PageNumber}: {result.Format} — {result.Value}");Imports IronBarCode
Dim results = BarcodeReader.Read("invoices.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Format} — {result.Value}")
Next无需渲染步骤,无需外部PDF库,无需格式数组。 PDF条形码读取功能可自动处理所有页面,并在每个结果中包含页码。
批量生成
为一组商品生成条形码与单个商品生成条形码遵循相同的模式差异。
条形码方法:
using OnBarcode.Barcode;
foreach (var item in inventoryItems)
{
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = item.Sku;
barcode.Resolution = 96;
barcode.BarWidth = 1;
barcode.BarHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode($"labels/{item.Id}.png");
}Imports OnBarcode.Barcode
For Each item In inventoryItems
Dim barcode As New Linear()
barcode.Type = BarcodeType.CODE128
barcode.Data = item.Sku
barcode.Resolution = 96
barcode.BarWidth = 1
barcode.BarHeight = 80
barcode.ShowText = True
barcode.drawBarcode($"labels/{item.Id}.png")
NextIronBarcode方法:
using IronBarCode;
foreach (var item in inventoryItems)
{
BarcodeWriter.CreateBarcode(item.Sku, BarcodeEncoding.Code128)
.SaveAsPng($"labels/{item.Id}.png");
}Imports IronBarCode
For Each item In inventoryItems
BarcodeWriter.CreateBarcode(item.Sku, BarcodeEncoding.Code128) _
.SaveAsPng($"labels/{item.Id}.png")
Next条形码 API 到IronBarcode映射参考
| 条形码 | IronBarcode | 备注 |
|---|---|---|
| 预许可DLL(无需运行时键调用) | IronBarCode.License.LicenseKey = "key" | 财产转让; 启动时调用一次 |
| 两个DLL引用(生成器+读取器) | 单个 NuGet 软件包 | 一个包涵盖所有功能 |
new Linear() | BarcodeWriter.CreateBarcode(data, encoding) | 静态工厂; 没有对象实例 |
barcode.BarcodeType = BarcodeType.CODE128 | BarcodeEncoding.Code128 作为参数 | 作为第二个参数传递给CreateBarcode |
barcode.Data = "..." | CreateBarcode的第一个参数 | 数据是首要论据 |
barcode.drawBarcode("file.png") | .SaveAsPng("file.png") | 格式化方法 |
barcode.drawBarcode("file.jpg") | .SaveAsJpeg("file.jpg") | 格式化方法 |
barcode.drawBarcode("file.pdf") | .SaveAsPdf("file.pdf") | 原生 PDF 输出 |
BarcodeType.CODE128 | BarcodeEncoding.Code128 | 常量重命名 |
BarcodeType.QRCode | BarcodeEncoding.QRCode | 直接映射 |
BarcodeType.EAN13 | BarcodeEncoding.EAN13 | 直接映射 |
BarcodeType.DataMatrix | BarcodeEncoding.DataMatrix | 直接映射 |
BarcodeType.PDF417 | BarcodeEncoding.PDF417 | 直接映射 |
new BarcodeScanner() { BarcodeTypes = [...] } | BarcodeReader.Read(path) — 静态 | 没有实例,也没有格式规范 |
scanner.Scan("file.png") → string[] | BarcodeReader.Read("file.png") → BarcodeResults | 更丰富的返回类型 |
results[0] (原始字符串) | result.Value | 解码后的字符串值 |
| 不适用 | result.Format | 检测到的格式——OnBarcode 中不支持。 |
| 不适用 | result.PageNumber | PDF 读取的页面源代码 |
| 不适用 | BarcodeReader.Read("document.pdf") | 原生PDF阅读; 没有 条形码 等效项 |
| 手动 GDI+ 叠加 QR 标志 | QRCodeWriter.CreateQrCodeWithLogo() | 内置徽标支持 |
BarcodeType[] 配置 | 不要求 | 自动检测是默认设置 |
常见迁移问题和解决方案
问题 1:DLL 引用冲突
OnBarcode: 在旧版DLL分发的项目中,.csproj 中包含指向 lib\OnBarcode.Barcode.dll 或类似路径的 <Reference> 元素。 如果添加IronBarcode时旧的 DLL 仍然存在于磁盘上,编译器将看到两个程序集提供相同的命名空间前缀,从而产生歧义引用错误。
解决方案: 在运行<ItemGroup>引用块。 从磁盘中删除 DLL 文件。 使用全新构建版本验证是否没有残留过时的程序集引用。
# Search for lingering 条形码 DLL references in project files
grep -r "OnBarcode" --include="*.csproj" .
grep -r "OnBarcode" --include="*.props" .
问题2:分阶段迁移期间的类型名称冲突
OnBarcode: 读取器命名空间导出一个名为BarcodeScanner的类。IronBarcode有一个静态类,名为 BarcodeReader。 这些名称不直接冲突,但任何同时导入BarcodeEncoding。 在迁移过程中保持两个命名空间同时活动会导致任何BarcodeType引用的编译错误。
解决方案: 完整地完成每个文件的迁移——在同一次编辑中删除using IronBarCode。 不要让两个 using 指令同时存在于任何文件中。如果需要分阶段实施,请暂时使用完全限定名称:
// Temporary disambiguation during phased migration
var results = IronBarCode.BarcodeReader.Read("file.png");' Temporary disambiguation during phased migration
Dim results = IronBarCode.BarcodeReader.Read("file.png")问题 3:移除条形码类型数组
**OnBarcode:**读取器需要 reader.BarcodeTypes = new BarcodeType[] { ... } 到函数。 开发人员在迁移读取器代码时,有时会习惯于明确指定格式,并在IronBarcode中查找等效配置。
**解决方案:**完全移除格式规范。 BarcodeReader.Read 在所有支持的格式中执行自动检测。 无需配置,并且IronBarcode中不存在BarcodeType[]的等效内容,因为它是不需要的。
// No format configuration required
var results = BarcodeReader.Read("label.png");Dim results = BarcodeReader.Read("label.png")条形码 迁移清单
迁移前任务
在进行任何更改之前,请审核代码库,找出所有 条形码 的使用情况:
# Find all 条形码 namespace imports
grep -rn "using OnBarcode" --include="*.cs" .
# Find all license configuration calls
grep -rn "SetLicense" --include="*.cs" .
# Find all generator usage
grep -rn "new Linear\|new QRCode\|drawBarcode\|BarcodeType\." --include="*.cs" .
# Find all reader usage
grep -rn "BarcodeScanner\|\.Scan(\|BarcodeType\[\]" --include="*.cs" .
# Find DLL references in project files
grep -rn "OnBarcode" --include="*.csproj" .
grep -rn "OnBarcode" --include="*.sln" .
记录哪些文件仅使用生成功能,哪些文件使用读取功能,哪些文件两者都使用。 请注意任何包含手动<Reference> DLL 块而非NuGet包引用的文件。
代码更新任务
- 移除
OnBarcode.Barcode.GeneratorNuGet包 - 移除
OnBarcode.Barcode.ReaderNuGet包 - 从
<Reference>DLL条目 - 从存储库中删除 条形码 DLL 文件
- 运行
dotnet add package IronBarcode - 在每个文件中用
using OnBarcode.Barcode - 在每个文件中用
using OnBarcode.Barcode.Reader - 移除两个OnBarcode DLL
<Reference>条目(生成器和读取器)——无需替换运行时代码调用 - 在应用程序启动时一次性地添加
IronBarCode.License.LicenseKey = "YOUR-KEY" - 将每个
new QRCode()+ 属性分配块转换为BarcodeWriter.CreateBarcode(data, encoding) - 用
barcode.drawBarcode("file.png") - 用
new BarcodeScanner() { BarcodeTypes = [...] }+.Scan(path) - 将结果处理从
BarcodeResults上 - 移除所有用于绕过 条形码 PDF 限制的 PDF 转图像渲染代码
- 用单次
BarcodeReader.Read("file.pdf")调用替换多步骤PDF渲染和扫描循环
迁移后测试
- 验证项目中使用的每种条形码类型(Code 128、QR、EAN、Data Matrix、PDF417)是否都能生成可扫描的输出。
- 使用物理扫描仪或移动设备扫描生成的条形码,以确认其可读性
- 验证条形码读取是否能为已知的测试图像返回正确的值
- 确认 PDF 读取功能能够为多页测试文档返回正确的值和页码。
- 在任何持续集成 (CI) 环境中运行应用程序,以确认许可证密钥配置在流水线中正常工作。
- 在迁移完成后,检查
OnBarcode字符串
迁移到IronBarcode的主要优势
**整合的软件包和许可证:**迁移后,一个NuGet包和一个许可证密钥即可涵盖所有条形码操作。 无需采购单独的产品,无需跟踪独立的版本更新计划,也无需在启动时维护双重许可配置。双产品架构的复杂性被单一依赖关系所取代。
透明采购: IronBarcode在产品网站上公布了永久许可级别的价格。企业无需与销售人员沟通,即可确定总成本、提交采购订单并完成采购。 IronBarcode许可页面包含所有级别的定价以及 Docker 和云环境的关键配置详情。
**原生 PDF 支持:**以前需要单独的 PDF 渲染库来处理嵌入条形码的 PDF 的项目可以完全消除这种依赖性。 单次BarcodeReader.Read调用处理PDF文档的所有页面,不需要任何渲染步骤,并且每个结果都包含提取页面的页码。
更丰富的读取结果: BarcodeResults返回类型提供了解码值、检测到的条形码格式、源图像中的坐标框以及PDF读取的页码。 以前使用平面string[]的应用程序现在可以显示格式信息、支持注释工作流或实施基于置信度的过滤,而无需增加额外处理。
**减少 API 接口:**静态工厂模式取代了属性赋值模型。 常见的生成操作需要的代码行数较少,读取操作不需要创建实例或预先配置格式。 批量操作的优势在于每个项目的代码占用空间更小,更容易进行审查和长期维护。

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