Ir para o conteúdo do rodapé
VíDEOS

Como criar códigos de barras como fluxos em C# usando IronBarcode

Migrando doBarcode4NETpara IronBarcode

Este guia de migração aborda a remoção da dependência doBarcode4NETe sua substituição pelo IronBarcode, com instruções passo a passo, comparações de código e exemplos práticos para desenvolvedores .NET que estão realizando essa transição. OBarcode4NETchegou ao fim de sua vida útil sem um anúncio formal — novas licenças deixaram de ser vendidas, nenhum pacote NuGet foi publicado e a biblioteca funciona exclusivamente no .NET Framework. Este guia é prático e específico: ele aborda a remoção da referência à DLL, a instalação do IronBarcode via NuGet e a conversão do código de geração. Abrange também as funcionalidades de leitura e PDF que se tornam disponíveis após a migração, as quais não estavam disponíveis no Barcode4NET.

Por que migrar do Barcode4NET?

As equipes que migraram doBarcode4NETrelatam os seguintes gatilhos consistentes:

Não há novas licenças disponíveis: as licenças doBarcode4NETnão são mais vendidas pela ComponentSource nem por nenhum outro canal. Se um desenvolvedor se juntar a uma equipe que utiliza o Barcode4NET, não há nenhum mecanismo para comprar uma licença para ele. Um contratado que se junta ao projeto ou um segundo desenvolvedor que precisa trabalhar em recursos de código de barras não pode ser legalmente licenciado sob os termos originais do produto.

Sem pacote NuGet : Isso não é um mero inconveniente — é uma incompatibilidade fundamental com os fluxos de trabalho modernos do .NET . Todo desenvolvedor que clonar o repositório precisa saber onde o arquivo DLL está localizado. Os pipelines de CI/CD devem ser configurados manualmente para localizá-lo. O comando dotnet restore não faz nada para resolvê-lo. A DLL é incluída no sistema de controle de versão ou mantida em um repositório de artefatos privado, ambos exigindo manutenção manual contínua.

Sem suporte para .NET 5, 6, 7, 8 ou 9: oBarcode4NETé compatível exclusivamente com o .NET Framework . Quando uma organização atualiza seu framework alvo para net8.0, a compilação falha porque a biblioteca foi compilada contra assemblies do .NET Framework que não são mais referenciados. Não haverá nenhuma atualização. Se a equipe precisar migrar para o .NET moderno para melhorar o desempenho, para implantação em Linux ou Docker, ou para obter suporte da Microsoft a longo prazo, oBarcode4NETrepresenta um obstáculo intransponível.

Sem atualizações de segurança: a biblioteca está congelada no estado em que se encontrava quando o desenvolvimento foi interrompido. Quaisquer problemas de segurança descobertos desde então permanecem sem solução permanente. Não existe um sistema de rastreamento de problemas, nenhum responsável pela manutenção para contatar e nenhum processo de resposta do fornecedor.

Sem correções de bugs: Se um problema de renderização surgir com uma variante específica de simbologia ou em um caso extremo nas dimensões do código de barras, não há solução possível. A biblioteca não será atualizada.

O problema fundamental

O momento de descoberta mais comum é quando um desenvolvedor está atualizando a estrutura de destino durante um projeto de modernização do .NET . A compilação falha porque a DLL doBarcode4NETfoi compilada usando assemblies do .NET Framework que não estão mais disponíveis no novo destino. O problema não é a API de geração em si, mas sim a dependência subjacente que não consegue avançar.

//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 vs Barcode4NET: Comparação de Recursos

Recurso Barcode4NET IronBarcode
Pacote NuGet Não — somente DLL manual Sim (IronBarcode)
Suporte ao .NET Framework Sim (somente para .NET Framework ) Sim (.NET Framework 4.6.2 ou superior)
Suporte para .NET Core / .NET 5+ Não Sim (.NET 5, 6, 7, 8, 9)
Suporte para Linux/MacOS Não Sim
Suporte a Docker Não Sim
Azure / AWS Lambda Não Sim
Geração de código de barras Sim Sim
Leitura/escaneamento de código de barras Não Sim (BarcodeReader.Read())
Leitura de código de barras em PDF Não Sim (nativo, sem biblioteca extra)
Código QR com logotipo Não Sim (AddBrandLogo())
API encadeável fluente Não Sim
Manutenção ativa Não (fim de vida) Sim
Novas licenças disponíveis Não Sim — Lite $749, Plus $1,499, Pro $2,999, Unlimited $5,999
atualizações de segurança Não Sim
integração de pipeline CI/CD Etapas manuais para copiar DLLs Padrão dotnet restore

