Saltar al pie de página
COMPARAR CON OTROS COMPONENTES

Dynamsoft Barcode Reader vs IronBarcode: Generador de QR para VeriFactu en España sin Validación Online

Código de barras de Infragistics vs IronBarcode: Lector Solo-WPF vs API Multi-Plataforma

La lectura de códigos de barras de Infragistics funciona en WPF. Llegar allí requiere una instancia de BarcodeReader, un manejador de eventos DecodeComplete, un TaskCompletionSource<string> para conectar el callback al código asincrónico, una carga BitmapImage desde un URI, y un OR bitwise de cada familia Symbology que deseas soportar — pasado como segundo argumento a Decode(). Omitir una familia — digamos, dejar Symbology.QRCode fuera de las banderas — y cualquier código QR en tus imágenes regresará sin resultado. Sin excepción. Sin previo aviso. Un resultado vacío.

Ese es el lado de WPF. En el lado de WinForms, el paquete Infragistics.Win.UltraWinBarcode contiene controles de generación pero ninguna clase de lector en absoluto. Si necesita leer códigos de barras en un proyecto WinForms, no hay nada en el paquete de códigos de barras de Infragistics que pueda utilizar. Lo mismo se aplica a cualquier controlador de ASP.NET Core, herramienta de consola, función de Azure, componente de Servidor Blazor o contenedor Docker. La compatibilidad con códigos de barras de Infragistics se encuentra dentro de los límites del marco de la interfaz de usuario: WPFobtiene la generación y la lectura controlada por eventos; WinFormssolo obtiene generación; Todo lo demás no recibe nada.

Esta comparación examina qué significa esa división en la práctica y, a continuación, analiza cómo IronBarcode gestiona el mismo trabajo con una única API estática que se comporta de forma idéntica en todos los tipos de proyectos.

Comprensión de la compatibilidad con códigos de barras de Infragistics

Infragistics es uno de los proveedores de componentes de interfaz de usuario .NET más consolidados. La Suite Infragistics Ultimate —la suscripción que incluye la funcionalidad de códigos de barras— contiene cientos de controles para WinForms, WPF, ASP.NET, Blazor y dispositivos móviles. Para los equipos que ya utilizan cuadrículas, gráficos o programadores de Infragistics, los controles de códigos de barras son una incorporación lógica, ya que ya están pagando por la suscripción.

Sin embargo, la compatibilidad con códigos de barras no se basa en una biblioteca unificada. Se trata de dos conjuntos separados con capacidades distintas que solo se superponen parcialmente.

WinForms: UltraWinBarcode

El paquete Infragistics.Win.UltraWinBarcode proporciona generación de códigos de barras en aplicaciones WinFormsa través de la clase UltraWinBarcode. La API es sencilla:

// Infragistics WinFormsgeneration
using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
// Infragistics WinFormsgeneration
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

Configuras una simbología, asignas datos, llamas a SaveTo(). En escenarios de generación únicamente en WinForms, esto funciona. El enumerado Symbology cubre formatos comunes: Code128, Code39, QR, EAN13 y otros.

Lo que no existe en esta asamblea es un lector. No hay clase UltraBarcodeReader. No hay método Scan(). Si intentas leer una imagen de código de barras en una aplicación WinFormsusando solo el paquete Infragistics.Win.UltraWinBarcode, no hay nada que llamar.

WPF: XamBarcode y BarcodeReader

El lado de WPFincluye tanto un control de generación (XamBarcode) como una clase de lector separado (BarcodeReader en Infragistics.Controls.Barcodes, de la ensamblado Infragistics.WPF.BarcodeReader). El lector funciona mediante eventos y está diseñado en torno al modelo de subprocesos e imágenes de WPF.

Leer un código de barras en WPFrequiere conectar el evento DecodeComplete, cargar imágenes como objetos BitmapSource en lugar de rutas de archivo, y convertir el patrón de callback en algo que pueda esperarse si tu código es asincrónico.

ASP.NET Core, Consola, Docker: Nada

No hay un paquete de códigos de barras de Infragistics que se dirija a net8.0 sin ensamblados de interfaz de usuario WPFo WinForms. Los proyectos ASP.NET Core, las herramientas de consola, Azure Functions, Servidor Blazor y los contenedores Docker de Linux no disponen de la opción de código de barras de Infragistics. La biblioteca está integrada en el marco de la interfaz de usuario.

El patrón de lectura de WPF

Así es como se ve realmente la lectura de un código de barras en WPFcon Infragistics:

// Infragistics WPFreading: event-driven, requires WPFassemblies
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 as WPFBitmapSource — 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;
    }
}
// Infragistics WPFreading: event-driven, requires WPFassemblies
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 as WPFBitmapSource — 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 WPFBitmapSource — 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

Esto supone aproximadamente 35 líneas de infraestructura para leer un solo código de barras. Cuenta lo que realmente está sucediendo:

  1. Se crea una instancia de BarcodeReader y se mantiene viva como un campo.
  2. En el constructor se incluye un controlador de eventos.
  3. Cada llamada a ReadBarcodeAsync crea un nuevo TaskCompletionSource<string> asignado a un campo compartido — lo que significa que este servicio no es seguro para hilos tal como está escrito. Las llamadas concurrentes sobrescribirían _result.
  4. La imagen debe cargarse como BitmapImage desde un Uri — no una ruta de archivo, no un arreglo de bytes, no un flujo.
  5. DecodeAsync() dispara el evento de forma asincrónica. El TaskCompletionSource es el pegamento entre el mundo de callbacks y el mundo async/await.
  6. El callback extrae e.Value cuando e.SymbolFound es verdadero.
  7. El método Dispose() debe desconectar el manejador de eventos para evitar pérdidas de memoria.

Ninguna de estas lógicas tiene que ver con códigos de barras. Se trata de la infraestructura necesaria para que funcione correctamente con el diseño basado en eventos. En código de producción, también deberías manejar el caso donde _result.Task nunca se completa — un tiempo de espera, un token de cancelación, o alguna protección contra que el evento nunca se dispare.

La brecha de WinForms

La brecha en WinFormses más pronunciada de lo que podría parecer en un principio. Los equipos que desarrollan aplicaciones WinFormssuelen llegar a la página de códigos de barras de Infragistics esperando una experiencia simétrica: generación y lectura en ambos marcos de interfaz de usuario. Lo que encuentran es que Infragistics.Win.UltraWinBarcode no proporciona capacidad de lectura en absoluto.

Esto no es un error de documentación. El ensamblado de códigos de barras de WinFormsfue diseñado como un control de generación. Si necesita escanear códigos de barras en una aplicación WinForms, por ejemplo, leer un código de barras de un archivo de imagen que sube un usuario o decodificar un código de barras de la señal de una cámara, no podrá hacerlo con las herramientas de códigos de barras de Infragistics. Sería necesario incorporar una biblioteca completamente aparte, en cuyo caso la justificación para utilizar Infragistics para la generación se debilita.

La asimetría crea una brecha de cobertura para equipos que ejecutan proyectos de marco mixto. Un equipo que dispone tanto de un cliente de escritorio WPFcomo de un cliente de escritorio WinFormsno puede utilizar Infragistics para la lectura de códigos de barras en el proyecto WinForms, aunque lo esté utilizando en todas partes.

Especificación de simbología: Un modo de fallo silencioso

El argumento de banderas Symbology para Decode() en el lector WPFmerece su propia sección porque su modo de fallo es silencioso: una bandera faltante devuelve un resultado vacío sin error.

Cuando llama al lector, aplica OR a cada familia de códigos de barras que desea buscar. Las familias compatibles son QR, EAN/UPC (EanUpc), Code 39 (Code39Ext), Code 128, MaxiCode e Interleaved 2 of 5 — DataMatrix no está en el enum en absoluto, por lo que el lector WPFno puede descodificarlo. Symbology.All cubre todo en el 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

Si una imagen de código de barras contiene un código QR y Symbology.QRCode no está en las banderas, e.SymbolFound regresa falso y e.Value está vacío. El evento de decodificación aún se activa. No se produce ninguna excepción. La persona que llama recibe el mensaje "No se encontró ningún código de barras" y no tiene ninguna indicación de si la imagen era ilegible o simplemente no estaba configurada.

En la práctica, esto significa:

  • La configuración inicial funciona correctamente para los formatos que el desarrollador ha probado.
  • Se introduce un nuevo formato de código de barras en el sistema (un proveedor cambia el tipo de etiqueta, una nueva línea de productos utiliza una simbología diferente).
  • El lector falla silenciosamente para todas las imágenes con esa familia.
  • El error se ve idéntico a "la imagen no tiene código de barras" en lugar de "formato no configurado".

Los equipos que depuran esto pasan tiempo examinando la calidad de la imagen antes de darse cuenta de que la familia nunca estuvo en la lista de flags. DataMatrix es un caso más claro: no hay un flag para agregar, porque el lector de WPFno lo soporta en absoluto.

IronBarcode no requiere un argumento de formato. Detecta automáticamente cada formato compatible en cada lectura. No hay bandera que olvidar.

La matriz de la plataforma

La brecha de capacidades entre plataformas es la forma más clara de comprender la limitación arquitectónica:

Plataforma Generación Infragistics Lectura de infragística Generación de IronBarcode Lectura de IronBarcode
WPF Control XamBarcode Lector de códigos de barras (controlado por eventos)
WinForms Código de barras UltraWin NO DISPONIBLE
ASP.NET Core NO DISPONIBLE NO DISPONIBLE
Consola NO DISPONIBLE NO DISPONIBLE
Servidor Blazor NO DISPONIBLE NO DISPONIBLE
Docker / Linux NO DISPONIBLE NO DISPONIBLE
Azure Functions NO DISPONIBLE NO DISPONIBLE

Esta tabla ilustra por qué los equipos que ejecutan aplicaciones que van más allá de las aplicaciones de escritorio WPFpuras consideran que la compatibilidad con códigos de barras de Infragistics es insuficiente. En el momento en que un proyecto abarca WinFormsy ASP.NET Core, o WPFy un servicio de trabajo en segundo plano, la biblioteca de códigos de barras de Infragistics solo cubre una parte del código base.

Entendiendo IronBarcode

IronBarcode es una biblioteca de códigos de barras específica para .NET que no depende de WinForms, WPFni de ningún framework de interfaz de usuario. El mismo paquete NuGet , el mismo espacio de nombres y la misma API funcionan en cualquier proyecto .NET : WinForms, WPF, ASP.NET Core, consola, 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() es un método estático. No hay instancia que gestionar, no hay evento que conectar, no hay TaskCompletionSource para conectar patrones de callbacks. Acepta una cadena de ruta de archivo, un arreglo de bytes, un Stream, o un arreglo de cualquiera de ellos para procesamiento por lotes.

Para generación, BarcodeWriter.CreateBarcode() devuelve un objeto de código de barras que puedes guardar en PNG, JPEG, SVG, o obtener como datos binarios:

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

La inicialización de la licencia se realiza al iniciar la aplicación, una sola vez:

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

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Comparación: Procesamiento por lotes

El procesamiento por lotes pone de manifiesto otra limitación estructural del lector WPFde Infragistics. Debido a que el lector utiliza un manejador de eventos compartido y el campo _result se sobrescribe en cada llamada, la clase de servicio mostrada arriba no puede procesar con seguridad múltiples imágenes simultáneamente. Debes secuenciar las llamadas:

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

Hacer esto concurrente requiere una infraestructura adicional significativa: un bloqueo, una cola, o un semáforo para asegurar que _result no sea sobrescrito mientras una decodificación previa aún está en curso. Se trata de un problema de concurrencia complejo para lo que debería ser una simple operación de entrada/salida.

La estática BarcodeReader.Read() de IronBarcode es segura para hilos. Se puede llamar desde varios hilos simultáneamente sin ninguna sincronización adicional. Para cargas de trabajo por lotes, puedes usar Parallel.ForEach directamente:

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

También puedes pasar múltiples archivos en una sola llamada y configurar el paralelismo a travé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

Comparación de características

Característica Código de barras de Infragistics IronBarcode
Lectura de códigos de barras en WinForms No disponible
Lectura de códigos de barras en WPF Sí (basado en eventos) Sí (síncrono)
Compatibilidad con ASP.NET Core No disponible
Consola / Servicio de trabajador No disponible
Docker / Linux No disponible
Azure Functions No disponible
Servidor Blazor No disponible
Detección de formato automático No — debe pasar flags de Simbología a Decode() Sí — formatos auto-detectados
Lectura de códigos de barras PDF No disponible Sí, es nativo, sin paquete adicional.
Lectura segura para subprocesos No (controlador de eventos compartido) Sí (API estática)
Se requiere una API basada en eventos. Sí (WPF) No
Carga explícita de imagen (BitmapSource) No — acepta ruta de archivo, bytes, flujo
Lectura sincrónica No (debe conectarse a través de TaskCompletionSource)
Procesamiento por lotes Solo secuencial (inseguro para concurrencia) Paralelización integrada
Fallos de formato silenciosos Sí (familia de Simbología omitida) No
Dependencia de Suite requerida Sí — Suscripción a Infragistics Ultimate No — paquete independiente
Opción de licencia perpetua No — suscripción anual
Costo aproximado de la licencia Suscripción anual (Infragistics Ultimate) Desde $749 perpetuo (Lite)

Referencia de mapeo de API

WinForms(UltraWinBarcode) a IronBarcode

Infragistics WinForms- UltraWinBarcode IronBarcode
new UltraWinBarcode() BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128 BarcodeEncoding.Code128 (parámetro para CreateBarcode)
barcode.Data = "ITEM-12345" Primer argumento de CreateBarcode()
barcode.SaveTo(outputPath) .SaveAsPng(outputPath)
No existe ninguna API de lectura. BarcodeReader.Read(imagePath)

WPF(BarcodeReader) a IronBarcode

Infragistics WPF— Lector de códigos de barras IronBarcode
new BarcodeReader() Clase estática: no se necesita instancia.
_reader.DecodeComplete += OnDecodeComplete No es necesario
_reader.DecodeAsync(bitmap, Symbology.X |Simbología.Y) Detección automática: no requiere configuración.
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap, ...) BarcodeReader.Read(path)
e.Value (en ReaderDecodeArgs) result.Value
e.Symbology (en ReaderDecodeArgs) result.Format
Envoltura asincrónica TaskCompletionSource<string> Síncrono: no se necesita ningún contenedor.
Dispose() — desconectar manejador de eventos No es necesario: no hay instancia ni evento.
Solo para proyectos WPF Cualquier tipo de proyecto .NET

Cuando los equipos cambian

Existen varias situaciones específicas que, de forma sistemática, llevan a los equipos a abandonar el soporte de códigos de barras de Infragistics.

Se requiere lectura en WinForms. Este es el escenario más común. Una aplicación WinFormsgenera códigos de barras bien con UltraWinBarcode pero luego llega un nuevo requisito: escanear un código de barras desde una imagen subida o validar una etiqueta antes de imprimir. No existe una API de lectura de Infragistics para WinForms. El equipo opta por incorporar una segunda biblioteca o bien reemplaza el código de generación por uno que haga ambas cosas.

Nuevo punto final de ASP.NET Core. Una aplicación de escritorio con generación de códigos de barras de Infragistics ahora cuenta con una API web complementaria. El punto final debe aceptar la carga de imágenes y devolver valores de códigos de barras, o bien generar imágenes de códigos de barras bajo demanda. Ninguna de las dos opciones es posible con los paquetes de códigos de barras de Infragistics en un proyecto ASP.NET Core. IronBarcode se instala con dotnet add package BarCode y funciona en una acción de controlador de la misma manera que funciona en un método de consola.

Implementación en Docker. Se está utilizando una aplicación WPFcomo contenedor o extrayendo su lógica de código de barras a un microservicio. Los ensamblados WPFno se ejecutan en contenedores Docker de Linux. La BarcodeReader de WPFde Infragistics va con ellos. IronBarcode se dirige de forma nativa a Linux x64.

Rendimiento del procesamiento por lotes. Un flujo de trabajo procesa cientos o miles de imágenes de códigos de barras. El lector de Infragistics, que funciona mediante eventos, los procesa secuencialmente. El lector estático de IronBarcode es seguro para hilos y soporta Parallel.ForEach o su opción incorporada MaxParallelThreads sin ninguna infraestructura de concurrencia.

Fallos de formato silenciosos en producción. Un equipo descubre que los códigos de barras de cierta familia han estado fallando silenciosamente durante semanas porque las banderas Symbology pasadas a Decode() no incluían esa familia. El cambio a la detección automática elimina por completo el modo de fallo.

Reducción del alcance de la suscripción a Infragistics. Algunos equipos pagan el precio de la suscripción Infragistics Ultimate precisamente porque incluye controles de código de barras. Cuando el requisito del código de barras es el único motivo de la suscripción, merece la pena evaluar una biblioteca de códigos de barras especializada a una fracción del coste.

Conclusión

El problema principal con la compatibilidad de Infragistics con los códigos de barras es de índole arquitectónica, más que funcional. El BarcodeReader de WPFsí lee códigos de barras. El UltraWinBarcode de WinFormssí los genera. Dentro del contexto específico para el que se diseñó cada componente, estos funcionan correctamente. El problema es que esos dos contextos no cubren lo que la mayoría de los equipos .NET realmente necesitan.

En una aplicación .NET moderna, la función de código de barras rara vez reside en un único marco de interfaz de usuario. Aparece en un cliente WinFormsy en una API web. Se ejecuta en un contenedor Docker y en un ordenador de escritorio. Necesita escanear imágenes subidas a un punto final ASP.NET e imprimir etiquetas desde una herramienta de consola. Nada de eso funciona con los paquetes de códigos de barras de Infragistics, y el patrón basado en eventos del lector WPF, con sus indicadores de simbología obligatorios, añade una complejidad significativa incluso en el único contexto en el que sí funciona.

IronBarcode resuelve el mismo problema —la lectura y generación de códigos de barras— con una API estática que se compila y ejecuta de forma idéntica en cualquier tipo de proyecto .NET . La llamada BarcodeReader.Read() que escribes en una clase de servicio WPFes la misma llamada que escribes en un controlador de ASP.NET Corey la misma llamada que escribes en un contenedor de Docker Linux. Sin eventos, sin banderas, sin TaskCompletionSource. La lógica del código de barras consta de dos líneas en lugar de treinta y cinco, y esas dos líneas funcionan en todas partes.

Preguntas Frecuentes

¿Qué es Infragistics BarCode?

Infragistics Barcode es una biblioteca de códigos de barras .NET para generar y leer códigos de barras en aplicaciones C#. Es una de las varias alternativas que los desarrolladores evalúan cuando seleccionan una solución de código de barras para proyectos .NET.

¿Cuáles son las principales diferencias entre Infragistics Barcode e IronBarcode?

IronBarcode utiliza una API estática y sin estado que no requiere gestión de instancias, mientras que Infragistics BarCode suele requerir la creación y configuración de instancias antes de su uso. IronBarcode también ofrece compatibilidad nativa con PDF, detección automática de formatos y licencia de clave única en todos los entornos.

¿Es más fácil licenciar IronBarcode que Infragistics BarCode?

IronBarcode utiliza una única clave de licencia que cubre tanto el desarrollo como los despliegues de producción. Esto simplifica las canalizaciones de CI/CD y las configuraciones de Docker en comparación con los sistemas de licencias que separan las claves de SDK de las claves de tiempo de ejecución.

¿Es IronBarcode compatible con todos los formatos de código de barras que soporta Infragistics Barcode?

IronBarcode es compatible con más de 30 simbologías de códigos de barras, incluidos QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 y muchos más. La autodetección de formatos significa que no se requiere una enumeración explícita de formatos.

¿Es IronBarcode compatible con la lectura nativa de códigos de barras en PDF?

Sí. IronBarcode lee códigos de barras directamente desde archivos PDF utilizando BarcodeReader.Read("document.pdf") sin necesidad de una biblioteca de renderizado de PDF independiente. Los resultados por página incluyen el número de página, el formato del código de barras, el valor y la puntuación de confianza.

¿Cómo gestiona IronBarcode el procesamiento por lotes en comparación con Infragistics Barcode?

Los métodos estáticos de IronBarcode no tienen estado y son naturalmente seguros para subprocesos, lo que permite el uso directo de Parallel.ForEach sin gestión de instancias por subproceso. No hay límite de rendimiento en ningún nivel de precios.

¿Qué versiones de .NET admite IronBarcode ?

IronBarcode es compatible con .NET Framework 4.6.2+, .NET Core 3.1 y .NET 5, 6, 7, 8 y 9 en un único paquete NuGet. Las plataformas de destino incluyen Windows x64/x86, Linux x64 y macOS x64/ARM.

¿Cómo instalo IronBarcode en un proyecto .NET?

Instale IronBarcode a través de NuGet: ejecute 'Install-Package IronBarCode' en la consola del gestor de paquetes, o 'dotnet add package IronBarCode' en la CLI. No se necesitan instaladores SDK ni archivos de ejecución adicionales.

¿Puedo evaluar IronBarcode antes de comprarlo, a diferencia de Infragistics?

Sí. El modo de prueba de IronBarcode devuelve los valores completos de los códigos de barras descodificados; sólo las imágenes de salida generadas reciben una marca de agua. Puede comprobar la precisión de la lectura en sus propios documentos antes de comprometerse con la compra.

¿Cuál es la diferencia de precio entre Infragistics Barcode e IronBarcode?

IronBarcode cuesta a partir de 749 dólares por una licencia perpetua de desarrollador único que cubre el desarrollo y la producción. Los detalles de precios y opciones de volumen están disponibles en la página de licencias de IronBarcode. No se requiere una licencia de ejecución por separado.

¿Es fácil migrar de Infragistics Barcode a IronBarcode?

La migración de Infragistics Barcode a IronBarcode implica principalmente la sustitución de las llamadas a la API basadas en instancias por los métodos estáticos de IronBarcode, la eliminación de la repetición de licencias y la actualización de los nombres de las propiedades de los resultados. La mayoría de las migraciones implican reducir código en lugar de añadirlo.

¿IronBarcode genera códigos QR con logotipos?

Sí. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") incrusta una imagen de marca en un código QR de forma nativa con corrección de errores configurable. Los códigos QR coloreados también son compatibles con ChangeBarCodeColor().

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame