Comparação entre as bibliotecas de código de barras Infragistics Barcode e IronBarcode em C#
A leitura de código de barras da Infragistics funciona em WPF. Para chegar lá, é necessário uma instância de BarcodeReader, um manipulador de eventos de DecodeComplete, um TaskCompletionSource<string> para fazer a ponte do retorno de chamada para o código assíncrono, um carregamento de BitmapImage de um URI e um OR bit a bit explícito de cada SymbologyType que você deseja suportar. Se faltar uma flag — digamos, SymbologyType.EAN8 — qualquer código de barras EAN-8 em suas imagens retornará nada. Sem exceção. Sem aviso prévio. Um resultado vazio.
Essa é a parte do WPF. Não lado do WinForms, o pacote Infragistics.Win.UltraWinBarcode contém controles de geração, mas nenhuma classe de leitura. Se você precisar ler códigos de barras em um projeto WinForms, não há nada no pacote de código de barras da Infragistics que possa ser chamado. O mesmo se aplica a qualquer controlador ASP.NET Core , ferramenta de console, Função do Azure, componente do Servidor Blazor ou contêiner Docker. O suporte a códigos de barras da Infragistics existe dentro dos limites da estrutura de interface do usuário: oWPFobtém a geração e a leitura orientada a eventos; OWinFormsobtém apenas a geração; Todo o resto não recebe nada.
Esta comparação examina o que essa divisão significa na prática e, em seguida, analisa como oIronBarcodelida com o mesmo trabalho com uma única API estática que se comporta de forma idêntica em todos os tipos de projeto.
Entendendo o suporte a códigos de barras da Infragistics
A Infragistics é uma das fornecedoras de componentes de interface de usuário .NET mais consolidadas. O Suite Infragistics Ultimate — a assinatura que abrange a funcionalidade de código de barras — inclui centenas de controles para WinForms, WPF, ASP.NET, Blazor e dispositivos móveis. Para equipes que já utilizam grids, gráficos ou agendadores da Infragistics, os controles de código de barras são um complemento lógico: elas já pagam pela assinatura.
O suporte a códigos de barras, no entanto, não é uma biblioteca unificada. São duas montagens separadas com capacidades distintas que se sobrepõem apenas parcialmente.
WinForms: UltraWinBarcode
O pacote Infragistics.Win.UltraWinBarcode fornece geração de código de barras em aplicativosWinFormspor meio da classe UltraWinBarcode. A API é simples:
// InfragisticsWinFormsgeneration
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
// InfragisticsWinFormsgeneration
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
Imports Infragistics.Win.UltraWinBarcode
Dim barcode As New UltraWinBarcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.SaveTo(outputPath)
Você define uma simbologia, atribui dados, chama SaveTo(). Para cenários que envolvem apenas geração de dados no WinForms, isso funciona. A enumeração Symbology abrange formatos comuns: Code128, Code39, QR, EAN13 e outros.
O que não existe nesta assembleia é um leitor. Não existe a classe UltraBarcodeReader. Não existe o método Scan(). Se você tentar ler uma imagem de código de barras em um aplicativoWinFormsusando apenas o pacote Infragistics.Win.UltraWinBarcode, não haverá nada para chamar.
WPF: XamBarcode e BarcodeReader
O ladoWPFinclui um controle de geração (XamBarcode) e uma classe leitora separada (BarcodeReader em Infragistics.Controls.Barcodes, do assembly Infragistics.WPF.BarcodeReader). O leitor é orientado a eventos, projetado em torno do modelo de threading e de processamento de imagens do WPF.
A leitura de um código de barras emWPFrequer a configuração do evento DecodeComplete, o carregamento de imagens como objetos BitmapSource em vez de caminhos de arquivo e a conversão do padrão de retorno de chamada em algo assíncrono, caso seu código seja assíncrono.
ASP.NET Core, Console, Docker: Nada
Não existe nenhum pacote de código de barras da Infragistics que seja compatível com net8.0 sem assemblies de interface do usuárioWPFou WinForms. Projetos ASP.NET Core , ferramentas de console, Azure Functions, Servidor Blazor e contêineres Docker do Linux não possuem a opção de código de barras da Infragistics. A biblioteca está integrada à estrutura da interface do usuário.
O padrão de leitura WPF
Eis como a leitura de um código de barras realmente se parece emWPFcom Infragistics:
// InfragisticsWPFreading: event-driven, requiresWPFassemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;
private BarcodeReader _reader;
private TaskCompletionSource<string> _result;
public InfragisticsBarcodeService()
{
_reader = new BarcodeReader();
_reader.DecodeComplete += OnDecodeComplete;
}
public async Task<string> ReadBarcodeAsync(string imagePath)
{
_result = new TaskCompletionSource<string>();
// Load asWPFBitmapSource — not a file path
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
// Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Trigger decode — result comes via callback
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbologyValue ?? "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}
// InfragisticsWPFreading: event-driven, requiresWPFassemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;
private BarcodeReader _reader;
private TaskCompletionSource<string> _result;
public InfragisticsBarcodeService()
{
_reader = new BarcodeReader();
_reader.DecodeComplete += OnDecodeComplete;
}
public async Task<string> ReadBarcodeAsync(string imagePath)
{
_result = new TaskCompletionSource<string>();
// Load asWPFBitmapSource — not a file path
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
// Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Trigger decode — result comes via callback
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbologyValue ?? "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}
Imports Infragistics.Controls.Barcodes
Imports System.Windows.Media.Imaging
Imports System.Threading.Tasks
Private _reader As BarcodeReader
Private _result As TaskCompletionSource(Of String)
Public Sub New()
_reader = New BarcodeReader()
AddHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
End Sub
Public Async Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
_result = New TaskCompletionSource(Of String)()
' Load as WPF BitmapSource — not a file path
Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))
' Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 Or
SymbologyType.Code39 Or
SymbologyType.QR Or
SymbologyType.EAN8 Or
SymbologyType.EAN13 Or
SymbologyType.UPCA Or
SymbologyType.DataMatrix Or
SymbologyType.Interleaved2of5
' Trigger decode — result comes via callback
_reader.Decode(bitmap)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(e.SymbologyValue, "No barcode found"))
End Sub
Public Sub Dispose()
If _reader IsNot Nothing Then
RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
_reader = Nothing
End If
End Sub
São necessárias aproximadamente 35 linhas de infraestrutura para ler um único código de barras. Conte o que está realmente acontecendo:
- Uma instância de
BarcodeReaderé criada e mantida ativa como um campo. - Um manipulador de eventos é configurado no construtor.
- Cada chamada para
ReadBarcodeAsynccria um novoTaskCompletionSource<string>atribuído a um campo compartilhado — o que significa que este serviço não é thread-safe da forma como está escrito. Chamadas simultâneas sobrescreveriam_result. - A imagem deve ser carregada como um
BitmapImagea partir de umUri— não uma string de caminho de arquivo, não uma matriz de bytes, não um fluxo. Decode()dispara o evento de forma assíncrona. OTaskCompletionSourceé a cola entre o mundo dos callbacks e o mundo do async/await.- O retorno de chamada extrai
e.SymbologyValue. - O método
Dispose()deve desanexar o manipulador de eventos para evitar vazamentos de memória.
Nada disso tem a ver com códigos de barras. Trata-se da infraestrutura necessária para dar suporte ao design orientado a eventos. Em código de produção, você também precisaria lidar com o caso em que _result.Task nunca é concluído — um tempo limite, um token de cancelamento ou alguma proteção contra o evento nunca ser disparado.
A lacuna do WinForms
A diferença em relação aoWinFormsé mais abrupta do que pode parecer inicialmente. As equipes que desenvolvem aplicativosWinFormsgeralmente chegam à página de código de barras da Infragistics esperando uma experiência simétrica — geração e leitura em ambas as estruturas de interface do usuário. O que eles descobriram é que Infragistics.Win.UltraWinBarcode não oferece nenhuma capacidade de leitura.
Isso não é uma falha de documentação. O assembly de código de barrasWinFormsfoi projetado como um controle de geração. Se você precisar ler códigos de barras em um aplicativoWinForms— por exemplo, ler um código de barras de um arquivo de imagem carregado pelo usuário ou decodificar um código de barras da imagem capturada por uma câmera —, isso não será possível com as ferramentas de código de barras da Infragistics. Seria necessário importar uma biblioteca completamente separada, o que enfraqueceria a justificativa para usar o Infragistics para geração de dados.
Essa assimetria cria uma situação realmente desconfortável para equipes que executam projetos com frameworks mistos. Uma equipe que possui um cliente desktopWPFe um cliente desktopWinFormsnão pode usar o Infragistics para leitura de código de barras no projeto WinForms, mesmo que esteja usando o Infragistics em todos os outros lugares.
Especificação de simbologia: um modo de falha silencioso
A propriedade de sinalização SymbologyTypes no leitorWPFmerece uma seção própria, pois seu modo de falha é sutil e perigoso em produção.
Ao configurar o leitor, você deve combinar explicitamente todos os formatos de código de barras que deseja suportar usando o operador OR:
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
' Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 Or
SymbologyType.Code39 Or
SymbologyType.QR Or
SymbologyType.EAN8 Or
SymbologyType.EAN13 Or
SymbologyType.UPCA Or
SymbologyType.DataMatrix Or
SymbologyType.Interleaved2of5
Se uma imagem de código de barras contiver um código de barras EAN-8 e SymbologyType.EAN8 não estiver nos sinalizadores, e.SymbologyValue retornará nulo ou vazio. O evento de decodificação ainda é acionado. Nenhuma exceção foi lançada. Quem liga recebe a mensagem "Nenhum código de barras encontrado" e não tem nenhuma indicação se a imagem estava ilegível ou simplesmente não estava configurada.
Na prática, isso significa:
- A configuração inicial funciona bem para os formatos testados pelo desenvolvedor.
- Um novo formato de código de barras entra no sistema (um fornecedor altera o tipo de etiqueta, uma nova linha de produtos usa uma simbologia diferente).
- O leitor falha silenciosamente para todas as imagens com esse formato.
- A falha parece idêntica a "a imagem não possui código de barras" em vez de "formato não configurado".
As equipes que depuram esse problema gastam tempo examinando a qualidade da imagem antes de perceberem que o formato nunca esteve na lista de flags.
IronBarcode não possui a propriedade SymbologyTypes. Ele detecta automaticamente todos os mais de 50 formatos suportados em cada leitura. Não há bandeira para esquecer.
A Matriz da Plataforma
A diferença de capacidades entre as plataformas é a maneira mais clara de entender a limitação arquitetônica:
| Plataforma | Geração Infragistics | Leitura Infragistics | Geração deIronBarcode | Leitura de código deIronBarcode |
|---|---|---|---|---|
| WPF | Controle XamBarcode | Leitor de código de barras (orientado a eventos) | Sim | Sim |
| WinForms | UltraWinBarcode | NÃO DISPONÍVEL | Sim | Sim |
| ASP.NET Core | NÃO DISPONÍVEL | NÃO DISPONÍVEL | Sim | Sim |
| Console | NÃO DISPONÍVEL | NÃO DISPONÍVEL | Sim | Sim |
| Servidor Blazor | NÃO DISPONÍVEL | NÃO DISPONÍVEL | Sim | Sim |
| Docker / Linux | NÃO DISPONÍVEL | NÃO DISPONÍVEL | Sim | Sim |
| Funções do Azure | NÃO DISPONÍVEL | NÃO DISPONÍVEL | Sim | Sim |
Esta tabela ilustra por que as equipes que executam qualquer coisa além de aplicativos desktopWPFpuros consideram o suporte a código de barras da Infragistics insuficiente. Não momento em que um projeto abrangeWinFormse ASP.NET Core — ouWPFe um serviço de processamento em segundo plano — a biblioteca de código de barras da Infragistics cobre apenas parte da base de código.
Entendendo o IronBarcode
IronBarcode é uma biblioteca dedicada a códigos de barras para .NET , sem dependência de WinForms,WPFou qualquer framework de interface do usuário. O mesmo pacote NuGet , o mesmo namespace e a mesma API funcionam em qualquer projeto .NET : WinForms, WPF, ASP.NET Core, console, Blazor Server, Docker, Azure Functions, AWS Lambda.
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
Imports IronBarCode
' Read — 2 lines, any platform
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
BarcodeReader.Read() é um método estático. Nenhuma instância para gerenciar, nenhum evento para conectar, nenhum TaskCompletionSource para interligar padrões de retorno de chamada. Aceita uma string de caminho de arquivo, uma matriz de bytes, um Stream ou uma matriz de qualquer um desses para processamento em lote.
Para geração, BarcodeWriter.CreateBarcode() retorna um objeto de código de barras que você pode salvar em PNG, JPEG, SVG ou obter como dados binários:
using IronBarCode;
// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");
using IronBarCode;
// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");
Imports IronBarCode
' Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
' Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.SaveAsPng("qr.png")
A inicialização da licença ocorre na inicialização do aplicativo, uma única vez:
IronBarCode.License.LicenseKey = "YOUR-KEY";
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-KEY"
Processamento em lote: Lado a lado
O processamento em lote expõe outra limitação estrutural no leitorWPFda Infragistics. Como o leitor usa um manipulador de eventos compartilhado e o campo _result é sobrescrito a cada chamada, a classe de serviço mostrada acima não pode processar várias imagens simultaneamente com segurança. Você deve sequenciar as chamadas:
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// are not thread-safe; concurrent calls would corrupt _result
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
// Each call must await before starting the next
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// are not thread-safe; concurrent calls would corrupt _result
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
// Each call must await before starting the next
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
Imports System.Collections.Generic
' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' are not thread-safe; concurrent calls would corrupt _result
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()
For Each file In imageFiles
' Each call must await before starting the next
Dim value As String = Await service.ReadBarcodeAsync(file)
results.Add(value)
Next
Para tornar isso concorrente, é necessária uma infraestrutura adicional significativa: um bloqueio, uma fila ou um semáforo para garantir que _result não seja sobrescrito enquanto uma decodificação anterior ainda estiver em andamento. Trata-se de um problema de concorrência complexo para o que deveria ser uma operação de entrada/saída simples.
O método estático BarcodeReader.Read() doIronBarcodeé seguro para uso em múltiplas threads. Pode ser chamado simultaneamente por várias threads sem qualquer sincronização adicional. Para cargas de trabalho em lote, você pode usar Parallel.ForEach diretamente:
using IronBarCode;
// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var barcodeResults = BarcodeReader.Read(file);
foreach (var result in barcodeResults)
{
results.Add(result.Value);
}
});
using IronBarCode;
// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var barcodeResults = BarcodeReader.Read(file);
foreach (var result in barcodeResults)
{
results.Add(result.Value);
}
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' IronBarcode: parallel batch with thread-safe static API
Dim results As New ConcurrentBag(Of String)()
Parallel.ForEach(imageFiles, Sub(file)
Dim barcodeResults = BarcodeReader.Read(file)
For Each result In barcodeResults
results.Add(result.Value)
Next
End Sub)
Você também pode passar vários arquivos em uma única chamada e configurar o paralelismo através de BarcodeReaderOptions:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read(imageFiles, options)
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next
Comparação de recursos
| Recurso | Código de barras Infragistics | IronBarcode |
|---|---|---|
| Leitura de código de barrasWinForms | Não disponível | Sim |
| Leitura de código de barrasWPF | Sim (orientado a eventos) | Sim (síncrono) |
| Suporte ao ASP.NET Core | Não disponível | Sim |
| Serviço de console/trabalhador | Não disponível | Sim |
| Docker / Linux | Não disponível | Sim |
| Funções do Azure | Não disponível | Sim |
| Servidor Blazor | Não disponível | Sim |
| Detecção automática de formato | Não — é necessário especificar cada flag SymbologyType. | Sim — todos os mais de 50 formatos são detectados automaticamente. |
| Leitura de código de barras em PDF | Não disponível | Sim — nativo, sem pacote adicional |
| Leitura segura para threads | Não (manipulador de eventos compartilhado) | Sim (API estática) |
| API orientada a eventos necessária | Sim (WPF) | Não |
| Carregamento explícito de imagem (BitmapSource) | Sim | Não — aceita caminho de arquivo, bytes, fluxo |
| Leitura síncrona | Não (deve ser feito através de TaskCompletionSource) | Sim |
| Processamento em lote | Somente sequencial (inseguro para concorrência) | Paralelização integrada |
| falhas de formatação silenciosas | Sim (falta a flag SymbologyType) | Não |
| Dependência da Suite necessária | Sim — assinatura Infragistics Ultimate | Não — pacote independente |
| Opção de licença perpétua | Não — assinatura anual | Sim |
| Custo aproximado da licença | A partir de US$ 1.675/ano (Infragistics Ultimate) | A partir de $749 (licença perpétua - Lite) |
Referência de Mapeamento de API
WinForms(UltraWinBarcode) para IronBarcode
| InfragisticsWinForms— UltraWinBarcode | IronBarcode |
|---|---|
| @@--CÓDIGO-64107--@@ | @@--CÓDIGO-64108--@@ |
| @@--CÓDIGO-64109--@@ | BarcodeEncoding.Code128 (parâmetro para CreateBarcode) |
| @@--CÓDIGO-64112--@@ | Primeiro argumento de CreateBarcode() |
| @@--CÓDIGO-64114--@@ | @@--CÓDIGO-64115--@@ |
| Não existe uma API de leitura. | @@--CÓDIGO-64116--@@ |
WPF(BarcodeReader) para IronBarcode
| InfragisticsWPF— Leitor de código de barras | IronBarcode |
|---|---|
| @@--CÓDIGO-64117--@@ | Classe estática — não é necessária nenhuma instância. |
| @@--CÓDIGO-64118--@@ | Não é necessário |
_reader.SymbologyTypes = SymbologyType.X \| SymbologyType.Y \| ... |
Detecção automática — sem configuração |
| @@--CÓDIGO-64119--@@ + @@--CÓDIGO-64120--@@ | @@--CÓDIGO-64121--@@ |
e.SymbologyValue (em retorno de chamada) |
@@--CÓDIGO-64123--@@ |
e.Symbology (em retorno de chamada) |
@@--CÓDIGO-64125--@@ |
TaskCompletionSource<string> wrapper assíncrono |
Síncrono — sem necessidade de wrapper |
Dispose() — manipulador de eventos de desanexação |
Não é necessário — nenhum exemplo ou evento |
| ProjetoWPFapenas | Qualquer tipo de projeto .NET |
Quando as equipes trocam
Diversas situações específicas levam, de forma consistente, as equipes a optarem por não utilizar o suporte para códigos de barras da Infragistics.
Leitura necessária no WinForms. Este é o cenário mais comum. Um aplicativoWinFormsgera códigos de barras corretamente com UltraWinBarcode, mas surge um novo requisito: ler um código de barras a partir de uma imagem carregada ou validar uma etiqueta antes da impressão. Não existe uma API de leitura da Infragistics para WinForms. A equipe opta por utilizar uma segunda biblioteca ou substituir o código de geração por algo que faça ambas as coisas.
Novo endpoint para ASP.NET Core . Um aplicativo desktop com geração de código de barras Infragistics agora conta com uma API web complementar. O endpoint precisa aceitar uploads de imagens e retornar valores de código de barras, ou gerar imagens de código de barras sob demanda. Nenhuma das duas opções é possível com os pacotes de código de barras da Infragistics em um projeto ASP.NET Core . OIronBarcodeé instalado com dotnet add package IronBarcode e funciona em uma ação de controlador da mesma forma que funciona em um método de console.
Implantação do Docker. Um aplicativoWPFestá sendo conteinerizado ou sua lógica de código de barras está sendo extraída para um microsserviço. Os assemblies doWPFnão são executados em contêineres Docker do Linux. O InfragisticsWPFBarcodeReader acompanha eles.IronBarcodeé compatível nativamente com Linux x64.
Desempenho do processamento em lote. Um fluxo de trabalho processa centenas ou milhares de imagens de código de barras. O leitor Infragistics orientado a eventos os processa sequencialmente. O leitor estático doIronBarcodeé thread-safe e suporta Parallel.ForEach ou sua opção integrada MaxParallelThreads sem qualquer infraestrutura de concorrência.
Falhas silenciosas de formato em produção. Uma equipe descobre que códigos de barras de um determinado formato vêm apresentando falhas silenciosas há semanas porque os indicadores SymbologyTypes não incluíam esse formato. A mudança para a detecção automática elimina completamente o modo de falha.
Reduzindo o escopo da assinatura da Infragistics. Algumas equipes pagam o preço da assinatura Infragistics Ultimate especificamente porque os controles de código de barras estão incluídos. Quando a exigência de código de barras é o único motivo para a assinatura, vale a pena avaliar uma biblioteca de códigos de barras dedicada, a um custo muito menor.
Conclusão
A principal questão relacionada ao suporte a códigos de barras da Infragistics é de ordem arquitetônica, e não de funcionalidade. OWPFBarcodeReader lê códigos de barras. OWinFormsUltraWinBarcode os gera. Dentro do contexto específico para o qual cada componente foi projetado, eles funcionam. O problema é que esses dois contextos não abrangem o que a maioria das equipes .NET realmente precisa.
Em uma aplicação .NET moderna, um recurso de código de barras raramente reside em uma única estrutura de interface do usuário. Ele aparece em um clienteWinFormse em uma API web. Ele é executado em um contêiner Docker e em um aplicativo desktop. Precisa analisar imagens enviadas para um endpoint ASP.NET e imprimir etiquetas a partir de uma ferramenta de console. Nada disso funciona com os pacotes de código de barras da Infragistics, e o padrão orientado a eventos do leitor WPF, com sinalizadores de simbologia obrigatórios, adiciona uma complexidade significativa, mesmo no único contexto em que funciona.
OIronBarcoderesolve o mesmo problema — leitura e geração de códigos de barras — com uma API estática que compila e executa de forma idêntica em todos os tipos de projeto .NET . A chamada BarcodeReader.Read() que você escreve em uma classe de serviçoWPFé a mesma chamada que você escreve em um controlador ASP.NET Core e a mesma chamada que você escreve em um contêiner Docker Linux. Sem eventos, sem bandeiras, sem TaskCompletionSource. A lógica do código de barras utiliza duas linhas em vez de trinta e cinco, e essas duas linhas funcionam em qualquer lugar.
Perguntas frequentes
O que é um código de barras da Infragistics?
O Infragistics Barcode é uma biblioteca .NET para gerar e ler códigos de barras em aplicações C#. É uma das várias 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 o código de barras da Infragistics e o da IronBarcode?
O IronBarcode utiliza uma API estática e sem estado, que não requer gerenciamento de instâncias, enquanto o Infragistics Barcode 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 Infragistics Barcode?
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 Infragistics Barcode?
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 Infragistics Barcode?
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 que acontece com o Infragistics?
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 o Infragistics Barcode e o 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 Infragistics Barcode para o IronBarcode?
A migração do Infragistics Barcode para o IronBarcode envolve principalmente a substituição de chamadas de API baseadas em instâncias por 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()`.

