Ir para o conteúdo do rodapé
COMPARAR COM OUTROS COMPONENTES

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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);
// 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)
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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"
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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()`.

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 ...

Leia mais

Equipe de Suporte Iron

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim