Comparação entre Dynamsoft Barcode Reader e IronBarcode: Bibliotecas de código de barras em C#
Código de barras Infragistics vs IronBarcode: Leitor ApenasWPFvs API Galgênica de Plataforma
A leitura de código de barras da Infragistics funciona em WPF. Chegar lá requer uma instância BarcodeReader, um manipulador de eventos DecodeComplete, um TaskCompletionSource<string> para conectar o callback ao código assíncrono, um carregamento de BitmapImage de um URI e um OR bit-a-bit de cada família Symbology que você deseja suportar — passado como segundo argumento para Decode(). Omita uma família — por exemplo, deixe Symbology.QRCode fora dos flags — e qualquer código QR nos seus imagens retorna silenciosamente nada. Sem exceção. Sem aviso prévio. Um resultado vazio.
Esse é o lado WPF. Não lado WinForms, o pacote Infragistics.Win.UltraWinBarcode contém controles de geração, mas nenhuma classe de leitor. 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 controladorASP.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 o IronBarcode lida 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ódigos 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. O enum Symbology abrange formatos comuns: Code128, Code39, QR, EAN13, e outros.
O que não existe nesta assembleia é um leitor. Não há classe UltraBarcodeReader. Não há 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 há nada para chamar.
WPF: XamBarcode e BarcodeReader
O ladoWPFinclui tanto um controle de geração (XamBarcode) quanto uma classe de leitor separada (BarcodeReader em Infragistics.Controls.Barcodes, da assembly Infragistics.WPF.BarcodeReader). O leitor é orientado a eventos, projetado em torno do modelo de threading e de processamento de imagens do WPF.
Ler um código de barras noWPFrequer ligar o evento DecodeComplete, carregar imagens como objetos BitmapSource ao invés de caminhos de arquivos, e converter o padrão de callback em algo aguardável se seu código for assíncrono.
ASP.NET Core, Console, Docker: Nada
Não há pacote de código de barras Infragistics que atenda a net8.0 sem assemblies de UIWPFou WinForms. ProjetosASP.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));
// Build the Symbology flags. The enum is [Flags];
// EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
// and Code 39 is exposed as Code39Ext. Use Symbology.All
// to search every supported family.
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
// Symbology is the second argument to Decode/DecodeAsync,
// not a property on the reader. Result comes via callback.
_reader.DecodeAsync(bitmap, symbologies);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbolFound ? e.Value : "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));
// Build the Symbology flags. The enum is [Flags];
// EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
// and Code 39 is exposed as Code39Ext. Use Symbology.All
// to search every supported family.
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
// Symbology is the second argument to Decode/DecodeAsync,
// not a property on the reader. Result comes via callback.
_reader.DecodeAsync(bitmap, symbologies);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbolFound ? e.Value : "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))
' Build the Symbology flags. The enum is [Flags];
' EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
' and Code 39 is exposed as Code39Ext. Use Symbology.All
' to search every supported family.
Dim symbologies = Symbology.Code128 Or
Symbology.Code39Ext Or
Symbology.QRCode Or
Symbology.EanUpc Or
Symbology.Interleaved2Of5
' Symbology is the second argument to Decode/DecodeAsync,
' not a property on the reader. Result comes via callback.
_reader.DecodeAsync(bitmap, symbologies)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(e.SymbolFound, e.Value, "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 viva como um campo. - Um manipulador de eventos é configurado no construtor.
- Cada chamada para
ReadBarcodeAsynccria uma novaTaskCompletionSource<string>atribuída a um campo compartilhado — o que significa que este serviço não é seguro para threads conforme 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 um array de bytes, não um stream. DecodeAsync()aciona o evento de forma assíncrona. OTaskCompletionSourceé a cola entre o mundo de callbacks e o mundo de async/await.- O callback extrai
e.Valuequandoe.SymbolFoundé verdadeiro. - O método
Dispose()deve desanexar o manipulador de eventos para prevenir 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. Não código de produção, você também precisaria lidar com o caso em que _result.Task nunca se completa — um tempo limite, um token de cancelamento, ou algum mecanismo de proteção contra o evento nunca disparar.
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 descobrem é que Infragistics.Win.UltraWinBarcode não fornece capacidade de leitura alguma.
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.
A assimetria cria uma lacuna de cobertura para equipes que executam projetos de estruturas mistas. 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
O argumento de flags Symbology para Decode() no leitorWPFmerece sua própria seção porque seu modo de falha é silencioso: uma flag ausente retorna um resultado vazio sem erro.
Quando você chama o leitor, você OU juntos cada família de código de barras que deseja procurar. As famílias suportadas são QR, EAN/UPC (EanUpc), Code 39 (Code39Ext), Code 128, MaxiCode e Interleaved 2 of 5 — DataMatrix não está presente no enum, então o leitorWPFnão pode decodificá-lo. Symbology.All cobre tudo no enum:
// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
_reader.DecodeAsync(bitmap, symbologies);
// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
_reader.DecodeAsync(bitmap, symbologies);
' Build flags explicitly, or use Symbology.All to search every family
Dim symbologies = Symbology.Code128 Or
Symbology.Code39Ext Or
Symbology.QRCode Or
Symbology.EanUpc Or
Symbology.Interleaved2Of5
_reader.DecodeAsync(bitmap, symbologies)
Se uma imagem de código de barras contiver um código QR e Symbology.QRCode não estiver nas flags, e.SymbolFound retorna falso e e.Value está 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 essa família.
- 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 isso gastam tempo examinando a qualidade da imagem antes de perceber que a família nunca esteve na lista de marcações. DataMatrix é um caso mais acentuado: não há marcação a ser adicionada, pois o leitorWPFnão o suporta de forma alguma.
IronBarcode não requer um argumento de formato. Ele detecta automaticamente cada formato suportado 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 de IronBarcode | Leitura de código de IronBarcode |
|---|---|---|---|---|
| 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 |
| Azure Functions | 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 abrangeWinFormseASP.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 BarCode
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 BarCode
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. Sem instância para gerenciar, sem eventos para conectar, sem TaskCompletionSource para conectar padrões de callback. Aceita uma string de caminho de arquivo, um array de bytes, um Stream, ou um array 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 como 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-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Processamento em lote: Lado a lado
O processamento em lote expõe outra limitação estrutural no leitorWPFda Infragistics. Porque 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 múltiplas imagens de forma segura simultaneamente. Você deve sequenciar as chamadas:
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// field mean concurrent calls would overwrite _result before the previous decode completes
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
// field mean concurrent calls would overwrite _result before the previous decode completes
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
Imports System.Threading.Tasks
' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' field mean concurrent calls would overwrite _result before the previous decode completes
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
Tornar isso simultâneo requer infraestrutura adicional significativa: um lock, uma fila, ou um semáforo para garantir que _result não seja sobrescrito enquanto uma decodificação anterior ainda está 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() da IronBarcode é seguro para 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 múltiplos 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 aoASP.NET Core | Não disponível | Sim |
| Serviço de console/trabalhador | Não disponível | Sim |
| Docker / Linux | Não disponível | Sim |
| Azure Functions | Não disponível | Sim |
| Servidor Blazor | Não disponível | Sim |
| Detecção automática de formato | Não — deve passar as marcações de Simbologia para Decode() | Sim — formatos 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 (família de Simbologia omitida) | 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 | Assinatura anual (Infragistics Ultimate) | A partir de $749 (licença perpétua - Lite) |
Referência de Mapeamento de API
WinForms(UltraWinBarcode) para IronBarcode
| InfragisticsWinForms—UltraWinBarcode | IronBarcode |
|---|---|
new UltraWinBarcode() |
BarcodeWriter.CreateBarcode(data, encoding) |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.Code128 (parâmetro para CreateBarcode) |
barcode.Data = "ITEM-12345" |
Primeiro argumento de CreateBarcode() |
barcode.SaveTo(outputPath) |
.SaveAsPng(outputPath) |
| Não existe uma API de leitura. | BarcodeReader.Read(imagePath) |
WPF(BarcodeReader) para IronBarcode
| InfragisticsWPF— Leitor de código de barras | IronBarcode |
|---|---|
new BarcodeReader() |
Classe estática — não é necessária nenhuma instância. |
_reader.DecodeComplete += OnDecodeComplete |
Não é necessário |
_reader.DecodeAsync(bitmap, Symbology.X \|Simbologia.Y) |
Detecção automática — sem configuração |
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap, ...) |
BarcodeReader.Read(path) |
e.Value (em ReaderDecodeArgs) |
result.Value |
e.Symbology (em ReaderDecodeArgs) |
result.Format |
TaskCompletionSource<string> invólucro assíncrono |
Síncrono — sem necessidade de wrapper |
Dispose() — desanexe o manipulador de eventos |
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. Uma aplicaçãoWinFormsgera códigos de barras bem com UltraWinBarcode, mas então chega um novo requisito: escanear um código de barras de uma imagem carregada ou validar uma etiqueta antes de imprimir. 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 paraASP.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 projetoASP.NET Core.IronBarcode se instala com dotnet add package BarCode 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 BarcodeReader do InfragisticsWPFsegue com 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 do IronBarcode é seguro para threads e suporta Parallel.ForEach ou sua opção integrada MaxParallelThreads sem qualquer infraestrutura de simultaneidade.
Falhas de formato silenciosas em produção. Uma equipe descobre que códigos de barras de uma certa família vinham falhando silenciosamente há semanas porque as flags Symbology passadas para Decode() não incluíam aquela família. 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. O BarcodeReader doWPFlê códigos de barras. O UltraWinBarcode doWinFormsos 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.
O IronBarcode resolve 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 controladorASP.NET Coree a mesma chamada que você escreve em um contêiner Docker Linux. Sem eventos, sem flags, 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()`.

