跳至页脚内容
视频

How to create Barcodes as Streams in C# Using IronBarcode

从Barcode4NET迁移到IronBarcode

本迁移指南涵盖了如何移除Barcode4NET依赖项并将其替换为IronBarcode,其中包含分步说明、代码比较以及面向.NET开发人员的实用示例,以指导他们进行此过渡。Barcode4NET在没有正式公告的情况下停止了服务——停止销售新许可证,没有发布NuGet包,并且该库只能在.NET Framework上运行。 本指南实用且具体:它涵盖了删除 DLL 引用、通过NuGet安装IronBarcode以及转换生成代码。 它还涵盖了迁移后可用的读取和 PDF 功能,这些功能在Barcode4NET中根本不可用。

为什么要从Barcode4NET迁移?

从Barcode4NET迁移的团队报告了以下一致的触发因素:

不再提供新许可证:Barcode4NET许可证不再通过 ComponentSource 或任何其他渠道出售。 如果开发人员加入使用Barcode4NET的团队,则没有机制可以为他们购买席位。 加入项目的承包商或需要开发条形码功能的第二开发人员,不能根据原产品条款获得合法许可。

没有NuGet包:这不是一个小的不便——这是与现代.NET工作流程的根本性不兼容。 每个克隆该代码库的开发人员都必须知道 DLL 文件的位置。 CI/CD 流水线必须手动配置才能找到它。 该dotnet restore命令无法解决它。 DLL 要么被提交到源代码控制系统中,要么被保存在私有工件存储库中,这两种方式都需要持续的人工维护。

不支持.NET 5、6、7、8 或 9:Barcode4NET仅面向.NET Framework 。 当组织将其目标框架升级到net8.0时,构建失败,因为该库是针对不再引用的.NET Framework程序集编译的。 不会有补丁发布。 如果团队需要迁移到现代.NET以获得更好的性能、进行 Linux 或 Docker 部署,或者获得微软的长期支持,那么Barcode4NET就是一个难以逾越的障碍。

没有安全补丁:该库将冻结在开发停止时的状态。 此后发现的任何安全问题都始终未得到解决。 没有问题跟踪系统,没有维护人员可以联系,也没有供应商响应流程。

没有错误修复:如果特定符号变体或条形码尺寸的极端情况出现渲染问题,则没有解决方法。 该库将不再更新。

基本问题

最常见的发现时刻是开发人员在.NET现代化项目期间升级目标框架。 构建失败,因为Barcode4NET的 DLL 是针对.NET Framework程序集编译的,而这些程序集在新目标下已不再可用。 问题不在于生成 API 本身,而在于底层依赖项无法继续运行。

//Barcode4NET— locked to .NET Framework, no NuGet package
// Requires manual DLL reference in every .csproj:
// <Reference Include="Barcode4NET">
//   <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
// </Reference>
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.Width = 300;
barcode.Height = 100;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
//Barcode4NET— locked to .NET Framework, no NuGet package
// Requires manual DLL reference in every .csproj:
// <Reference Include="Barcode4NET">
//   <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
// </Reference>
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.Width = 300;
barcode.Height = 100;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
Imports Barcode4NET
Imports System.Drawing
Imports System.Drawing.Imaging

Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.Width = 300
barcode.Height = 100
Dim barcodeImage As Bitmap = barcode.GenerateBarcode()
barcodeImage.Save(outputPath, ImageFormat.Png)
$vbLabelText   $csharpLabel
//IronBarcode— NuGet package, .NET Framework 4.6.2 through .NET 9
// dotnet add package IronBarcode
using IronBarCode;

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

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
//IronBarcode— NuGet package, .NET Framework 4.6.2 through .NET 9
// dotnet add package IronBarcode
using IronBarCode;

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

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

IronBarcode与 Barcode4NET:功能对比

特征 Barcode4NET IronBarcode
NuGet 软件包 不——仅限手动 DLL。 是 (IronBarcode)
.NET Framework支持 是的(仅限.NET Framework ) 是的(.NET Framework 4.6.2+)
支持.NET Core / .NET 5+ 是的(.NET 5、6、7、8、9)
Linux/macOS 支持
Docker 支持
Azure/AWS Lambda
条形码生成
条形码读取/扫描 是 (BarcodeReader.Read())
PDF条形码读取 是的(原生实现,无需额外库)
带有徽标的二维码 是 (AddBrandLogo())
流畅的链式 API
主动维护 否(生命终结)
新许可证现已推出 是 — Lite $749,Plus $1,499,Pro $2,999,Unlimited $5,999
安全补丁
CI/CD 流水线集成 手动复制 DLL 步骤 标准dotnet restore

快速入门:Barcode4NET 到IronBarcode 的迁移

迁移工作可以通过以下基本步骤立即开始。

步骤 1:替换 NuGet 软件包

Barcode4NET从未作为NuGet包分发,因此没有dotnet remove package命令。 手动移除。

从源代码控制系统中删除 DLL 文件,并暂存删除操作:

git rm -r ThirdParty/Barcode4NET/
git rm -r ThirdParty/Barcode4NET/
SHELL

从每个<Reference>元素。在整个解决方案中搜索,查找需要更新的每个文件:

grep -rl "Barcode4NET" --include="*.csproj" .
grep -rl "Barcode4NET" --include="*.csproj" .
SHELL

从每个包含该元素的.csproj文件中删除该元素:

<Reference Include="Barcode4NET">
  <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
</Reference>
<Reference Include="Barcode4NET">
  <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
</Reference>
XML

然后安装IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

这条命令即可添加IronBarcode并解决所有依赖项。 无需 DLL 管理,无需工件存储,无需手动复制步骤。

步骤 2:更新命名空间

替换使用Barcode4NET的每个文件顶部的旧using指令:

// Before
using Barcode4NET;

// After
using IronBarCode;
// Before
using Barcode4NET;

// After
using IronBarCode;
Imports Barcode4NET

' After
Imports IronBarCode
$vbLabelText   $csharpLabel

步骤 3:初始化许可证

在应用程序启动时添加许可证初始化—在Startup.cs或您的应用程序启动的任意位置:

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

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

代码迁移示例

基本标签生成

最常见的Barcode4NET模式:创建一个对象,设置属性,调用Bitmap,然后保存它。

Barcode4NET 方法:

using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

public void SaveLabel(string sku, string outputPath)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = sku;
    barcode.Width = 400;
    barcode.Height = 120;
    Bitmap barcodeImage = barcode.GenerateBarcode();
    barcodeImage.Save(outputPath, ImageFormat.Png);
}
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

public void SaveLabel(string sku, string outputPath)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = sku;
    barcode.Width = 400;
    barcode.Height = 120;
    Bitmap barcodeImage = barcode.GenerateBarcode();
    barcodeImage.Save(outputPath, ImageFormat.Png);
}
Imports Barcode4NET
Imports System.Drawing
Imports System.Drawing.Imaging

Public Sub SaveLabel(sku As String, outputPath As String)
    Dim barcode As New Barcode4NET.Barcode()
    barcode.Symbology = Symbology.Code128
    barcode.Data = sku
    barcode.Width = 400
    barcode.Height = 120
    Dim barcodeImage As Bitmap = barcode.GenerateBarcode()
    barcodeImage.Save(outputPath, ImageFormat.Png)
End Sub
$vbLabelText   $csharpLabel

IronBarcode方法:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

public void SaveLabel(string sku, string outputPath)
{
    BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .SaveAsPng(outputPath);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

public void SaveLabel(string sku, string outputPath)
{
    BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .SaveAsPng(outputPath);
}
Imports IronBarCode

Public Sub SaveLabel(sku As String, outputPath As String)
    BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
        .ResizeTo(400, 120) _
        .SaveAsPng(outputPath)
End Sub
$vbLabelText   $csharpLabel

属性设置器块会合并成一个流畅的单链。 Height属性分配。 barcodeImage.Save()调用。 有关其他生成选项,请参阅IronBarcode条形码生成文档

WinForms PictureBox 显示

如果您的Barcode4NET代码直接将MemoryStream加载字节数组。

Barcode4NET 方法:

using Barcode4NET;
using System.Drawing;

private void RefreshBarcodeDisplay(string data)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = data;
    barcode.Width = 300;
    barcode.Height = 100;
    pictureBox1.Image = barcode.GenerateBarcode();
}
using Barcode4NET;
using System.Drawing;

private void RefreshBarcodeDisplay(string data)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = data;
    barcode.Width = 300;
    barcode.Height = 100;
    pictureBox1.Image = barcode.GenerateBarcode();
}
Imports Barcode4NET
Imports System.Drawing

Private Sub RefreshBarcodeDisplay(data As String)
    Dim barcode As New Barcode4NET.Barcode()
    barcode.Symbology = Symbology.Code128
    barcode.Data = data
    barcode.Width = 300
    barcode.Height = 100
    pictureBox1.Image = barcode.GenerateBarcode()
End Sub
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;
using System.Drawing;
using System.IO;

private void RefreshBarcodeDisplay(string data)
{
    byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .ToPngBinaryData();

    using var stream = new MemoryStream(pngBytes);
    pictureBox1.Image = Image.FromStream(stream);
}
using IronBarCode;
using System.Drawing;
using System.IO;

private void RefreshBarcodeDisplay(string data)
{
    byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .ToPngBinaryData();

    using var stream = new MemoryStream(pngBytes);
    pictureBox1.Image = Image.FromStream(stream);
}
Imports IronBarCode
Imports System.Drawing
Imports System.IO

Private Sub RefreshBarcodeDisplay(data As String)
    Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
        .ResizeTo(300, 100) _
        .ToPngBinaryData()

    Using stream As New MemoryStream(pngBytes)
        pictureBox1.Image = Image.FromStream(stream)
    End Using
End Sub
$vbLabelText   $csharpLabel

MemoryStream步骤是唯一的结构性补充。 其他所有内容都是从属性设置器模式直接翻译成流畅链。

二维码生成

Barcode4NET 方法:

using Barcode4NET;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.QRCode;
barcode.Data = "https://example.com/product/99";
barcode.Width = 300;
barcode.Height = 300;
Bitmap qrImage = barcode.GenerateBarcode();
qrImage.Save("qr.png", System.Drawing.Imaging.ImageFormat.Png);
using Barcode4NET;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.QRCode;
barcode.Data = "https://example.com/product/99";
barcode.Width = 300;
barcode.Height = 300;
Bitmap qrImage = barcode.GenerateBarcode();
qrImage.Save("qr.png", System.Drawing.Imaging.ImageFormat.Png);
Imports Barcode4NET
Imports System.Drawing.Imaging

Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.QRCode
barcode.Data = "https://example.com/product/99"
barcode.Width = 300
barcode.Height = 300
Dim qrImage As Bitmap = barcode.GenerateBarcode()
qrImage.Save("qr.png", ImageFormat.Png)
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/99", 300)
    .SaveAsPng("qr.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/99", 300)
    .SaveAsPng("qr.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com/product/99", 300) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

IronBarcode为QR码使用专门的QRCodeWriter类,提供了QR特定选项的访问,例如错误纠正级别和品牌徽标嵌入。 QRCodeWriter.CreateQrCode()的第二个参数是方形图像的像素大小。

添加条形码读取功能

Barcode4NET 没有读取 API。 如果您的应用程序处理扫描文档、验证生成的条形码或从 PDF 发票中提取数据,则迁移后即可立即使用此功能,无需添加第二个库。

Barcode4NET 方法:

// 否 reading API available in Barcode4NET.
// Required a separate library (e.g., ZXing.Net) to decode barcodes.
// 否 reading API available in Barcode4NET.
// Required a separate library (e.g., ZXing.Net) to decode barcodes.
' 否 reading API available in Barcode4NET.
' Required a separate library (e.g., ZXing.Net) to decode barcodes.
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

// Read a barcode from an image file
var results = BarcodeReader.Read("scanned-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Symbology: {result.Format}");
}

// Read all barcodes from a PDF — pages are handled automatically
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
using IronBarCode;

// Read a barcode from an image file
var results = BarcodeReader.Read("scanned-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Symbology: {result.Format}");
}

// Read all barcodes from a PDF — pages are handled automatically
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
Imports IronBarCode

' Read a barcode from an image file
Dim results = BarcodeReader.Read("scanned-label.png")
For Each result In results
    Console.WriteLine($"Value: {result.Value}")
    Console.WriteLine($"Symbology: {result.Format}")
Next

' Read all barcodes from a PDF — pages are handled automatically
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
$vbLabelText   $csharpLabel

读取PDF文件不需要额外的库。 BarcodeReader.Read()本地处理图像和PDF输入。 有关读取速度和多条形码检测等配置选项,请参阅条形码读取文档

升级目标框架

一旦Barcode4NET被移除, .NET Framework 的限制也会随之消失。 更新您TargetFramework元素:

Barcode4NET 方法:


<PropertyGroup>
  <TargetFramework>net472</TargetFramework>
</PropertyGroup>

<PropertyGroup>
  <TargetFramework>net472</TargetFramework>
</PropertyGroup>
XML

IronBarcode方法:


<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
</PropertyGroup>

<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
XML

IronBarcode支持.NET Framework 4.6.2 到.NET 9,因此目标框架可以升级到贵组织所针对的任何版本,而没有任何条形码库的限制。

ASP.NET Core控制器 — 返回条形码图像响应

如果您同时也在对 Web Forms 应用程序进行现代化改造,以下是从控制器操作返回条形码图像的ASP.NET Core模式:

Barcode4NET 方法:

//Barcode4NETwas not compatible with ASP.NET Core.
// Web Forms HttpHandler was required for image delivery.
//Barcode4NETwas not compatible with ASP.NET Core.
// Web Forms HttpHandler was required for image delivery.
'Barcode4NET was not compatible with ASP.NET Core.
'Web Forms HttpHandler was required for image delivery.
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcodes")]
public class BarcodesController : ControllerBase
{
    [HttpGet("{data}")]
    public IActionResult Get(string data)
    {
        byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
            .ResizeTo(400, 120)
            .ToPngBinaryData();

        return File(pngBytes, "image/png");
    }
}
using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcodes")]
public class BarcodesController : ControllerBase
{
    [HttpGet("{data}")]
    public IActionResult Get(string data)
    {
        byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
            .ResizeTo(400, 120)
            .ToPngBinaryData();

        return File(pngBytes, "image/png");
    }
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/barcodes")>
Public Class BarcodesController
    Inherits ControllerBase

    <HttpGet("{data}")>
    Public Function [Get](data As String) As IActionResult
        Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
            .ResizeTo(400, 120) _
            .ToPngBinaryData()

        Return File(pngBytes, "image/png")
    End Function
End Class
$vbLabelText   $csharpLabel

File()结果。

Barcode4NETAPI 到IronBarcode映射参考

Barcode4NET IronBarcode
new Barcode4NET.Barcode() BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128 CreateBarcode
barcode.Data = "ITEM-12345" CreateBarcode()的第一个参数
barcode.Width = 300; barcode.Height = 100 .ResizeTo(300, 100)
Bitmap .SaveAsPng(path) / .ToPngBinaryData()
Symbology.QRCode BarcodeEncoding.QRCode
Symbology.Code39 BarcodeEncoding.Code39
Symbology.EAN13 BarcodeEncoding.EAN13
Symbology.UPCA BarcodeEncoding.UPCA
<Reference Include="Barcode4NET"> | <PackageReference Include="IronBarcode" />
.NET Framework only .NET Framework 4.6.2 through .NET 9
仅生成 生成 + 阅读 (BarcodeReader.Read())
不支持 PDF BarcodeReader.Read("doc.pdf")本地

常见迁移问题和解决方案

问题1:没有用于DLL引用的dotnet remove package

Barcode4NET:由于Barcode4NET从来都不是NuGet包,因此没有包管理器命令可以将其删除。 必须从每个<Reference Include="Barcode4NET">元素,并且必须明确地从源控制中删除DLL目录。

解决方法:搜索所有引用该 DLL 的项目文件,然后手动删除相关元素:

grep -rn "Barcode4NET" --include="*.csproj" .
grep -rn "Barcode4NET" --include="*.csproj" .
SHELL

不要将 DLL 引用与新的NuGet引用放在一起——这样做会导致类型解析不明确,从而引发构建错误。

问题 2:返回类型从位图更改为字节数组

Barcode4NET:System.Drawing.Bitmap。 将返回值分配给PictureBox——必须更新。

解决方案:MemoryStream加载字节数组:

byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .ToPngBinaryData();

using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .ToPngBinaryData();

using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
Imports System.IO

Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .ToPngBinaryData()

Using stream As New MemoryStream(pngBytes)
    pictureBox1.Image = Image.FromStream(stream)
End Using
$vbLabelText   $csharpLabel

在整个解决方案中搜索.GenerateBarcode()将定位所有需要更新的调用站点。

问题 3:符号枚举命名空间变更

Barcode4NET:使用Barcode4NET命名空间。

解决方案:替换为BarcodeEncoding枚举值。 所有通用名称均保留——只有类型名称会改变:

// Before
barcode.Symbology = Symbology.Code128;

// After
BarcodeEncoding.Code128  // passed as parameter to CreateBarcode()
// Before
barcode.Symbology = Symbology.Code128;

// After
BarcodeEncoding.Code128  // passed as parameter to CreateBarcode()
' Before
barcode.Symbology = Symbology.Code128

' After
BarcodeEncoding.Code128  ' passed as parameter to CreateBarcode()
$vbLabelText   $csharpLabel

全局查找替换BarcodeEncoding.涵盖了大多数情况。 检查每个替换项以确认其上下文。

问题 4:宽度和高度现在是方法,而不是属性

Barcode4NET:尺寸配置为两个单独的属性赋值:`barcode.Width = 300; barcode.Height = 100;

解决方案:使用.ResizeTo(width, height)链式方法。 这在语法上有很大的不同,简单的查找替换无法捕捉——在条码相关代码中搜索.Height =并更新每个出现:

// Before
barcode.Width = 300;
barcode.Height = 100;

// After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
// Before
barcode.Width = 300;
barcode.Height = 100;

// After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
' Before
barcode.Width = 300
barcode.Height = 100

' After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

Barcode4NET迁移清单

迁移前任务

在开始之前,请先对您的解决方案进行这些搜索。 它们准确地描绘了迁移范围:

# Find allBarcode4NETusages in source files
grep -rn "Barcode4NET" --include="*.cs" .

# Find the using directive
grep -rn "using Barcode4NET" --include="*.cs" .

# Find object creation
grep -rn "new Barcode4NET.Barcode()" --include="*.cs" .

# Find Symbology enum usage
grep -rn "Symbology\." --include="*.cs" .

# Find GenerateBarcode calls
grep -rn "\.GenerateBarcode()" --include="*.cs" .

# Find the DLL reference in project files
grep -rn "Barcode4NET" --include="*.csproj" .

# Find DLL references in build scripts
grep -rn "Barcode4NET" --include="*.yml" .
grep -rn "Barcode4NET" --include="*.yaml" .
grep -rn "ThirdParty/Barcode4NET" .
# Find allBarcode4NETusages in source files
grep -rn "Barcode4NET" --include="*.cs" .

# Find the using directive
grep -rn "using Barcode4NET" --include="*.cs" .

# Find object creation
grep -rn "new Barcode4NET.Barcode()" --include="*.cs" .

# Find Symbology enum usage
grep -rn "Symbology\." --include="*.cs" .

# Find GenerateBarcode calls
grep -rn "\.GenerateBarcode()" --include="*.cs" .

# Find the DLL reference in project files
grep -rn "Barcode4NET" --include="*.csproj" .

# Find DLL references in build scripts
grep -rn "Barcode4NET" --include="*.yml" .
grep -rn "Barcode4NET" --include="*.yaml" .
grep -rn "ThirdParty/Barcode4NET" .
SHELL

请注意每种模式的文件数量。 记录基于坐标的绘图代码、字体使用模式以及复制 DLL 的任何构建脚本步骤。

代码更新任务

  1. 从源控制中删除ThirdParty/Barcode4NET/ (git rm -r)
  2. 从所有<Reference Include="Barcode4NET">
  3. 从构建脚本和 CI/CD 流水线文件中移除手动复制 DLL 的步骤
  4. 为解决方案中的每个项目运行dotnet add package IronBarcode
  5. 在应用程序启动时添加IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
  6. 在所有using Barcode4NET;
  7. new Barcode4NET.Barcode()
  8. 在整个过程中用Symbology.X
  9. 替换 barcode.Width = N; barcode.Height = M; with .ResizeTo(N, M)
  10. .ToPngBinaryData()
  11. 更新MemoryStream模式
  12. 如果从TargetFramework
  13. 运行完整构建并修复所有剩余的编译错误

迁移后测试

  • 将条形码图像输出与已知合格样品进行比较,以确认外观
  • 验证条码扫描器硬件能否读取所有受影响条码体系生成的条码
  • 测试BarcodeEncoding值匹配Code128、Code39、EAN-13、UPC-A和QR码的预期输出
  • 验证用于WinForms控件的MemoryStream模式正常显示
  • 确认CI/CD管道仅使用dotnet restore成功完成,不需要手动DLL步骤
  • BarcodeReader.Read()作为迁移的一部分被添加,测试条码读取功能

迁移到IronBarcode的主要优势

恢复为新团队成员颁发许可证的功能: IronBarcode是一款活跃的商业产品,提供永久许可证,价格已确定。 新加入的开发人员、承包商和团队成员可以立即获得许可。 开发人员加入公司后无法合法开发与条形码相关的代码的情况已不复存在。

标准NuGet依赖管理:迁移后,dotnet restore处理所有内容。 新开发人员克隆存储库、恢复软件包并进行构建,而无需了解 DLL 位置、工件存储或手动复制过程。Barcode4NET的 DLL 分发在每个 CI/CD 管道和入职工作流程中造成的摩擦得以消除。

完全.NET版本自由:移除Barcode4NET限制,即可畅通无阻地推进.NET现代化项目。 目标框架可以升级到.NET 8、 .NET 9 或未来版本,而不会受到条形码库的任何限制。 Linux 部署、Docker 容器化和云无服务器运行时都已可用。

无需第二个库的条码读取:BarcodeReader.Read()本地解码图像和PDF中的条码。 以前使用Barcode4NET生成代码,并使用 ZXing .NET或其他库读取代码的团队,现在可以合并为一个维护良好的依赖项。 PDF条形码读取不需要额外的PDF库。

安全与合规状况: IronBarcode定期收到安全补丁,并根据最新的 CVE 数据库进行跟踪。 软件物料清单审核将不再把Barcode4NET列为已停止服务的商业依赖项,且供应商不会采取任何应对措施。Barcode4NET在安全审计中发现的补救措施会在迁移完成后立即得到解决。

积极的开发节奏: IronBarcode会定期发布更新,与新的.NET版本保持一致。 未来.NET版本的兼容性更新通过包交付,因此当供应商沉默时,库不会冻结在原有状态。

常见问题解答

我为什么要从 Barcode4.NET 迁移到 IronBarcode?

常见原因包括简化许可(消除 SDK + 运行时密钥的复杂性)、消除吞吐量限制、获得原生 PDF 支持、改进 Docker/CI/CD 部署以及减少生产代码中的 API 样板代码。

如何用 IronBarcode 替换 Barcode4.NET API 调用?

用 `IronBarCode.License.LicenseKey = "key"` 替换实例创建和许可相关的样板代码。用 `BarcodeReader.Read(path)` 替换读取器调用,用 `BarcodeWriter.CreateBarcode(data, encoding)` 替换写入器调用。静态方法无需实例管理。

从 Barcode4.NET 迁移到 IronBarcode 时,代码需要做多少更改?

大多数迁移都能减少代码行数。许可样板代码、实例构造函数和显式格式配置都被移除。核心读/写操作映射到更简洁的 IronBarcode 等效代码,并生成更清晰的结果对象。

迁移过程中是否需要同时安装 Barcode4.NET 和 IronBarcode?

不。大多数迁移都是直接替换,而不是并行操作。一次迁移一个服务类,替换 NuGet 引用,并更新实例化和 API 调用模式,然后再迁移下一个类。

IronBarcode 的 NuGet 包名称是什么?

该软件包名为“IronBarCode”(B 和 C 大写)。使用“Install-Package IronBarCode”或“dotnet add package IronBarCode”进行安装。代码中的 using 指令为“using IronBarCode;”。

与 Barcode4.NET 相比,IronBarcode 如何简化 Docker 部署?

IronBarcode 是一个 NuGet 包,不包含任何外部 SDK 文件或已挂载的许可证配置。在 Docker 环境中,设置 IRONBARCODE_LICENSE_KEY 环境变量后,该包会在启动时自动处理许可证验证。

从 Barcode4.NET 迁移后,IronBarcode 是否能自动检测所有条形码格式?

是的。IronBarcode 可以自动检测所有支持格式的条码符号,无需显式枚举 BarcodeTypes。如果已知条码格式且性能至关重要,BarcodeReaderOptions 允许缩小搜索范围以进行优化。

IronBarcode 能否在不使用单独库的情况下读取 PDF 中的条形码?

是的。`BarcodeReader.Read("document.pdf")` 可以直接处理 PDF 文件。结果包括每个条形码的页码、格式、值和置信度。无需外部 PDF 渲染步骤。

IronBarcode如何处理并行条码处理?

IronBarcode 的静态方法是无状态且线程安全的。可以直接对文件列表使用 Parallel.ForEach,无需进行线程级实例管理。BarcodeReaderOptions.MaxParallelThreads 控制内部线程预算。

从 Barcode4.NET 迁移到 IronBarcode 时,哪些结果属性会发生变化?

常见重命名:BarcodeValue 变为 Value,BarcodeType 变为 Format。IronBarcode 结果还会添加 Confidence 和 PageNumber。解决方案范围内的查找替换功能会处理现有结果处理代码中的重命名。

如何在 CI/CD 流水线中设置 IronBarcode 许可?

将 IRONBARCODE_LICENSE_KEY 存储为管道密钥,并在应用程序启动代码中赋值 IronBarCode.License.LicenseKey。一个密钥即可覆盖所有环境,包括开发、测试、预发布和生产环境。

IronBarcode是否支持生成自定义样式的二维码?

是的。QRCodeWriter.CreateQrCode() 支持通过 ChangeBarCodeColor() 自定义颜色、通过 AddBrandLogo() 嵌入徽标、可配置纠错级别以及多种输出格式,包括 PNG、JPG、PDF 和流媒体。

Curtis Chau
技术作家

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

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我