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)
//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)
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/
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" .
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>
Em seguida, instale o IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
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
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"
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
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
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
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
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)
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")
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.
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
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>
Abordagem do IronBarcode:
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
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.
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
.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" .
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
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()
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)
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" .
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
- Exclua
ThirdParty/Barcode4NET/do controle de origem (git rm -r) - Remova
<Reference Include="Barcode4NET">de todos os arquivos.csproj - Remova as etapas manuais de cópia de DLLs dos scripts de compilação e dos arquivos do pipeline de CI/CD.
- Execute
dotnet add package IronBarcodepara cada projeto na solução - Adicione
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";ao início da aplicação - Substitua
using Barcode4NET;porusing IronBarCode;em todos os arquivos.cs - Substitua blocos
new Barcode4NET.Barcode()por chamadasBarcodeWriter.CreateBarcode() - Substitua
Symbology.XporBarcodeEncoding.Xpor toda parte - Substitua
barcode.Width = N; barcode.Height = M;with.ResizeTo(N, M) - Substitua atribuições
.GenerateBarcode()por.SaveAsPng()ou.ToPngBinaryData() - Atualize
PictureBoxou outras atribuições de controle de imagem para usar o padrãoMemoryStream - Atualize
TargetFrameworknos arquivos.csprojse estiver atualizando denet4xx - 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
BarcodeEncodingcorrespondem à 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 restoresem 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.

