Infragistics Barcode vs IronBarcode: Comparación de bibliotecas de códigos de barras C#
La lectura de códigos de barras de Infragistics funciona en WPF. Para llegar allí se requiere un BarcodeReader instancia, un DecodeComplete manejador de eventos, un TaskCompletionSource<string> para puentear la devolución de llamada en código asíncrono, un BitmapImage carga desde un URI, y un explícito bitwise OR de cada SymbologyType que desea apoyar. Si omite un indicador, por ejemplo SymbologyType.EAN8, cualquier código de barras EAN-8 de sus imágenes no devolverá nada. Sin excepción. Sin previo aviso. Un resultado vacío.
Este es el lado WPF. En el lado WinForms, el paquete Infragistics.Win.UltraWinBarcode contiene controles de generación, pero ninguna clase de lector. 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 la 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)
Se establece una simbología, se asignan datos, se llama a SaveTo(). En escenarios de generación únicamente en WinForms, esto funciona. El enum Symbology cubre los formatos más comunes: Code128, Code39, QR, EAN13 y otros.
Lo que no existe en esta asamblea es un lector. No hay clase UltraBarcodeReader. No existe el método Scan(). Si intenta leer una imagen de código de barras en una aplicación WinFormsutilizando sólo el paquete Infragistics.Win.UltraWinBarcode, no hay nada que llamar.
WPF: XamBarcode y BarcodeReader
La parte WPFincluye tanto un control de generación (XamBarcode) como una clase lectora independiente (BarcodeReader en Infragistics.Controls.Barcodes, del 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 cablear el evento DecodeComplete, cargar imágenes como objetos BitmapSource en lugar de rutas de archivo, y convertir el patrón de devolución de llamada en algo esperable si su código es asíncrono.
ASP.NET Core, Consola, Docker: Nada
No existe ningún paquete de código de barras de Infragistics que se dirija a net8.0 sin ensamblados de interfaz de usuario de 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));
// Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Trigger decode — result comes via callback
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbologyValue ?? "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));
// Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Trigger decode — result comes via callback
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbologyValue ?? "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))
' Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 Or
SymbologyType.Code39 Or
SymbologyType.QR Or
SymbologyType.EAN8 Or
SymbologyType.EAN13 Or
SymbologyType.UPCA Or
SymbologyType.DataMatrix Or
SymbologyType.Interleaved2of5
' Trigger decode — result comes via callback
_reader.Decode(bitmap)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(e.SymbologyValue, "No barcode found"))
End Sub
Public Sub Dispose()
If _reader IsNot Nothing Then
RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
_reader = Nothing
End If
End Sub
Esto supone aproximadamente 35 líneas de infraestructura para leer un solo código de barras. Cuenta lo que realmente está sucediendo:
- Se crea una instancia
BarcodeReadery se mantiene viva como campo. - En el constructor se incluye un controlador de eventos.
- Cada llamada a
ReadBarcodeAsynccrea un nuevoTaskCompletionSource<string>asignado a un campo compartido - lo que significa que este servicio no es thread-safe tal y como está escrito. Las llamadas concurrentes sobrescribirían_result. - La imagen debe ser cargada como un
BitmapImagede unUri- no una cadena de ruta de archivo, no una matriz de bytes, no una corriente. Decode()dispara el evento de forma asíncrona. ElTaskCompletionSourcees el nexo de unión entre el mundo callback y el mundo async/await.- El callback extrae
e.SymbologyValue. - El método
Dispose()debe separar el manejador de eventos para evitar fugas 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 el código de producción, también tendría que manejar el caso en que _result.Task nunca se completa - un tiempo de espera, un token de cancelación, o alguna guardia contra el evento nunca disparar.
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 ninguna capacidad de lectura.
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.
Esta asimetría crea una situación realmente incómoda para los equipos que trabajan en proyectos con marcos de trabajo mixtos. 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
La propiedad SymbologyTypes flag en el lector WPFmerece su propia sección porque su modo de fallo es sutil y peligroso en producción.
Al configurar el lector, debe combinar explícitamente mediante OR cada formato de código de barras que desee admitir:
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
' Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 Or
SymbologyType.Code39 Or
SymbologyType.QR Or
SymbologyType.EAN8 Or
SymbologyType.EAN13 Or
SymbologyType.UPCA Or
SymbologyType.DataMatrix Or
SymbologyType.Interleaved2of5
Si una imagen de código de barras contiene un código de barras EAN-8 y SymbologyType.EAN8 no está en las banderas, e.SymbologyValue aparece nulo o 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 ese formato.
- El error se ve idéntico a "la imagen no tiene código de barras" en lugar de "formato no configurado".
Los equipos que depuraban este problema dedicaban tiempo a examinar la calidad de la imagen antes de darse cuenta de que el formato nunca había estado en la lista de indicadores.
IronBarcode no tiene la propiedad SymbologyTypes. Detecta automáticamente los más de 50 formatos compatibles 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) | Sí | Sí |
| WinForms | Código de barras UltraWin | NO DISPONIBLE | Sí | Sí |
| ASP.NET Core | NO DISPONIBLE | NO DISPONIBLE | Sí | Sí |
| Consola | NO DISPONIBLE | NO DISPONIBLE | Sí | Sí |
| Servidor Blazor | NO DISPONIBLE | NO DISPONIBLE | Sí | Sí |
| Docker / Linux | NO DISPONIBLE | NO DISPONIBLE | Sí | Sí |
| Funciones Azure | NO DISPONIBLE | NO DISPONIBLE | Sí | Sí |
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 IronBarcode
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 IronBarcode
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")
BarcodeReader.Read() es un método estático. No hay instancias que gestionar, ni eventos que cablear, ni TaskCompletionSource patrones de callback que salvar. Acepta una cadena de ruta de archivo, una matriz de bytes, un Stream, o una matriz de cualquiera de ellos para el procesamiento por lotes.
Para la generación, BarcodeWriter.CreateBarcode() devuelve un objeto de código de barras que puede guardar en PNG, JPEG, SVG u 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")
La inicialización de la licencia se realiza al iniciar la aplicación, una sola vez:
IronBarCode.License.LicenseKey = "YOUR-KEY";
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-KEY"
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 de forma segura múltiples imágenes simultáneamente. Debes secuenciar las llamadas:
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// are not thread-safe; concurrent calls would corrupt _result
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
// are not thread-safe; concurrent calls would corrupt _result
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
' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' are not thread-safe; concurrent calls would corrupt _result
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
Hacer esto concurrente requiere una infraestructura adicional significativa: un bloqueo, una cola, o un semáforo para asegurar _result no se sobrescribe mientras que una decodificación anterior está todavía en vuelo. Se trata de un problema de concurrencia complejo para lo que debería ser una simple operación de entrada/salida.
El BarcodeReader.Read() estático de IronBarcode es a prueba de hilos. Se puede llamar desde varios hilos simultáneamente sin ninguna sincronización adicional. Para cargas de trabajo por lotes, puede utilizar 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)
También puede pasar varios 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
Comparación de características
| Característica | Código de barras de Infragistics | IronBarcode |
|---|---|---|
| Lectura de códigos de barras en WinForms | No disponible | Sí |
| Lectura de códigos de barras en WPF | Sí (basado en eventos) | Sí (síncrono) |
| Compatibilidad con ASP.NET Core | No disponible | Sí |
| Consola / Servicio de trabajador | No disponible | Sí |
| Docker / Linux | No disponible | Sí |
| Funciones Azure | No disponible | Sí |
| Servidor Blazor | No disponible | Sí |
| Detección de formato automático | No, debe especificarse cada indicador de SymbologyType. | Sí, se detectan automáticamente más de 50 formatos. |
| 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) | Sí | No — acepta ruta de archivo, bytes, flujo |
| Lectura sincrónica | No (debe conectarse a través de TaskCompletionSource) | Sí |
| Procesamiento por lotes | Solo secuencial (inseguro para concurrencia) | Paralelización integrada |
| Fallos de formato silenciosos | Sí (falta el indicador SymbologyType) | No |
| Dependencia de Suite requerida | Sí — Suscripción a Infragistics Ultimate | No — paquete independiente |
| Opción de licencia perpetua | No — suscripción anual | Sí |
| Costo aproximado de la licencia | $1,675+/año (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.SymbologyTypes = SymbologyType.X \| Tipo de simbología.Y| ... |
Detección automática: no requiere configuración. |
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap) |
BarcodeReader.Read(path) |
e.SymbologyValue (en devolución de llamada) |
result.Value |
e.Symbology (en devolución de llamada) |
result.Format |
TaskCompletionSource<string> envoltorio async |
Síncrono: no se necesita ningún contenedor. |
Dispose() - manejador de eventos detach |
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 sin problemas con UltraWinBarcode pero entonces llega un nuevo requisito: escanear un código de barras a partir de una imagen cargada o validar una etiqueta antes de imprimirla. 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 IronBarcode y funciona en una acción de controlador del mismo modo que 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. El BarcodeReader de Infragistics WPFva con ellas. 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 a prueba de hilos y admite Parallel.ForEach o su opción MaxParallelThreads integrada sin ninguna infraestructura de concurrencia.
Fallos silenciosos de formato en producción. Un equipo descubre que los códigos de barras de un determinado formato han estado fallando silenciosamente durante semanas porque las banderas SymbologyTypes no incluían ese formato. 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 WPFBarcodeReader lee códigos de barras. El UltraWinBarcode de WinFormslas 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 se escribe en una clase de servicio WPFes la misma que se escribe en un controlador ASP.NET Corey la misma que se escribe en un contenedor 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().