Guia rápido: Migração doBarcode4NETpara o IronBarcode

A migração pode começar imediatamente com esses passos fundamentais.

Passo 1: Substitua o pacote NuGet

Barcode4NET nunca foi distribuído como um pacote NuGet, então não há comando dotnet remove package. Remova-o manualmente.

Exclua a DLL do controle de versão e prepare a exclusão:

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

Remova o elemento <Reference> de cada arquivo .csproj. Pesquise em toda a solução para encontrar todos os arquivos que precisam ser atualizados:

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

Remova este elemento de cada arquivo .csproj que o contenha:

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

Em seguida, instale o IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Esse único comando adiciona o IronBarcode e resolve todas as dependências. Sem gerenciamento de DLLs, sem armazenamento de artefatos, sem etapas manuais de cópia.

Etapa 2: Atualizar Namespaces

Substitua a antiga diretiva using no topo de cada arquivo que usava Barcode4NET:

// Before
using Barcode4NET;

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

// After
using IronBarCode;
Imports Barcode4NET

' After
Imports IronBarCode
$vbLabelText   $csharpLabel

Etapa 3: Inicializar a licença

Adicione a inicialização da licença no início da aplicação — em Program.cs, Startup.cs, ou onde quer que sua aplicação inicie:

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

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

Exemplos de migração de código

Geração básica de rótulos

O padrãoBarcode4NETmais comum: crie um objeto, defina propriedades, chame GenerateBarcode() para receber um Bitmap, em seguida, salve-o.

Abordagem 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

Abordagem do 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

O bloco de configuração de propriedades se condensa em uma única cadeia fluente. A chamada .ResizeTo() substitui as atribuições de propriedade Width e Height. .SaveAsPng() substitui tanto GenerateBarcode() quanto a chamada barcodeImage.Save() separadamente. Para opções de geração adicionais, consulte a documentação de geração de código de barras do IronBarcode .

Exibição PictureBox do WinForms

Se seu códigoBarcode4NETatribuía o valor de retorno Bitmap diretamente a um PictureBox ou controle similar, você carregará um array de bytes através de um MemoryStream em vez disso.

Abordagem 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

Abordagem do 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

A etapa MemoryStream é a única adição estrutural. Todo o resto é uma tradução direta do padrão de configuração de propriedades para a cadeia fluente.

Geração de código QR

Abordagem 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

Abordagem do 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

O IronBarcode utiliza uma classe QRCodeWriter dedicada para códigos QR, que dá acesso a opções específicas de QR, como nível de correção de erros e incorporação de logotipo de marca. O segundo parâmetro para QRCodeWriter.CreateQrCode() é o tamanho em pixels da imagem quadrada.

Adicionando leitura de código de barras

OBarcode4NETnão possuía uma API de leitura. Se o seu aplicativo processa documentos digitalizados, verifica códigos de barras gerados ou extrai dados de faturas em PDF, essa funcionalidade estará disponível imediatamente após a migração, sem a necessidade de adicionar uma segunda biblioteca.

Abordagem Barcode4NET:

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

Abordagem do 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

A leitura de PDFs não requer nenhuma biblioteca adicional. BarcodeReader.Read() lida com entradas de imagens e PDFs de forma nativa. Consulte a documentação de leitura de código de barras para obter opções de configuração, incluindo velocidade de leitura e detecção de múltiplos códigos de barras.

Atualizando a estrutura de destino

Assim que oBarcode4NETfor removido, a restrição do .NET Framework desaparecerá com ele. Atualize o elemento TargetFramework no seu .csproj:

Abordagem Barcode4NET:


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

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

Abordagem do IronBarcode:


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

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

O IronBarcode é compatível com o .NET Framework 4.6.2 até o .NET 9, portanto, a estrutura de destino pode ser atualizada para qualquer versão que sua organização utilize, sem restrições quanto à biblioteca de código de barras.

Controlador ASP.NET Core — Retornando código de barras como resposta de imagem

Se você estiver modernizando um aplicativo Web Forms ao mesmo tempo, aqui está o padrão ASP.NET Core para retornar uma imagem de código de barras de uma ação do controlador:

Abordagem 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

Abordagem do 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

.ToPngBinaryData() retorna um byte[] diretamente, que se encaixa no resultado File() sem qualquer conversão intermediária.

Referência de mapeamento da APIBarcode4NETpara IronBarcode

Barcode4NET IronBarcode
new Barcode4NET.Barcode() BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128 BarcodeEncoding.Code128 (parâmetro para CreateBarcode)
barcode.Data = "ITEM-12345" Primeiro parâmetro de CreateBarcode()
barcode.Width = 300; barcode.Altura = 100 .ResizeTo(300, 100)
barcode.GenerateBarcode() retorna 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
Somente geração Geração + leitura (BarcodeReader.Read())
Sem suporte para PDF BarcodeReader.Read("doc.pdf") nativo

Problemas e soluções comuns em migrações

Problema 1: Nenhum dotnet remove package para Referências DLL

Barcode4NET: Como oBarcode4NETnunca foi um pacote NuGet , não existe um comando do gerenciador de pacotes para removê-lo. O elemento <Reference Include="Barcode4NET"> deve ser removido de cada arquivo .csproj manualmente, e o diretório DLL deve ser excluído do controle de origem explicitamente.

Solução: Execute uma busca para localizar todos os arquivos de projeto que fazem referência à DLL e, em seguida, remova os elementos manualmente:

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

Não deixe a referência à DLL junto com a nova referência ao NuGet — isso causa erros de compilação devido à resolução de tipos ambíguos.

Problema 2: Alteração do tipo de retorno de Bitmap para matriz de bytes

Barcode4NET: GenerateBarcode() returns System.Drawing.Bitmap. O código que atribui o valor de retorno a uma variável do tipo Bitmap ou o passa para qualquer método que espera um Bitmap — como um PictureBox — deve ser atualizado.

Solução: Substitua atribuições .GenerateBarcode() por .ToPngBinaryData() e carregue o array de bytes através de um MemoryStream no local da chamada:

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

Procurar por .GenerateBarcode() em toda a solução localizará todos os locais de chamada que precisam de atualização.

Problema 3: Alteração do Namespace de Enum de Simbologia

Barcode4NET: Utiliza Symbology.Code128, Symbology.QRCode, Symbology.Code39 e valores similares do namespace Barcode4NET.

Solução: Substitua por valores enum BarcodeEncoding. Todos os nomes comuns são mantidos — apenas o nome da espécie muda:

// 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

Uma busca e substituição em toda a solução de Symbology. por BarcodeEncoding. cobre a maioria dos casos. Analise cada substituição para confirmar o contexto.

Problema 4: Largura e altura agora são um método, não propriedades.

Barcode4NET: O tamanho foi configurado como duas atribuições de propriedade separadas:`barcode.Width = 300; barcode.Height = 100;

Solução: Use o método encadeado .ResizeTo(width, height). Isso é sintaticamente diferente o suficiente para que uma simples busca e substituição não o pegue — procure por .Width = e .Height = no código relacionado a códigos de barras e atualize cada ocorrência:

// 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

Lista de verificação para migração do Barcode4NET

Tarefas pré-migração

Execute essas buscas em toda a sua solução antes de começar. Eles fornecem um retrato preciso do alcance da migração:

# 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

Observe a quantidade de arquivos para cada padrão. Documente o código de desenho baseado em coordenadas, os padrões de uso de fontes e quaisquer etapas do script de compilação que copiem a DLL.

Tarefas de atualização de código

  1. Exclua ThirdParty/Barcode4NET/ do controle de origem (git rm -r)
  2. Remova <Reference Include="Barcode4NET"> de todos os arquivos .csproj
  3. Remova as etapas manuais de cópia de DLLs dos scripts de compilação e dos arquivos do pipeline de CI/CD.
  4. Execute dotnet add package IronBarcode para cada projeto na solução
  5. Adicione IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; ao início da aplicação
  6. Substitua using Barcode4NET; por using IronBarCode; em todos os arquivos .cs
  7. Substitua blocos new Barcode4NET.Barcode() por chamadas BarcodeWriter.CreateBarcode()
  8. Substitua Symbology.X por BarcodeEncoding.X por toda parte
  9. Substitua barcode.Width = N; barcode.Height = M; with .ResizeTo(N, M)
  10. Substitua atribuições .GenerateBarcode() por .SaveAsPng() ou .ToPngBinaryData()
  11. Atualize PictureBox ou outras atribuições de controle de imagem para usar o padrão MemoryStream
  12. Atualize TargetFramework nos arquivos .csproj se estiver atualizando de net4xx
  13. Execute a compilação completa e corrija quaisquer erros de compilação restantes.

Testes pós-migração

  • Compare a saída visual do código de barras com amostras reconhecidamente boas para confirmar a aparência.
  • Verificar se o hardware do leitor de código de barras consegue ler os códigos de barras gerados a partir de todas as simbologias afetadas.
  • Teste se os valores BarcodeEncoding correspondem à saída esperada para Code128, Code39, EAN-13, UPC-A e QR Code
  • Verifique se o padrão MemoryStream é exibido corretamente nos controles WinForms onde aplicável
  • Confirme se o pipeline CI/CD é concluído com sucesso usando apenas dotnet restore sem etapas DLL manuais
  • Teste a funcionalidade de leitura de códigos de barras se BarcodeReader.Read() foi adicionado como parte da migração

Principais benefícios da migração para o IronBarcode

Capacidade restaurada de licenciar novos membros da equipe: o IronBarcode é um produto comercial ativo com licenças perpétuas disponíveis a preços definidos. Novos desenvolvedores, empreiteiros e membros da equipe podem ser licenciados imediatamente. A situação em que um desenvolvedor entra na empresa e não pode legalmente trabalhar em código relacionado a código de barras deixa de existir.

Gerenciamento padrão de dependências NuGet: Após a migração, dotnet restore lida com tudo. Os novos desenvolvedores clonam o repositório, restauram os pacotes e compilam sem qualquer conhecimento sobre a localização das DLLs, os repositórios de artefatos ou os procedimentos manuais de cópia. A fricção que a distribuição de DLLs doBarcode4NETcriava em cada pipeline de CI/CD e fluxo de trabalho de integração é eliminada.

Liberdade total de versão do .NET : a remoção da restrição doBarcode4NETdesbloqueia projetos de modernização do .NET . A estrutura de destino pode ser atualizada para .NET 8, .NET 9 ou versões futuras sem qualquer limitação da biblioteca de código de barras. A implantação do Linux, a conteinerização com Docker e os ambientes de execução sem servidor na nuvem tornam-se disponíveis.

Leitura de Códigos de Barras Sem uma Segunda Biblioteca: BarcodeReader.Read() decodifica códigos de barras de imagens e PDFs de forma nativa. As equipes que anteriormente combinavam oBarcode4NETpara geração com o ZXing .NET ou outra biblioteca para leitura podem consolidar tudo em uma única dependência com suporte contínuo. A leitura de códigos de barras em PDF não requer nenhuma biblioteca PDF adicional.

Postura de Segurança e Conformidade: A IronBarcode recebe atualizações de segurança regularmente e é monitorada em relação aos bancos de dados CVE mais recentes. As auditorias de listas de materiais de software não identificarão mais oBarcode4NETcomo uma dependência comercial em fim de vida útil, sem um processo de resposta do fornecedor. A constatação de correção que aBarcode4NETcria em auditorias de segurança é resolvida assim que a migração é concluída.

Ritmo de desenvolvimento ativo: o IronBarcode lança atualizações regulares alinhadas com os novos lançamentos do .NET . Atualizações de compatibilidade para futuras versões do .NET são entregues através do pacote, para que a biblioteca não fique congelada no estado em que estava quando um fornecedor se calou.

Perguntas frequentes

Por que devo migrar do Barcode4.NET para o IronBarcode?

Entre os motivos comuns estão a simplificação do licenciamento (removendo a complexidade do SDK e da chave de tempo de execução), a eliminação dos limites de taxa de transferência, a obtenção de suporte nativo para PDF, a melhoria da implantação em Docker/CI/CD e a redução do código repetitivo da API em produção.

Como faço para substituir as chamadas da API Barcode4.NET pelo IronBarcode?

Substitua o código padrão de criação de instâncias e licenciamento por `IronBarCode.License.LicenseKey = "key"`. Substitua as chamadas de leitura por `BarcodeReader.Read(path)` e as chamadas de gravação por `BarcodeWriter.CreateBarcode(data, encoding)`. Os métodos estáticos não exigem gerenciamento de instâncias.

Quanta alteração de código ocorre ao migrar do Barcode4.NET para o IronBarcode?

A maioria das migrações resulta em menos linhas de código. O código repetitivo de licenciamento, os construtores de instância e a configuração explícita de formato são removidos. As operações principais de leitura/gravação são mapeadas para equivalentes mais curtos em IronBarcode, com objetos de resultado mais limpos.

Preciso manter o Barcode4.NET e o IronBarcode instalados durante a migração?

Não. A maioria das migrações são substituições diretas, e não operações paralelas. Migre uma classe de serviço por vez, substitua a referência do NuGet e atualize os padrões de instanciação e chamada de API antes de passar para a próxima classe.

Qual é o nome do pacote NuGet para IronBarcode?

O pacote é 'IronBarCode' (com B e C maiúsculos). Instale-o com 'Install-Package IronBarCode' ou 'dotnet add package IronBarCode'. A diretiva using no código é 'using IronBarCode;'.

Como o IronBarcode simplifica a implantação do Docker em comparação com o Barcode4.NET?

IronBarcode é um pacote NuGet sem arquivos SDK externos ou configuração de licença montada. No Docker, defina a variável de ambiente IRONBARCODE_LICENSE_KEY e o pacote cuidará da validação da licença na inicialização.

O IronBarcode detecta automaticamente todos os formatos de código de barras após a migração do Barcode4.NET?

Sim. O IronBarcode detecta automaticamente a simbologia em todos os formatos suportados. A enumeração explícita de BarcodeTypes não é necessária. Se o formato já for conhecido e o desempenho for importante, o BarcodeReaderOptions permite restringir o espaço de busca como uma otimização.

O IronBarcode consegue ler códigos de barras de PDFs sem uma biblioteca separada?

Sim. O método `BarcodeReader.Read("document.pdf")` processa arquivos PDF nativamente. Os resultados incluem o número da página, o formato, o valor e a confiança de cada código de barras encontrado. Não é necessária nenhuma etapa externa de renderização de PDF.

Como o IronBarcode lida com o processamento paralelo de códigos de barras?

Os métodos estáticos do IronBarcode são sem estado e thread-safe. Use Parallel.ForEach diretamente em listas de arquivos sem gerenciamento de instâncias por thread. BarcodeReaderOptions.MaxParallelThreads controla o orçamento interno de threads.

Quais propriedades de resultado são alteradas ao migrar do Barcode4.NET para o IronBarcode?

Renomeações comuns: BarcodeValue torna-se Value, BarcodeType torna-se Format. Os resultados do IronBarcode também incluem Confidence e PageNumber. Uma função de busca e substituição em toda a solução lida com as renomeações no código de processamento de resultados existente.

Como configuro o licenciamento do IronBarcode em um pipeline de CI/CD?

Armazene IRONBARCODE_LICENSE_KEY como um segredo de pipeline e atribua IronBarCode.License.LicenseKey no código de inicialização do aplicativo. Um único segredo abrange todos os ambientes, incluindo desenvolvimento, teste, homologação e produção.

O IronBarcode suporta a geração de códigos QR com estilos personalizados?

Sim. O método QRCodeWriter.CreateQrCode() suporta cores personalizadas através do método ChangeBarCodeColor(), incorporação de logotipo através do método AddBrandLogo(), níveis configuráveis de correção de erros e múltiplos formatos de saída, incluindo PNG, JPG, PDF e fluxo de dados.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de Suporte Iron

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim