Como ler e escanear códigos de barras em C# usando .NET MAUI
Migrating from Código de barrasInfragisticsto IronBarcode
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
# WinForms generation package
dotnet remove package Infragistics.WinForms.Barcode
# WPF reading package
dotnet remove package Infragistics.WPF.BarcodeReader
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
dotnet add package IronBarcode
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;
// 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;
Imports 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";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
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);
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)
Após (IronBarcode):
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
Imports 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);
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
Imports 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;
}
}
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;
}
}
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)()
Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))
_reader.SymbologyTypes = Symbology.Code128 Or
Symbology.Code39 Or
Symbology.QRCode Or
Symbology.EAN8 Or
Symbology.EAN13 Or
Symbology.UpcA Or
Symbology.Interleaved2Of5
_reader.Decode(bitmap)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(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
Após (IronBarcode — 2 linhas):
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Return If(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}");
}
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
var first = results.FirstOrDefault();
if (first != null)
{
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}");
}
Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Dim first = results.FirstOrDefault()
If first IsNot Nothing Then
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}")
End If
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})");
}
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})");
}
Imports IronBarCode
' In a WinForms button handler or service method — same API as WPF or ASP.NET Core
Dim results = BarcodeReader.Read(imagePath)
For Each result In results
MessageBox.Show($"Found: {result.Value} ({result.Format})")
Next
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");
}
}
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");
}
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/barcode")>
Public Class BarcodeController
Inherits ControllerBase
<HttpPost("read")>
Public Function ReadBarcode(imageFile As IFormFile) As IActionResult
Using stream = imageFile.OpenReadStream()
Dim results = BarcodeReader.Read(stream)
Dim values = results.Select(Function(r) New With {Key .Value = r.Value, Key .Format = r.Format.ToString()})
Return Ok(values)
End Using
End Function
<HttpGet("generate")>
Public Function GenerateBarcode(<FromQuery> data As String) As IActionResult
Dim bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return File(bytes, "image/png")
End Function
End Class
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})");
}
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})");
}
Imports IronBarCode
' Read all barcodes from every page of a PDF
Dim results = BarcodeReader.Read("document.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
Next
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();
// 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();
Imports System.Collections.Generic
' Must process one at a time — shared _result field is not thread-safe
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()
For Each file In imageFiles
Dim value As String = Await service.ReadBarcodeAsync(file)
results.Add(value)
Next
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})");
}
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})");
}
Imports IronBarCode
' Option 1: pass an array directly —IronBarcode handles parallelization internally
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read(imageFiles.ToArray(), options)
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next
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);
});
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);
});
Imports IronBarCode
Imports System.Collections.Concurrent
' Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
Dim allValues As New ConcurrentBag(Of String)()
Parallel.ForEach(imageFiles, Sub(file)
Dim results = BarcodeReader.Read(file)
For Each r In results
allValues.Add(r.Value)
Next
End Sub)
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>();
// 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>();
' Before: service registered as IDisposable in DI container
services.AddScoped(Of InfragisticsBarcodeService)() ' implements IDisposable
' After: no registration needed — use static method directly, or wrap in thin service if preferred
' services.AddScoped(Of 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();
}
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();
}
Imports IronBarCode
Public Class BarcodeService
Public Function Read(path As String) As IEnumerable(Of String)
Return BarcodeReader.Read(path).Select(Function(r) r.Value)
End Function
Public Function Generate(data As String, encoding As BarcodeEncoding) As Byte()
Return BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData()
End Function
End Class
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);
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false
};
var results = BarcodeReader.Read(imagePath, options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = False
}
Dim 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"));
// 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"));
' 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";
// 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";
});
}
public Task<string> ReadBarcodeAsync(string imagePath)
{
return Task.Run(() =>
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
});
}
Option Strict On
Public Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
Return Task.Run(Function()
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
End Function)
End Function
Alterações no nome da propriedade
| Infragistics | IronBarcode |
|---|---|
e.Value (em ReaderDecodeArgs) |
result.Value |
e.Symbology (em ReaderDecodeArgs) |
result.Format |
barcode.Data |
Primeiro argumento de BarcodeWriter.CreateBarcode() |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.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" .
# 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" .
Analise cada partida:
- usos de
UltraWinBarcode: substitua porBarcodeWriter.CreateBarcode() - blocos
new BarcodeReader()+DecodeComplete: substitua porBarcodeReader.Read() - listas de flags
SymbologyType: apague inteiramente - carregamentos
BitmapImageusados para entrada de código de barras: substitua por caminho/fluxo/bytes direto - corpos de callback
ReaderDecodeArgs e: extraiae.Value→result.Value,e.Symbology→result.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
| Recurso | Código de barrasInfragistics | IronBarcode |
|---|---|---|
| Geração de código de barras WinForms | Sim (UltraWinBarcode) | Sim |
| Leitura de código de barras WinForms | Não disponível | Sim |
| Geração de código de barras WPF | Sim (XamBarcode) | Sim |
| Leitura de código de barras WPF | Sim (orientado a eventos) | Sim (síncrono) |
| ASP.NET Core | Não disponível | Sim |
| Serviço de console/trabalhador | Não disponível | Sim |
| Docker / Linux | Não disponível | Sim |
| Azure Functions | Não disponível | Sim |
| Servidor Blazor | Não disponível | Sim |
| Detecção automática de formato | Não — sinalizadores SymbologyType obrigatórios | Sim |
| Leitura de código de barras em PDF | Não disponível | Sim (nativo) |
| Leituras concorrentes seguras para threads | Não | Sim |
| Leitura em lote (integrada) | Não | Sim |
| Controle de correção de erros de QR Code | Não disponível | Sim |
| API estática (sem instância) | Não | Sim |
| É necessária uma assinatura do Suite. | Sim (Infragistics Ultimate, $2.399+/ano) | Não |
| Licença perpétua | Não | Sim — 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.
Perguntas frequentes
Por que devo migrar do Infragistics Barcode para o IronBarcode?
Entre os motivos comuns estão a simplificação do licenciamento (removendo a complexidade do SDK e da chave de tempo de execução), a eliminação dos limites de taxa de transferência, a obtenção de suporte nativo para PDF, a melhoria da implantação em Docker/CI/CD e a redução do código repetitivo da API em produção.
Como faço para substituir as chamadas da API da Infragistics pelo IronBarcode?
Substitua o código padrão de criação de instâncias e licenciamento por `IronBarCode.License.LicenseKey = "key"`. Substitua as chamadas de leitura por `BarcodeReader.Read(path)` e as chamadas de gravação por `BarcodeWriter.CreateBarcode(data, encoding)`. Os métodos estáticos não exigem gerenciamento de instâncias.
Quanta alteração de código ocorre ao migrar do Infragistics Barcode para o IronBarcode?
A maioria das migrações resulta em menos linhas de código. O código repetitivo de licenciamento, os construtores de instância e a configuração explícita de formato são removidos. As operações principais de leitura/gravação são mapeadas para equivalentes mais curtos em IronBarcode, com objetos de resultado mais limpos.
Preciso manter o Infragistics Barcode e o IronBarcode instalados durante a migração?
Não. A maioria das migrações são substituições diretas, e não operações paralelas. Migre uma classe de serviço por vez, substitua a referência do NuGet e atualize os padrões de instanciação e chamada de API antes de passar para a próxima classe.
Qual é o nome do pacote NuGet para IronBarcode?
O pacote é 'IronBarCode' (com B e C maiúsculos). Instale-o com 'Install-Package IronBarCode' ou 'dotnet add package IronBarCode'. A diretiva using no código é 'using IronBarCode;'.
Como o IronBarcode simplifica a implantação do Docker em comparação com o Infragistics Barcode?
IronBarcode é um pacote NuGet sem arquivos SDK externos ou configuração de licença montada. No Docker, defina a variável de ambiente IRONBARCODE_LICENSE_KEY e o pacote cuidará da validação da licença na inicialização.
O IronBarcode detecta automaticamente todos os formatos de código de barras após a migração do Infragistics?
Sim. O IronBarcode detecta automaticamente a simbologia em todos os formatos suportados. A enumeração explícita de BarcodeTypes não é necessária. Se o formato já for conhecido e o desempenho for importante, o BarcodeReaderOptions permite restringir o espaço de busca como uma otimização.
O IronBarcode consegue ler códigos de barras de PDFs sem uma biblioteca separada?
Sim. O método `BarcodeReader.Read("document.pdf")` processa arquivos PDF nativamente. Os resultados incluem o número da página, o formato, o valor e a confiança de cada código de barras encontrado. Não é necessária nenhuma etapa externa de renderização de PDF.
Como o IronBarcode lida com o processamento paralelo de códigos de barras?
Os métodos estáticos do IronBarcode são sem estado e thread-safe. Use Parallel.ForEach diretamente em listas de arquivos sem gerenciamento de instâncias por thread. BarcodeReaderOptions.MaxParallelThreads controla o orçamento interno de threads.
Quais propriedades de resultado são alteradas ao migrar do Infragistics Barcode para o IronBarcode?
Renomeações comuns: BarcodeValue torna-se Value, BarcodeType torna-se Format. Os resultados do IronBarcode também incluem Confidence e PageNumber. Uma função de busca e substituição em toda a solução lida com as renomeações no código de processamento de resultados existente.
Como configuro o licenciamento do IronBarcode em um pipeline de CI/CD?
Armazene IRONBARCODE_LICENSE_KEY como um segredo de pipeline e atribua IronBarCode.License.LicenseKey no código de inicialização do aplicativo. Um único segredo abrange todos os ambientes, incluindo desenvolvimento, teste, homologação e produção.
O IronBarcode suporta a geração de códigos QR com estilos personalizados?
Sim. O método QRCodeWriter.CreateQrCode() suporta cores personalizadas através do método ChangeBarCodeColor(), incorporação de logotipo através do método AddBrandLogo(), níveis configuráveis de correção de erros e múltiplos formatos de saída, incluindo PNG, JPG, PDF e fluxo de dados.

