IRONSOFTWAREHOME
COMPARAR COM OUTROS COMPONENTES

Código de barras Infragistics vs IronBarcode: Leitor ApenasWPFvs API Galgênica de Plataforma

Curtis Chau
Curtis Chau
Updated: 19 de maio de 2026

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);

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;
    }
}
C#

São necessárias aproximadamente 35 linhas de infraestrutura para ler um único código de barras. Conte o que está realmente acontecendo:

  1. Uma instância de BarcodeReader é criada e mantida viva como um campo.
  2. Um manipulador de eventos é configurado no construtor.
  3. Cada chamada para ReadBarcodeAsync cria uma nova TaskCompletionSource<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.
  4. A imagem deve ser carregada como um BitmapImage a partir de um Uri — não uma string de caminho de arquivo, não um array de bytes, não um stream.
  5. DecodeAsync() aciona o evento de forma assíncrona. O TaskCompletionSource é a cola entre o mundo de callbacks e o mundo de async/await.
  6. O callback extrai e.Value quando e.SymbolFound é verdadeiro.
  7. 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);

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:

PlataformaGeração InfragisticsLeitura InfragisticsGeração de IronBarcodeLeitura de código de IronBarcode
WPFControle XamBarcodeLeitor de código de barras (orientado a eventos)SimSim
WinFormsUltraWinBarcodeNÃO DISPONÍVELSimSim
ASP.NET CoreNÃO DISPONÍVELNÃO DISPONÍVELSimSim
ConsoleNÃO DISPONÍVELNÃO DISPONÍVELSimSim
Servidor BlazorNÃO DISPONÍVELNÃO DISPONÍVELSimSim
Docker / LinuxNÃO DISPONÍVELNÃO DISPONÍVELSimSim
Azure FunctionsNÃO DISPONÍVELNÃO DISPONÍVELSimSim

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";

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");

A inicialização da licença ocorre na inicialização do aplicativo, uma única vez:

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);
}

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);
    }
});

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})");
}

Comparação de recursos

RecursoCódigo de barras InfragisticsIronBarcode
Leitura de código de barrasWinFormsNão disponívelSim
Leitura de código de barrasWPFSim (orientado a eventos)Sim (síncrono)
Suporte aoASP.NET CoreNão disponívelSim
Serviço de console/trabalhadorNão disponívelSim
Docker / LinuxNão disponívelSim
Azure FunctionsNão disponívelSim
Servidor BlazorNão disponívelSim
Detecção automática de formatoNão — deve passar as marcações de Simbologia para Decode()Sim — formatos detectados automaticamente
Leitura de código de barras em PDFNão disponívelSim — nativo, sem pacote adicional
Leitura segura para threadsNão (manipulador de eventos compartilhado)Sim (API estática)
API orientada a eventos necessáriaSim (WPF)Não
Carregamento explícito de imagem (BitmapSource)SimNão — aceita caminho de arquivo, bytes, fluxo
Leitura síncronaNão (deve ser feito através de TaskCompletionSource)Sim
Processamento em loteSomente sequencial (inseguro para concorrência)Paralelização integrada
falhas de formatação silenciosasSim (família de Simbologia omitida)Não
Dependência da Suite necessáriaSim — assinatura Infragistics UltimateNão — pacote independente
Opção de licença perpétuaNão — assinatura anualSim
Custo aproximado da licençaAssinatura anual (Infragistics Ultimate)A partir de $999 (licença perpétua - Lite)

Referência de Mapeamento de API

###WinForms(UltraWinBarcode) para IronBarcode

InfragisticsWinForms—UltraWinBarcodeIronBarcode
new UltraWinBarcode()BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128BarcodeEncoding.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 barrasIronBarcode
new BarcodeReader()Classe estática — não é necessária nenhuma instância.
_reader.DecodeComplete += OnDecodeCompleteNã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íncronoSíncrono — sem necessidade de wrapper
Dispose() — desanexe o manipulador de eventosNão é necessário — nenhum exemplo ou evento
ProjetoWPFapenasQualquer 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.

Curtis Chau
Redator Técnico

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

...
Leia mais

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua demonstração ao vivo gratuita.
Booking Badge

Aprovado por milhões de engenheiros em todo o mundo.

Logotipos dos clientes da Iron Software
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.