IRONSOFTWAREHOME
VÍDEOS

Migrating from Código de barrasInfragisticsto IronBarcode

Curtis Chau
Curtis Chau
Updated: 1 de agosto de 2026

A maioria das migrações de código de barras daInfragisticsocorre porque a equipe precisava de leitura de código de barras em um projeto onde apenas a geração estava disponível — WinForms,ASP.NET Coreou qualquer projeto fora do WPF — ou porque a API de leitura do WPF orientada a eventos se mostrou muito frágil para uso em produção. O padrão de ponte TaskCompletionSource, o campo compartilhado _result que torna inseguras as chamadas concorrentes, e as falhas silenciosas provenientes da falta de flags SymbologyType são todos motivos comuns para que as equipes procurem uma alternativa.

Este guia descreve todo o processo de migração: remoção dos pacotes de código de barras da Infragistics, substituição do código de geração e leitura nos contextos WinForms e WPF e adição da funcionalidade de código de barras a tipos de projeto nos quais aInfragisticsnão oferecia suporte algum.

Início rápido

Passo 1: Remova os pacotes de código de barras da Infragistics

Remova os pacotes NuGet de código de barras daInfragisticsdo seu projeto. Dependendo dos alvos que você estava usando:

# WinForms generation package
dotnet remove package Infragistics.WinForms.Barcode

# WPF reading package
dotnet remove package Infragistics.WPF.BarcodeReader
SHELL

Se o seu arquivo de projeto fizer referência a ambos, remova ambos. A licençaInfragisticsUltimate não é afetada pela remoção de pacotes específicos de código de barras se você tiver outros componentesInfragisticsem uso.

Passo 2: Instale o IronBarcode

dotnet add package IronBarcode
SHELL

IronBarcode é um pacote único que funciona em WinForms, WPF, ASP.NET Core, console, Blazor Server, Docker, Azure Functions e AWS Lambda. Você não precisa de pacotes separados para cada framework.

Etapa 3: Atualizar Namespaces

Substitua namespaces de código de barrasInfragisticspor IronBarCode (B maiúsculo, C maiúsculo):

// Remove these:
// using Infragistics.Win.UltraWinBarcode;
// using Infragistics.Controls.Barcodes;
// using System.Windows.Media.Imaging; // if only used for barcode BitmapImage loading

// Add this:
using IronBarCode;

Etapa 4: Inicializar a licença

Adicione a inicialização da licença uma vez na inicialização do aplicativo — Program.cs, App.xaml.cs, ou sua raiz de composição DI:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

Exemplos de migração de código

Geração de WinForms: UltraWinBarcode para BarcodeWriter

O padrão de geração WinForms se mapeia perfeitamente para o BarcodeWriter do IronBarcode:

Antes (Infragistics WinForms):

using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);

Após (IronBarcode):

// NuGet: dotnet add package IronBarcode
using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .SaveAsPng(outputPath);

O valor enum Symbology doInfragisticsé movido para o enum BarcodeEncoding, que é um parâmetro do CreateBarcode() ao invés de uma atribuição de propriedade. Os dados se tornam o primeiro argumento. SaveTo() se torna .SaveAsPng(), .SaveAsJpeg(), .SaveAsSvg(), ou .SaveAsPdf() dependendo do seu formato de saída.

Se precisar redimensionar o código de barras antes de salvar:

using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng(outputPath);

Leitura orientada a eventos no WPF: da classe de serviço para duas linhas

Esta é a redução mais significativa na migração. O padrão de leitura WPF daInfragisticsrequer uma classe de serviço completa:

Antes (Infragistics WPF — ~35 linhas):

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

    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    _reader.SymbologyTypes = Symbology.Code128 |
                             Symbology.Code39 |
                             Symbology.QRCode |
                             Symbology.EAN8 |
                             Symbology.EAN13 |
                             Symbology.UpcA |
                             Symbology.Interleaved2Of5;

    _reader.Decode(bitmap);
    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.Value ?? "No barcode found");
}

public void Dispose()
{
    if (_reader != null)
    {
        _reader.DecodeComplete -= OnDecodeComplete;
        _reader = null;
    }
}

Após (IronBarcode — 2 linhas):

using IronBarCode;

var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";

Toda a classe de serviço — gerenciamento de instância, conexão de eventos, TaskCompletionSource, carregamento BitmapImage, Dispose() — foi removida. BarcodeReader.Read() é síncrono, estático e aceita um caminho de arquivo diretamente.

Se você também estivesse retornando o tipo de simbologia:

using IronBarCode;

var results = BarcodeReader.Read(imagePath);
var first = results.FirstOrDefault();
if (first != null)
{
    Console.WriteLine($"Value: {first.Value}, Format: {first.Format}");
}

result.Value substitui e.Value. result.Format substitui e.Symbology.

Adicionando leitura ao WinForms (anteriormente impossível)

Se você estava em um projeto WinForms que só tinha geração de dados, agora a leitura também está disponível no mesmo pacote:

using IronBarCode;

// In a WinForms button handler or service method — same API as WPF or ASP.NET Core
var results = BarcodeReader.Read(imagePath);
foreach (var result in results)
{
    MessageBox.Show($"Found: {result.Value} ({result.Format})");
}

Sem pacotes adicionais, sem configuração específica do framework. A mesma chamada BarcodeReader.Read() funciona em WinForms como em WPF.

Endpoint doASP.NET Core(anteriormente impossível)

A geração e leitura de códigos de barras em um controladorASP.NET Corenão era possível com os pacotes da Infragistics. Com IronBarcode:

using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
    [HttpPost("read")]
    public IActionResult ReadBarcode(IFormFile imageFile)
    {
        using var stream = imageFile.OpenReadStream();
        var results = BarcodeReader.Read(stream);
        var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
        return Ok(values);
    }

    [HttpGet("generate")]
    public IActionResult GenerateBarcode([FromQuery] string data)
    {
        var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
                                 .ResizeTo(400, 100)
                                 .ToPngBinaryData();
        return File(bytes, "image/png");
    }
}

BarcodeReader.Read() aceita um Stream diretamente — não há necessidade de salvar o upload no disco primeiro.

Leitura de código de barras em PDF

O IronBarcode lê códigos de barras de documentos PDF nativamente — sem necessidade de pacote adicional:

using IronBarCode;

// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("document.pdf");
foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}

AInfragisticsnão tinha equivalente — a leitura de código de barras em PDF exigia a conversão externa das páginas do PDF em imagens antes da digitalização.

Processamento em lote: do sequencial ao paralelo

Antes (Infragistics — sequencial, não seguro para paralelização em concorrência):

// Must process one at a time — shared _result field is not thread-safe
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}

service.Dispose();

Após (IronBarcode — paralelo, seguro para threads):

using IronBarCode;

// Option 1: pass an array directly —IronBarcode handles parallelization internally
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles.ToArray(), options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
C#
using IronBarCode;
using System.Collections.Concurrent;

// Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
var allValues = new ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var results = BarcodeReader.Read(file);
    foreach (var r in results)
        allValues.Add(r.Value);
});

Removendo o padrão de descarte

Se seu código tinha implementações IDisposable em torno doInfragisticsBarcodeReader, estas podem ser removidas completamente. O BarcodeReader do IronBarcode é uma classe estática. Não há instância a criar, handler de evento a desanexar, e nenhuma Dispose() a chamar.

// Before: service registered as IDisposable in DI container
services.AddScoped<InfragisticsBarcodeService>(); // implements IDisposable

// After: no registration needed — use static method directly, or wrap in thin service if preferred
// services.AddScoped<IBarcodeService, IronBarcodeService>();

Um serviço de encapsulamento simples para fins de injeção de dependência é bastante direto:

using IronBarCode;

public class BarcodeService
{
    public IEnumerable<string> Read(string path)
        => BarcodeReader.Read(path).Select(r => r.Value);

    public byte[] Generate(string data, BarcodeEncoding encoding)
        => BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData();
}

Sem injeção de construtor, sem Dispose(), sem gerenciamento de eventos.

Problemas comuns de migração

Sinalizadores de tipo de simbologia removidos

A propriedade SymbologyTypes no leitor WPF doInfragisticsexigia que você enumerasse todos os formatos de código de barras que desejava suportar. O IronBarcode não tem equivalente — ele detecta automaticamente todos os mais de 50 formatos suportados em cada leitura.

Isto tem um efeito colateral importante: se um formato de código de barras particular estava falhando silenciosamente antes porque sua flag SymbologyType estava faltando da lista, o IronBarcode agora irá encontrá-lo. Você poderá observar valores de código de barras aparecendo na produção que antes eram ignorados silenciosamente. Esse é o comportamento correto — esses códigos de barras sempre estiveram lá.

Se você precisar restringir quais formatos são retornados (por razões de desempenho ou ambiguidade), BarcodeReaderOptions suporta isso:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = false
};

var results = BarcodeReader.Read(imagePath, options);

Não é necessário carregar a imagem bitmap.

O leitor WPF doInfragisticsexigia o carregamento de imagens como objetos BitmapSource via new BitmapImage(new Uri(path, UriKind.Absolute)).IronBarcode aceita diretamente strings de caminho de arquivo, arrays de bytes e fluxos de dados:

// All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png");
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"));
BarcodeReader.Read(File.OpenRead("path/to/image.png"));

Você pode remover quaisquer importações using System.Windows.Media.Imaging; que estavam ali apenas para carregamento de imagens relacionadas a código de barras.

Padrão TaskCompletionSource removido

O campo TaskCompletionSource<string> que conectava o callback de evento DecodeComplete em código assíncrono foi removido completamente. BarcodeReader.Read() é síncrono e retorna seus resultados diretamente.

Se o seu código chamador era await service.ReadBarcodeAsync(path), você pode simplificar para:

// Before
var value = await service.ReadBarcodeAsync(imagePath);

// After
var value = BarcodeReader.Read(imagePath).FirstOrDefault()?.Value ?? "No barcode found";

Se você deseja preservar uma interface assíncrona para chamadas subsequentes sem bloquear uma thread:

public Task<string> ReadBarcodeAsync(string imagePath)
{
    return Task.Run(() =>
    {
        var results = BarcodeReader.Read(imagePath);
        return results.FirstOrDefault()?.Value ?? "No barcode found";
    });
}

Alterações no nome da propriedade

InfragisticsIronBarcode
e.Value (em ReaderDecodeArgs)result.Value
e.Symbology (em ReaderDecodeArgs)result.Format
barcode.DataPrimeiro argumento de BarcodeWriter.CreateBarcode()
barcode.Symbology = Symbology.Code128BarcodeEncoding.Code128 (parâmetro)
barcode.SaveTo(path).SaveAsPng(path) / .SaveAsJpeg(path) / .SaveAsSvg(path)

Lista de verificação para migração

Use esses padrões grep para encontrar todas as utilizações de código de barras daInfragisticsem sua base de código:

# Namespace references
grep -r "Infragistics.WinForms.Barcode\|Infragistics.Win.UltraWinBarcode" --include="*.cs" .
grep -r "Infragistics.Controls.Barcodes" --include="*.cs" .
grep -r "Infragistics.WPF.BarcodeReader" --include="*.csproj" .

# WinForms generation types
grep -r "UltraWinBarcode" --include="*.cs" .
grep -r "Symbology\.Code" --include="*.cs" .
grep -r "barcode\.SaveTo(" --include="*.cs" .

# WPF reading types and patterns
grep -r "new BarcodeReader()" --include="*.cs" .
grep -r "DecodeComplete" --include="*.cs" .
grep -r "ReaderDecodeArgs" --include="*.cs" .
grep -r "SymbologyType\." --include="*.cs" .
grep -r "e\.Value\|ReaderDecodeArgs" --include="*.cs" .
grep -r "BitmapImage" --include="*.cs" .

# TaskCompletionSource usage (likely barcode-related if near above patterns)
grep -r "TaskCompletionSource" --include="*.cs" .
SHELL

Analise cada partida:

  • usos de UltraWinBarcode: substitua por BarcodeWriter.CreateBarcode()
  • blocos new BarcodeReader() + DecodeComplete: substitua por BarcodeReader.Read()
  • listas de flags SymbologyType: apague inteiramente
  • carregamentos BitmapImage usados para entrada de código de barras: substitua por caminho/fluxo/bytes direto
  • corpos de callback ReaderDecodeArgs e: extraia e.Valueresult.Value, e.Symbologyresult.Format
  • em classes de serviço de código de barras IDisposable: remova se o único recurso descartável era _reader

Comparação de recursos

RecursoCódigo de barrasInfragisticsIronBarcode
Geração de código de barras WinFormsSim (UltraWinBarcode)Sim
Leitura de código de barras WinFormsNão disponívelSim
Geração de código de barras WPFSim (XamBarcode)Sim
Leitura de código de barras WPFSim (orientado a eventos)Sim (síncrono)
ASP.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 — sinalizadores SymbologyType obrigatóriosSim
Leitura de código de barras em PDFNão disponívelSim (nativo)
Leituras concorrentes seguras para threadsNãoSim
Leitura em lote (integrada)NãoSim
Controle de correção de erros de QR CodeNão disponívelSim
API estática (sem instância)NãoSim
É necessária uma assinatura do Suite.Sim (Infragistics Ultimate, $2.399+/ano)Não
Licença perpétuaNãoSim — a partir de US$ 749

Principais benefícios após a migração

Leitura de código de barras em WinForms. Se a migração foi impulsionada por um requisito de leitura de WinForms, este é o resultado principal: BarcodeReader.Read(imagePath) compila e roda em WinForms sem configuração adicional.

Suporte paraASP.NET Coree console. APIs da Web, serviços em segundo plano e ferramentas de console agora podem gerar e ler códigos de barras usando o mesmo pacote. Se você mantinha cadeias de ferramentas separadas ou soluções alternativas para esses tipos de projeto, elas não existem mais.

Sem boilerplate de manipulador de eventos. O manipulador DecodeComplete, a ponte TaskCompletionSource, o carregamento BitmapImage, e a limpeza Dispose() são todos removidos. A lógica do código de barras é o que resta.

Sem especificação de simbologia. Formatos que estavam falhando silenciosamente devido à falta de flags SymbologyType agora serão detectados corretamente. A detecção automática abrange todos os mais de 50 formatos sem necessidade de configuração.

Mesma classe de serviço em todos os tipos de projeto. Um wrapper BarcodeService único usando BarcodeReader.Read() e BarcodeWriter.CreateBarcode() pode ser compartilhado entre WinForms, WPF, ASP.NET Core, e qualquer outro projeto na solução. Não há implementações específicas para cada framework.

Não é necessária uma assinatura doInfragisticsUltimate apenas para a funcionalidade de código de barras. Se o suporte a código de barras era o único motivo para o seu projeto ter uma assinatura doInfragisticsUltimate, ou se foi um fator importante na decisão, o IronBarcode é um pacote independente com opções de licenciamento perpétuo a partir de US$ 749 para um único desenvolvedor.

A migração em si é mecânica, uma vez que você tenha localizado todos os usos de código de barras da Infragistics. A parte mais envolvente é a substituição da classe de serviço WPF, e mesmo isso se resume a remover a classe e substituir as chamadas por BarcodeReader.Read(). A migração de geração consiste na renomeação de uma propriedade/método para um único usuário. O que você obtém em troca é uma API única e consistente que funciona em todos os tipos de projeto que você precisar.

Observe: Infragistics é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado pela Infragistics. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.
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.