Accusoft BarcodeXpress vs IronBarcode: Comparação de bibliotecas de código de barras em C#
Biblioteca de código de barras vs IronBarcode: Onde o Gerador de Código Aberto Para
BarcodeLib é uma biblioteca .NET de código aberto que a maioria dos desenvolvedores acabam descobrindo que só pode criar códigos de barras. Uma parte deles também descobre o conflito de versão do SkiaSharp — geralmente no pior momento possível, quando acabaram de adicionar Biblioteca de código de barras a um projeto MAUI ou Blazor que já depende do SkiaSharp, e a compilação começa a lançar avisos NU1608. Este artigo cobre ambos os problemas. Biblioteca de código de barras é uma biblioteca legítima com um caso de uso claro. Entender onde isso termina é a questão prática.
Entendendo o BarcodeLib
BarcodeLib é uma biblioteca de código aberto para geração de imagens de código de barras para .NET, mantida no GitHub por Brad Barnhill. Está ativo desde 2007 e suporta cerca de 30 variantes de simbologia 1D. A licença Apache 2.0 permite seu uso comercial gratuito. Para geração pura de códigos de barras lineares — criando uma imagem a partir de uma string — funciona de forma confiável e tem servido bem a esse propósito ao longo de muitos anos de uso ativo.
A API é baseada em instâncias. Você cria um objeto Barcode, define as propriedades e chama Encode() com uma constante de tipo, uma string de dados e dimensões de pixel. O resultado é um SKImage (SkiaSharp) que você então codifica e salva ou transmite conforme necessário. Este fluxo de trabalho é acessível, e para projetos onde o requisito é estritamente imprimir imagens de códigos de barras lineares — etiquetas de envio, etiquetas de inventário, etiquetas de preço de varejo — é suficiente.
Principais características arquitetônicas do BarcodeLib:
- Escopo somente de geração: A biblioteca não possui nenhuma API de leitura ou decodificação de qualquer tipo; Toda a sua superfície pública está voltada para a produção de imagens a partir de sequências de dados.
- API baseada em instância: Cada operação requer a instanciação de um objeto
Barcodee a configuração das propriedades de etiqueta e fonte antes de chamarEncode() - Retorna
SKImage: A saída é um objeto de imagem SkiaSharp, que requer um passoSKEncodedImageFormate um fluxo para produzir um arquivo ou matriz de bytes - Simbologias somente 1D: Suporta cerca de 30 formatos lineares incluindo Code128, EAN-13, UPC-A e Code39; o enum
BarcodeStandard.Typena fonte 3.x atual não contém QR Code, Data Matrix, PDF417, Aztec ou outras entradas 2D - Dependência de SkiaSharp (v3.x): A série 3.x substituiu
System.Drawing.Commonpor SkiaSharp para habilitar o suporte multiplataforma; Isso introduz o risco de conflito de versões quando outros pacotes no projeto também dependem do SkiaSharp. - Gratuito, sem necessidade de chave de licença: a licença Apache 2.0 cobre o uso comercial sem necessidade de chave de execução ou ativação.
Padrão de geração do núcleo do BarcodeLib
O fluxo de trabalho padrão de geração do Biblioteca de código de barras requer criar uma instância, configurar propriedades e chamar Encode() com dimensões:
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
Imports BarcodeStandard
Imports SkiaSharp
Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)
Using stream = File.OpenWrite("barcode.png")
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
Este é o fluxo de trabalho completo de geração. O padrão setter de propriedades é o design: a configuração acontece na instância antes da chamada Encode(), e o valor de retorno é um SKImage que deve ser codificado e escrito em um fluxo.
Entendendo o IronBarcode
IronBarcode é uma biblioteca comercial .NET para códigos de barras que abrange tanto a geração quanto a leitura em um único pacote. Ele é instalado via NuGet, funciona no .NET Framework 4.6.2 até o .NET 9 e opera em Windows, Linux, macOS, Docker, Azure e AWS Lambda. A biblioteca é desenvolvida e mantida pela Iron Software com um modelo de suporte comercial.
A API de geração é estática e fluida — não há instância para criar, nem propriedades para definir antes da chamada principal. As opções de configuração encadeiam no resultado de BarcodeWriter.CreateBarcode() ou QRCodeWriter.CreateQrCode(). Os métodos de saída no final do encadeamento — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — eliminam o padrão intermediário MemoryStream que o Biblioteca de código de barras requer. A leitura faz parte do mesmo pacote, sem necessidade de biblioteca separada ou integração com o ZXing .NET para manter.
Principais características do IronBarcode:
- Geração e leitura em um pacote:
BarcodeWriterlida com geração;BarcodeReaderlida com leitura; ambos são distribuídos na mesma instalação do NuGet. - API fluente estática: Não requer instanciação; cadeias de configuração após
CreateBarcode()usando métodos fluentes - Saída direta de matriz de bytes:
.ToPngBinaryData()retornabyte[]sem um passoMemoryStream - Suporte a PDF em ambas as extremidades:
BarcodeReader.Read()aceita arquivos PDF nativamente; Os resultados da geração podem ser incorporados em PDFs. - Sem dependência do SkiaSharp: Independente do gráfico de versões do SkiaSharp, eliminando conflitos com o NU1608 no MAUI e em outros projetos.
- Licença comercial com SLA: Preço entre US$ 749 e US$ 5.999 (licença perpétua); Inclui suporte comercial e garantia de atualização regular.
ReadingSpeedafinamento:BarcodeReaderOptionspermite trocar minuciosidade da varredura por desempenho em volume
Comparação de recursos
| Recurso | Biblioteca de código de barras | IronBarcode |
|---|---|---|
| Geração de código de barras | Sim (apenas 1D) | Sim (1D e 2D) |
| Leitura de código de barras | Não | Sim |
| 2D symbologies (QR, Data Matrix, PDF417, Aztec) | Não | Sim |
| Leitura de código de barras em PDF | Não | Sim |
| Dependência SkiaSharp no gráfico | Sim (v3.x) | Não |
| API encadeável fluente | Não | Sim |
| Licença | Apache 2.0 (gratuito) | $749–$5.999 perpétuo |
Comparação Detalhada de Recursos
| Recurso | Biblioteca de código de barras | IronBarcode |
|---|---|---|
| Geração | ||
| Geração Code128 | Sim | Sim |
| Geração EAN-13 / UPC-A | Sim | Sim |
| Geração de código QR | Não | Sim (com incorporação de logotipo) |
| Data Matrix / PDF417 / Asteca | Não | Sim |
| Cobertura de simbologia 1D | ~30 variantes | 30+ variantes |
| API de geração encadeável fluente | Não | Sim |
Saída direta byte[] |
Manual (codificar fluxo) | .ToPngBinaryData() |
| Saída da geração de PDF | Não | Sim |
| Leitura | ||
| Leitura de código de barras a partir de imagem | Não | Sim (BarcodeReader.Read()) |
| Leitura de código de barras a partir de PDF | Não | Sim (nativo, sem biblioteca extra) |
| Detecção de múltiplos códigos de barras | Não | Sim (ExpectMultipleBarcodes) |
| Ajuste da velocidade de leitura | N / D | Sim (ReadingSpeed enum) |
| Plataforma | ||
| Windows | Sim | Sim |
| Linux / macOS | Parcial (dependente de SkiaSharp) | Completo |
| Docker / contêiner | Configuração necessária | Sim |
| Compatibilidade do projeto MAUI | Risco de conflito (NU1608) | Sem conflito |
| .NET Framework 4.6.2+ | Sim | Sim |
| .NET 6–9 | Sim (requer SkiaSharp 3.x) | Sim |
| Licenciamento | ||
| Código aberto / gratuito | Sim (Apache 2.0) | Não |
| Suporte comercial / SLA | Não | Sim |
| É necessária uma chave de licença. | Não | Sim |
| Preços | Livre | $749–$5.999 perpétuo |
API de geração de código de barras
As APIs de geração representam filosofias de design diferentes: Biblioteca de código de barras usa configuração de instância mutável enquanto IronBarcode usa uma cadeia fluente em um ponto de entrada estático.
Abordagem BarcodeLib
BarcodeLib requer construir uma instância e definir propriedades antes de chamar Encode() com dimensões. A saída é um SKImage:
using BarcodeStandard;
using SkiaSharp;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
using BarcodeStandard;
using SkiaSharp;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
Imports BarcodeStandard
Imports SkiaSharp
Public Function GenerateCode128(data As String) As Byte()
Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return ms.ToArray()
End Using
End Function
O tipo de retorno SKImage significa que a saída de matriz de bytes requer uma chamada de codificação SKEncodedImageFormat e um MemoryStream. A propriedade IncludeLabel é uma alternância booleana — Biblioteca de código de barras renderiza a string de dados codificada como a etiqueta visível sob as barras.
Abordagem do IronBarcode
A geração do IronBarcode é totalmente estática. Cadeias de configuração após CreateBarcode(), e métodos de saída terminam a cadeia diretamente:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.ToPngBinaryData();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.ToPngBinaryData();
}
Imports IronBarCode
Public Function GenerateCode128(data As String) As Byte()
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.AddBarcodeValueTextBelowBarcode() _
.ToPngBinaryData()
End Function
.ToPngBinaryData() retorna a matriz de bytes diretamente — sem objeto intermediário Image ou MemoryStream. .AddBarcodeValueTextBelowBarcode() renderiza a string de dados codificada como uma etiqueta abaixo das barras. Para cenários de geração avançados, consulte a documentação de geração de código de barras do IronBarcode .
Capacidade de leitura de código de barras
A leitura é a fronteira funcional mais significativa entre essas duas bibliotecas. O Biblioteca de código de barras não possui capacidade de leitura; O IronBarcode inclui um mecanismo de leitura completo no mesmo pacote.
Abordagem BarcodeLib
BarcodeLib não possui uma API de leitura. Não há método Decode(), Scan() ou ReadBarcode(). A leitura nunca fez parte do design da biblioteca. Qualquer tentativa de chamar um método de decodificação resulta em um erro de compilação:
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png"); // does not exist
// b.Scan("barcode.png"); // does not exist
// b.ReadBarcode("barcode.png"); // does not exist
// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png"); // does not exist
// b.Scan("barcode.png"); // does not exist
// b.ReadBarcode("barcode.png"); // does not exist
// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
Imports BarcodeStandard
Imports SkiaSharp
Dim b = New Barcode()
' There is no Decode, Scan, or Read method on Barcode.
' b.Decode("barcode.png") ' does not exist
' b.Scan("barcode.png") ' does not exist
' b.ReadBarcode("barcode.png") ' does not exist
' The only public operation is generation:
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)
Equipes que precisam tanto da geração quanto da leitura de código de barras em conjunto com o Biblioteca de código de barras devem adicionar uma segunda biblioteca — normalmente o ZXing .NET — o que introduz sua própria carga de gerenciamento de dependências e uma segunda superfície de API para manter.
Abordagem do IronBarcode
BarcodeReader.Read() aceita arquivos de imagem, arquivos PDF, fluxos e objetos System.Drawing.Bitmap. A leitura de um PDF não requer nenhuma biblioteca adicional:
using IronBarCode;
// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value); // "PRODUCT-12345"
// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;
// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value); // "PRODUCT-12345"
// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode
' Read from an image
Dim results = BarcodeReader.Read("barcode.png")
Console.WriteLine(results.First().Value) ' "PRODUCT-12345"
' Read all barcodes from a PDF — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
' Tune reading for speed vs. thoroughness
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-scan.png", options)
O enum ReadingSpeed permite ajustar o desempenho da varredura para cenários de alto volume. Para obter orientações sobre a configuração de leitura, consulte a documentação de leitura do IronBarcode .
Conflito de dependência SkiaSharp
A dependência do SkiaSharp introduzida no Biblioteca de código de barras 3.x cria um tipo de conflito que não existe no IronBarcode.
Abordagem BarcodeLib
Começando com Biblioteca de código de barras 3.x, a biblioteca introduziu o SkiaSharp como um backend gráfico para substituir System.Drawing.Common, que se tornou exclusivo doWindowsapós .NET 6. O Biblioteca de código de barras 3.1.5 declara SkiaSharp >= 2.88.8. Se um projeto já usa SkiaSharp através de outra dependência — comum em projetos MAUI usando SkiaSharp.Views.Maui e Microsoft.Maui.Graphics, que tendem para o SkiaSharp 3.x — as versões resolvidas podem não convergir. O resultado é, no mínimo, um aviso NU1608 e, na pior das hipóteses, uma falha na vinculação do assembly em tempo de execução:
warning NU1608: Detected package version outside of dependency constraint:
BarcodeLib 3.1.5 requires SkiaSharp (>= 2.88.8) but
version SkiaSharp 3.116.1 was resolved.
Forçar uma resolução por referências explícitas de pacotes é uma rota, embora não garanta compatibilidade em tempo de execução:
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
Mesmo com substituições explícitas, a compatibilidade depende das chamadas de API internas do Biblioteca de código de barras coincidirem com o que a versão do SkiaSharp resolvida expõe. Como um projeto mantido pela comunidade, o Biblioteca de código de barras não possui contrato de suporte comercial vinculado ao seu ritmo de lançamento.
Abordagem do IronBarcode
O IronBarcode não compartilha o gráfico de dependências do SkiaSharp com o código do aplicativo. Não há negociação de versões para gerenciar, nenhum erro NU1608 para diagnosticar e nenhum risco de vinculação de assembly em tempo de execução relacionado à resolução de versão do SkiaSharp. Projetos MAUI, projetos Blazor e qualquer outro aplicativo que dependa do SkiaSharp podem instalar o IronBarcode sem qualquer conflito de versão. Para padrões de integração específicos do MAUI, consulte a documentação do IronBarcode MAUI .
Referência de Mapeamento de API
| Biblioteca de código de barras | IronBarcode |
|---|---|
new Barcode() |
API estática — nenhuma instância necessária |
b.Encode(BarcodeStandard.Type.Code128, "data", 300, 100) |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).ResizeTo(300, 100) |
b.IncludeLabel = true |
.AddBarcodeValueTextBelowBarcode() |
Retorna SKImage |
.SaveAsPng(path) / .ToPngBinaryData() |
BarcodeStandard.Type.Code128 |
BarcodeEncoding.Code128 |
BarcodeStandard.Type.Code39 |
BarcodeEncoding.Code39 |
BarcodeStandard.Type.Ean13 |
BarcodeEncoding.EAN13 |
BarcodeStandard.Type.UpcA |
BarcodeEncoding.UPCA |
| Não suportado (sem 2D no BarcodeLib) | BarcodeEncoding.QRCode (também QRCodeWriter) |
| Sem API de leitura | BarcodeReader.Read(path) |
| SkiaSharp no gráfico de dependência | Nenhuma dependência SkiaSharp |
Quando as equipes consideram migrar do Biblioteca de código de barras para o IronBarcode
A exigência de leitura aparece.
Um sistema que gera etiquetas de envio há meses recebe um novo requisito: o aplicativo também deve processar etiquetas devolvidas pelos fornecedores. A integração com o armazém precisa analisar os códigos de barras presentes nos manifestos de remessas de entrada. Um sistema de gerenciamento de documentos precisa indexar códigos de barras em PDFs digitalizados. A Biblioteca de código de barras não consegue atender a nenhum desses requisitos — a API de leitura não existe. A equipe avalia a possibilidade de adicionar o ZXing .NET junto com a BarcodeLib, pondera o ônus de manutenção de duas bibliotecas e os dois grafos de dependência separados, e decide que o caminho mais limpo é uma biblioteca que lide com a geração e a leitura em uma única instalação do NuGet .
Conflito SkiaSharp em um projeto MAUI
Uma equipe adiciona a biblioteca Biblioteca de código de barras a um aplicativo MAUI existente e imediatamente se depara com avisos NU1608 durante a restauração. Eles investigam, identificam a incompatibilidade de versão entre o intervalo esperado de SkiaSharp do Biblioteca de código de barras e a versão necessária pelo MAUI, adicionam substituições explícitas <PackageReference> para forçar uma resolução, e consequem que a compilação passe. Em seguida, ocorre uma falha de execução no dispositivo quando os binários nativos do SkiaSharp carregam a versão errada. A correção requer uma investigação mais aprofundada do registro de vinculação do assembly. A mudança para o IronBarcode resolve o conflito pela raiz — não encontrando uma versão compatível do SkiaSharp, mas eliminando completamente a dependência compartilhada.
Processamento de código de barras em PDF necessário
Aplicações que geram documentos PDF com códigos de barras incorporados — faturas, ordens de serviço, manifestos de envio — às vezes precisam ler esses códigos de barras novamente durante o processamento subsequente. O Biblioteca de código de barras gera imagens de código de barras, mas não oferece suporte a PDF em nenhuma das extremidades. A leitura de códigos de barras de um PDF com o Biblioteca de código de barras requer primeiro a renderização do PDF em imagens usando uma biblioteca PDF separada e, em seguida, a passagem dessas imagens para uma biblioteca de leitura também separada. O IronBarcode lida com toda a cadeia nativamente: BarcodeReader.Read("file.pdf") percorre cada página e retorna todos os códigos de barras detectados sem uma etapa de renderização intermediária.
Surgimento da Necessidade de Código QR ou Outra Simbologia 2D
Projetos que inicialmente requeriam apenas códigos de barras lineares muitas vezes evoluem para precisar de saída de Código QR, Data Matrix, PDF417 ou Aztec. O Biblioteca de código de barras não gera simbologia 2D em sua série 3.x — o enum BarcodeStandard.Type não contém QR Code ou outras entradas 2D — então qualquer requisito 2D significa adicionar uma segunda biblioteca ou substituir o Biblioteca de código de barras totalmente. Os QRCodeWriter e BarcodeWriter do IronBarcode cobrem QR Code (com incorporação de logotipo, controle de cor e ajuste de correção de erro), Data Matrix, PDF417, e Aztec através da mesma API fluente. Equipes cujas necessidades de simbologia se expandem para 2D descobrem que a lacuna impulsiona a decisão de migração.
Considerações Comuns de Migração
API de instância para API fluente estática
O código do Biblioteca de código de barras usa um padrão de objeto mutável: cria uma instância Barcode, define propriedades, chama Encode(). O IronBarcode usa um padrão fluente estático: chama BarcodeWriter.CreateBarcode(), encadeia métodos de configuração, termina com um método de saída. O código existente que armazena uma instância Barcode como um campo ou a passa entre métodos precisará ser reestruturado. A alteração típica consiste em substituir o bloco de configuração de propriedades por uma cadeia de métodos:
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.SaveAsPng(outputPath);
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.SaveAsPng(outputPath);
' The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.AddBarcodeValueTextBelowBarcode() _
.SaveAsPng(outputPath)
SKImage para Saída Direta
O Biblioteca de código de barras 3.x retorna SKImage, que requer SKEncodedImageFormat e um fluxo para produzir bytes. Qualquer código digitado para SKImage ou passando por image.Encode(...).SaveTo(stream) precisará ser atualizado. A cadeia fluente do IronBarcode termina diretamente com o formato de saída desejado — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — removendo a necessidade do objeto de imagem intermediário e da etapa de codificação para fluxo.
Enum de Tipo para Enum de Codificação de Código de Barras
O Biblioteca de código de barras 3.x usa o enum BarcodeStandard.Type com valores PascalCase, como BarcodeStandard.Type.Code128. O IronBarcode usa o enum BarcodeEncoding com valores como BarcodeEncoding.Code128. Os valores 1D mapeiam diretamente: Code128 → Code128, Ean13 → EAN13, UpcA → UPCA, Code39 → Code39. Um grep por BarcodeStandard.Type. em arquivos .cs identifica todas as ocorrências que precisam ser atualizadas.
Limpeza de referência SkiaSharp
Projetos que adicionaram entradas explícitas <PackageReference Include="SkiaSharp"> apenas para resolver os avisos NU1608 do Biblioteca de código de barras podem remover essas substituições após mudar para o IronBarcode. O comando dotnet list package --include-transitive confirma se o SkiaSharp ainda é necessário por outros pacotes no projeto antes de removê-lo.
Funcionalidades adicionais do IronBarcode
Além da geração direta e da comparação de leitura, o IronBarcode inclui funcionalidades que o Biblioteca de código de barras não oferece:
- Incorporação de logotipo em código QR:
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")incorpora um logotipo de marca ao centro de um código QR com ajuste automático de correção de erro - Extração de código de barras de PDF:
BarcodeReader.Read("file.pdf")lê códigos de barras de todas as páginas de um documento PDF sem uma biblioteca de renderização de PDF separada - Detecção de múltiplos códigos de barras:
BarcodeReaderOptions.ExpectMultipleBarcodes = truedetecta e retorna todos os códigos de barras presentes em uma única imagem - Configuração de velocidade de leitura:
ReadingSpeed.Faster,ReadingSpeed.Balanced, eReadingSpeed.ExtremeDetailajustam o motor de varredura para rendimento versus precisão - Geração de código QR estilizado: Cor, estilo do padrão localizador e nível de correção de erro são configuráveis através de métodos encadeados em
QRCodeWriter - Entrada de Stream e Bitmap para leitura:
BarcodeReader.Read()aceita caminhos de arquivos, streams,System.Drawing.Bitmap, e entradasAnyBitmap
Compatibilidade com .NET e Preparação para o Futuro
O IronBarcode oferece suporte ao .NET Framework 4.6.2 até o .NET 9 e mantém um ritmo regular de lançamentos alinhado com o cronograma de lançamentos do .NET da Microsoft. Com a crescente adoção do .NET 10 até 2026, o desenvolvimento ativo da IronBarcode garante a compatibilidade futura sem exigir alterações no projeto. A biblioteca funciona sem modificações no Windows, Linux, macOS, Docker, Azure e AWS Lambda. O Biblioteca de código de barras também mantém um desenvolvimento ativo da comunidade, embora seu suporte multiplataforma na série 3.x dependa da compatibilidade de versão do SkiaSharp discutida nas seções de comparação acima. Para projetos que visam o .NET moderno no Linux ou em contêineres, a arquitetura multiplataforma sem dependências do IronBarcode evita a negociação de versões introduzida pelo backend SkiaSharp do BarcodeLib.
Conclusão
BarcodeLib e IronBarcode representam diferentes escopos de solução para trabalho com código de barras em .NET. Biblioteca de código de barras é uma biblioteca gratuita, focada e dedicada exclusivamente à geração de código, que tem atendido de forma confiável ao seu caso de uso definido por quase duas décadas.IronBarcode é uma biblioteca comercial que abrange tanto a geração quanto a leitura de códigos de barras, com uma API estática e fluente e sem dependência do SkiaSharp. A diferença não reside na qualidade dentro de um escopo compartilhado — reside no próprio escopo.
O Biblioteca de código de barras continua sendo uma escolha apropriada para projetos com requisitos estáveis de geração apenas linear noWindowsou em ambientes onde a paisagem de versão do SkiaSharp é controlada. Sua licença Apache 2.0, custo zero, e API direta o tornam uma solução prática para sistemas de etiquetas de envio, geradores de etiquetas de inventário e aplicações semelhantes que nunca precisarão digitalizar códigos de barras ou produzir simbologias 2D.
IronBarcode torna-se a escolha mais prática quando os requisitos vão além da geração de imagem linear: quando é necessária a capacidade de leitura, quando o projeto é um aplicativo MAUI ou multiplataforma onde os conflitos de versão do SkiaSharp são prováveis, quando o processamento de código de barras em PDF está no roteiro, ou quando qualquer simbologia 2D (Código QR, Data Matrix, PDF417, Aztec) é necessária. O custo da licença comercial representa a questão-limite — para equipes cujos requisitos se alinham com o que o IronBarcode adiciona sobre o BarcodeLib, a solução de pacote único e o suporte comercial são a troca de valor.
A avaliação honesta é que a maioria das equipes não começa a usar o IronBarcode desde o início. Eles começam com o Biblioteca de código de barras porque é gratuito e suficiente. Eles migram para o IronBarcode quando suas necessidades ultrapassam o que o escopo de geração exclusivo do Biblioteca de código de barras suporta. A migração está bem documentada e as alterações na interface da API são previsíveis. Compreender onde o Biblioteca de código de barras para — e especificamente que ele para na geração — é a informação prática necessária para tomar a decisão correta em relação ao momento da execução.
Perguntas frequentes
O que é BarcodeLib?
BarcodeLib é uma biblioteca .NET para geração e leitura de códigos de barras em aplicações C#. É uma das diversas alternativas que os desenvolvedores avaliam ao selecionar uma solução de código de barras para projetos .NET.
Quais são as principais diferenças entre BarcodeLib e IronBarcode?
O IronBarcode utiliza uma API estática e sem estado, que não requer gerenciamento de instâncias, enquanto o BarcodeLib normalmente exige a criação e configuração de instâncias antes do uso. O IronBarcode também oferece suporte nativo a PDF, detecção automática de formato e licenciamento com chave única em todos os ambientes.
O licenciamento do IronBarcode é mais fácil do que o do BarcodeLib?
O IronBarcode utiliza uma única chave de licença que abrange tanto o ambiente de desenvolvimento quanto o de produção. Isso simplifica os pipelines de CI/CD e as configurações do Docker em comparação com sistemas de licenciamento que separam as chaves do SDK das chaves de tempo de execução.
O IronBarcode é compatível com todos os formatos de código de barras suportados pelo BarcodeLib?
O IronBarcode suporta mais de 30 simbologias de código de barras, incluindo QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 e muitas outras. A detecção automática de formato significa que não é necessária a enumeração explícita de formatos.
O IronBarcode suporta leitura nativa de códigos de barras em PDF?
Sim. O IronBarcode lê códigos de barras diretamente de arquivos PDF usando BarcodeReader.Read("document.pdf") sem a necessidade de uma biblioteca de renderização de PDF separada. Os resultados por página incluem número da página, formato do código de barras, valor e nível de confiança.
Como o IronBarcode lida com o processamento em lote em comparação com o BarcodeLib?
Os métodos estáticos do IronBarcode são sem estado e naturalmente seguros para threads, permitindo o uso direto de Parallel.ForEach sem gerenciamento de instâncias por thread. Não há limite de throughput em nenhum plano de preços.
Quais versões do .NET o IronBarcode suporta?
O IronBarcode é compatível com o .NET Framework 4.6.2+, .NET Core 3.1 e .NET 5, 6, 7, 8 e 9 em um único pacote NuGet. As plataformas suportadas incluem Windows x64/x86, Linux x64 e macOS x64/ARM.
Como faço para instalar o IronBarcode em um projeto .NET?
Instale o IronBarcode via NuGet: execute 'Install-Package IronBarCode' no Console do Gerenciador de Pacotes ou 'dotnet add package IronBarCode' na CLI. Não são necessários instaladores de SDK ou arquivos de tempo de execução adicionais.
Posso avaliar o IronBarcode antes de comprar, ao contrário do BarcodeLib?
Sim. O modo de avaliação do IronBarcode retorna os valores completos dos códigos de barras decodificados — apenas as imagens de saída geradas recebem uma marca d'água. Você pode testar a precisão de leitura em seus próprios documentos antes de efetuar a compra.
Qual é a diferença de preço entre BarcodeLib e IronBarcode?
O IronBarcode tem um preço inicial de US$ 749 para uma licença perpétua de desenvolvedor único, que abrange desenvolvimento e produção. Detalhes sobre preços e opções de volume estão disponíveis na página de licenciamento do IronBarcode. Não há necessidade de uma licença de tempo de execução separada.
É simples migrar do BarcodeLib para o IronBarcode?
A migração do BarcodeLib para o IronBarcode envolve principalmente a substituição de chamadas de API baseadas em instâncias pelos métodos estáticos do IronBarcode, a remoção de código repetitivo relacionado a licenciamento e a atualização dos nomes das propriedades de resultado. A maioria das migrações consiste em reduzir o código em vez de adicioná-lo.
O IronBarcode gera códigos QR com logotipos?
Sim. O método `QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` incorpora uma imagem da marca em um código QR nativamente, com correção de erros configurável. Códigos QR coloridos também são suportados através do método `ChangeBarCodeColor()`.

