Código de barras DevExpress vs IronBarcode: Control de UI vs Biblioteca Independiente
DevExpress es un kit de herramientas de interfaz de usuario .NET muy valorado. Los controles de cuadrícula, planificador, gráfico y tabla dinámica son ampliamente utilizados por equipos empresariales. Sin embargo, la compatibilidad con códigos de barras es otra historia. DevExpress envía un BarCodeControl — un control de WinForms y una etiqueta de Blazor DxBarCode — que te permite renderizar un código de barras en un formulario. El soporte de DevExpress ha confirmado que no existe capacidad de lectura y no hay planes actuales para agregarla. Si sus códigos de barras se encuentran en un proceso en segundo plano, una API web, un documento PDF o cualquier entorno sin un formulario de interfaz de usuario, este control no se aplica.
Esa limitación reduce la oferta de códigos de barras de DevExpress a un nicho específico: la representación visual de un código de barras dentro de una interfaz de usuario de DevExpress WinForms o Blazor . Para ese nicho de mercado funciona perfectamente. Para cualquier otra cosa —generación del lado del servidor, lectura de imágenes o PDF, procesamiento sin interfaz gráfica en Azure Functions o contenedores Docker— se necesita una herramienta diferente.
Comprensión de los controles de código de barras de DevExpress
DevExpress BarCodeControl vive en DevExpress.XtraEditors, con sus clases generadoras de simbología en DevExpress.XtraPrinting.BarCode. No es una biblioteca independiente. Está incluido en la suite DXperience, que comienza en $1,699.99 al año (suscripciones universales son $2,299.99). No existe ningún paquete NuGet independiente que contenga solo códigos de barras y que puedas instalar.
El BarCodeControl es un control de WinForms. Se configura con un objeto de simbología, se establecen las propiedades y se muestra en pantalla. Guardar ese renderizado en un archivo requiere llamar a DrawToBitmap, que espera un Bitmap preasignado del tamaño correcto:
// DevExpress WinForms: UI control, not a library
using DevExpress.XtraEditors; // BarCodeControl
using DevExpress.XtraPrinting.BarCode; // Code128Generator, etc.
using System.Drawing;
using System.Drawing.Imaging;
var barCode = new BarCodeControl();
var symbology = new Code128Generator();
symbology.CharacterSet = Code128CharacterSet.CharsetAuto;
barCode.Symbology = symbology;
barCode.Text = "ITEM-12345";
barCode.Module = 0.02f; // document units, not pixels
barCode.ShowText = true;
// File output requires DrawToBitmap — you must size the Bitmap manually
barCode.Width = 400;
barCode.Height = 100;
var bitmap = new Bitmap(barCode.Width, barCode.Height);
barCode.DrawToBitmap(bitmap, new Rectangle(0, 0, barCode.Width, barCode.Height));
bitmap.Save("barcode.png", ImageFormat.Png);
bitmap.Dispose();Imports DevExpress.XtraEditors
Imports DevExpress.XtraPrinting.BarCode
Imports System.Drawing
Imports System.Drawing.Imaging
Dim barCode As New BarCodeControl()
Dim symbology As New Code128Generator()
symbology.CharacterSet = Code128CharacterSet.CharsetAuto
barCode.Symbology = symbology
barCode.Text = "ITEM-12345"
barCode.Module = 0.02F ' document units, not pixels
barCode.ShowText = True
' File output requires DrawToBitmap — you must size the Bitmap manually
barCode.Width = 400
barCode.Height = 100
Dim bitmap As New Bitmap(barCode.Width, barCode.Height)
barCode.DrawToBitmap(bitmap, New Rectangle(0, 0, barCode.Width, barCode.Height))
bitmap.Save("barcode.png", ImageFormat.Png)
bitmap.Dispose()Aquí se observan varios puntos de fricción. Primero, barCode.Module está en unidades de documento en lugar de píxeles, lo que crea una discrepancia si estás pensando en dimensiones de píxeles. Segundo, debes conocer el tamaño final en píxeles antes de asignar el Bitmap. En tercer lugar, el control requiere que se carguen los ensamblados de WinForms, lo que significa que una API mínima de ASP.NET Core o un servicio de consola en segundo plano deben cargar la infraestructura de Windows Forms solo para generar una imagen de código de barras.
La etiqueta de Blazor DxBarCode es conceptualmente similar pero es un componente Razor para renderización de IU, no un API de generación del lado del servidor.
Sin capacidad de lectura
La postura oficial de DevExpress es que no ofrecen funciones de reconocimiento o escaneo de códigos de barras. El Centro de Soporte de DevExpress establece: "El control BarCode de DevExpress está diseñado solo para generación de códigos de barras. No proporcionamos funcionalidad de reconocimiento/escaneo de códigos de barras." No hay planes actuales para agregarla.
Para los equipos que comienzan con una aplicación DevExpress WinForms y posteriormente necesitan escanear un código de barras de una imagen cargada o leer un código QR de un archivo PDF adjunto, la caja de herramientas de DevExpress no les será de utilidad. Deberán incorporar una biblioteca independiente para gestionar la lectura, lo que plantea de inmediato la cuestión de si la generación de la aplicación también debería migrar a esa biblioteca para mantener la coherencia de la API.
IronBarcode maneja ambas direcciones:
// IronBarcode reading — works on images, PDFs, and byte arrays
// NuGet: dotnet add package IronBarcode
using IronBarCode;
var results = BarcodeReader.Read("scanned-label.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}Imports IronBarCode
' IronBarcode reading — works on images, PDFs, and byte arrays
' NuGet: dotnet add package IronBarcode
Dim results = BarcodeReader.Read("scanned-label.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
NextPara leer un archivo PDF no se necesitan bibliotecas adicionales:
// Reading barcodes from a PDF — no PdfiumViewer or similar required
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page barcode: {result.Value}");
}Imports System
' Reading barcodes from a PDF — no PdfiumViewer or similar required
Dim pdfResults = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In pdfResults
Console.WriteLine($"Page barcode: {result.Value}")
NextEl problema de la agrupación de Suite
Los componentes de código de barras de DevExpress no se venden como producto independiente. Para usar BarCodeControl en cualquier proyecto, tu equipo necesita una suscripción a DevExpress — el nivel de ASP.NET & Blazor comienza en $1,099.99/año, DXperience (WinForms + WPF) es de $1,699.99/año, y Universal es de $2,299.99/año. El Suite incluye la cuadrícula, el gráfico, el programador, la tabla dinámica y muchos otros controles, lo cual es razonable si está creando una aplicación completa de DevExpress WinForms o Blazor . Si solo necesita la generación de códigos de barras para un servicio de backend, estará pagando por un conjunto completo de herramientas de interfaz de usuario que el servicio nunca utilizará.
IronBarcode es un paquete independiente:
dotnet add package IronBarcode
La licencia Lite perpetua tiene un precio inicial de 749 dólares para un desarrollador. No incluye ningún kit de herramientas de interfaz de usuario. Obtendrás generación y lectura de códigos de barras, compatibilidad multiplataforma y nada más que no hayas solicitado.
Limitación de uso sin interfaz gráfica
El problema fundamental con BarCodeControl en escenarios del lado del servidor es que es un control de WinForms. En un proyecto de API mínima de ASP.NET Core .NET 6 o superior, los ensamblados de WinForms no se referencian de forma predeterminada. Para instanciar BarCodeControl, tu proyecto API debe, o bien, dirigir explícitamente a Windows y cargar el runtime de Windows Forms, o agregar referencias alternativas que traen infraestructura de IU que tu API nunca renderizará.
En un plan de consumo de Azure Functions, no hay ninguna capa de interfaz de usuario. En un contenedor Docker que ejecuta una imagen base de Linux, las dependencias de Windows Forms GDI+ pueden estar completamente ausentes. DevExpress no soporta oficialmente el uso de BarCodeControl en estos entornos sin interfaz.
IronBarcode utiliza una API estática y totalmente programática:
// IronBarcode: works in WinForms, ASP.NET Core, Azure Function, console — same code
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");Imports IronBarCode
' IronBarcode: works in WinForms, ASP.NET Core, Azure Function, console — same code
' NuGet: dotnet add package IronBarcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")Esta misma llamada funciona en una aplicación de consola, un controlador ASP.NET Core , una función de Azure activada por un mensaje de Service Bus o un contenedor Docker que se ejecuta en Linux. La API no cambia entre entornos. No existe ninguna dependencia de ensamblado de interfaz de usuario.
Un endpoint de ASP.NET Core que devuelve un código de barras como respuesta de un archivo PNG tiene este aspecto:
app.MapGet("/barcode/{sku}", (string sku) =>
{
var bytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
app.MapGet("/barcode/{sku}", Function(sku As String)
Dim bytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)No hay un patrón equivalente con BarCodeControl sin soluciones significativas.
Entendiendo IronBarcode
IronBarcode es una biblioteca .NET independiente para generar y leer códigos de barras. La API es completamente estática: no hay instancias que gestionar, ni ciclo de vida de control, ni dependencia de la interfaz de usuario. La generación y la lectura funcionan en la misma llamada:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Generate Code 128
BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128)
.ResizeTo(450, 120)
.SaveAsPng("order-label.png");
// Generate and get bytes (for HTTP responses, blob storage, etc.)
byte[] pngBytes = BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128)
.ResizeTo(450, 120)
.ToPngBinaryData();
// Read from an image file
var results = BarcodeReader.Read("order-label.png");
Console.WriteLine(results.First().Value); // ORDER-9921Imports IronBarCode
' Generate Code 128
BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128) _
.ResizeTo(450, 120) _
.SaveAsPng("order-label.png")
' Generate and get bytes (for HTTP responses, blob storage, etc.)
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128) _
.ResizeTo(450, 120) _
.ToPngBinaryData()
' Read from an image file
Dim results = BarcodeReader.Read("order-label.png")
Console.WriteLine(results.First().Value) ' ORDER-9921La activación de la licencia se realiza con una sola línea al iniciar el sistema:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"No hay llamada de red. Sin código repetitivo para el manejo de errores. Validación local.
Código QR lado a lado
Los códigos QR ilustran la brecha de API entre un control de interfaz de usuario y una biblioteca de programación.
Código QR de DevExpress — Control WinForms:
// DevExpress: QR via BarCodeControl + QRCodeGenerator symbology
using DevExpress.XtraEditors; // BarCodeControl
using DevExpress.XtraPrinting.BarCode; // QRCodeGenerator + QRCodeErrorCorrectionLevel
var barCode = new BarCodeControl();
var symbology = new QRCodeGenerator();
symbology.ErrorCorrectionLevel = QRCodeErrorCorrectionLevel.H;
symbology.CompactionMode = QRCodeCompactionMode.AlphaNumeric;
barCode.Symbology = symbology;
barCode.Text = "https://example.com";
barCode.Width = 500;
barCode.Height = 500;
var bitmap = new Bitmap(barCode.Width, barCode.Height);
barCode.DrawToBitmap(bitmap, new Rectangle(0, 0, barCode.Width, barCode.Height));
bitmap.Save("qr.png", ImageFormat.Png);
bitmap.Dispose();Imports DevExpress.XtraEditors ' BarCodeControl
Imports DevExpress.XtraPrinting.BarCode ' QRCodeGenerator + QRCodeErrorCorrectionLevel
Imports System.Drawing
Imports System.Drawing.Imaging
Dim barCode As New BarCodeControl()
Dim symbology As New QRCodeGenerator()
symbology.ErrorCorrectionLevel = QRCodeErrorCorrectionLevel.H
symbology.CompactionMode = QRCodeCompactionMode.AlphaNumeric
barCode.Symbology = symbology
barCode.Text = "https://example.com"
barCode.Width = 500
barCode.Height = 500
Dim bitmap As New Bitmap(barCode.Width, barCode.Height)
barCode.DrawToBitmap(bitmap, New Rectangle(0, 0, barCode.Width, barCode.Height))
bitmap.Save("qr.png", ImageFormat.Png)
bitmap.Dispose()Código QR de IronBarcode : mismo resultado, sin necesidad de ensamblar la interfaz de usuario.
// IronBarcode: QR in one method chain
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");netAgregar el logotipo de la marca en el centro del código QR:
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("qr-branded.png");QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("qr-branded.png")DevExpress no tiene un equivalente para logotipos incrustados. El control genera un código QR estándar y nada más.
Comparación de características
| Característica | Código de barras DevExpress | IronBarcode |
|---|---|---|
| Generación de BarCodes | Sí (control WinForms, etiqueta Blazor ) | Sí (API programática, todos los entornos) |
| Lectura/escaneo de códigos de barras | No — confirmado oficialmente | Sí, imágenes, archivos PDF, matrices de bytes |
| Lectura de códigos de barras PDF | No | Sí, es nativo, no requiere biblioteca adicional. |
| Paquete NuGet independiente | No, se requiere la Suite DXperience. | Sí — solo IronBarcode |
| Costo de la Suite | Desde $1,099.99/año (ASP.NET y Blazor) hasta $2,299.99/año (Universal) | N/A — independiente |
| Costo de la licencia | Sólo por suscripción | Perpetuo desde $999 |
| API mínima de ASP.NET Core | Requiere soluciones alternativas para WinForms. | Soporte nativo |
| Azure Functions | No se apoya sin cabeza | Soporte completo |
| Docker / Linux | Problemas de GDI+ en imágenes base de Linux | Soporte completo |
| Aplicaciones de consola | Requiere la carga del ensamblado de WinForms | Soporte nativo |
| Generación de código QR | Sí (mediante la simbología de QRCodeGenerator) | Sí (QRCodeWriter) |
| Código QR con logotipo integrado | No | Sí — .AddBrandLogo() |
| Niveles de corrección de errores QR | H, Q, M, L | Máximo, Alto, Medio, Bajo |
| Código 128 | Sí | Sí |
| Matriz de datos | Sí | Sí |
| PDF417 | Sí | Sí |
| azteca | Sí | Sí |
| Salida del archivo | DrawToBitmap: asignación manual de mapas de bits | .SaveAsPng(), .SaveAsGif(), .SaveAsSvg() |
| Salida binaria (respuesta HTTP) | Mapa de bits manual → MemoryStream | toPngBinaryData() |
| Lectura multihilo | N/A — sin lectura | MaxParallelThreads = 4 |
| Lectura de múltiples códigos de barras | N/A — sin lectura | ExpectMultipleBarcodes = true |
| Plataformas | Windows (WinForms / Blazor) | Windows, Linux, macOS, Docker, Azure, AWS Lambda |
| Compatibilidad con versiones de .NET | .NET Framework + .NET moderno (Windows) | .NET Framework 4.6.2 hasta el actual .NET |
Referencia de mapeo de API
Los equipos familiarizados con el patrón de DevExpress BarCodeControl encontrarán útiles estas equivalencias:
| Código de barras DevExpress | IronBarcode |
|---|---|
new BarCodeControl() | Estático: no se necesita instancia |
new Code128Generator() + barCode.Symbology = symbology | BarcodeEncoding.Code128 pasado como parámetro |
new QRCodeGenerator() + QRCodeErrorCorrectionLevel.H | QRCodeWriter.CreateQrCode("data", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) |
new DataMatrixGenerator() + DataMatrixSize.Matrix26x26 | BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix) |
new PDF417Generator() | BarcodeWriter.CreateBarcode("data", BarcodeEncoding.PDF417) |
new AztecGenerator() | BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Aztec) |
barCode.Module = 0.02f (unidades de documento) | .ResizeTo(width, height) (píxeles) |
barCode.ShowText = true | .AddBarcodeText() |
DrawToBitmap(bitmap, rect) — asignación manual de Bitmap | .SaveAsPng(path) — maneja el tamaño automáticamente |
Manual Bitmap → MemoryStream para respuesta HTTP | .ToPngBinaryData() |
| No se puede leer la API | BarcodeReader.Read(imagePath) |
| No hay tipo de resultado de lectura | .Value (cadena), .Format (BarcodeEncoding) |
| Se requiere el ensamblaje de la interfaz de usuario en cada proyecto. | Funciona en cualquier tipo de proyecto .NET. |
| Solo suite (desde $1,099.99/año) | Versión independiente (desde $999 con licencia perpetua) |
Cuando los equipos cambian
Existen varios escenarios específicos que suelen desencadenar el cambio de los controles de código de barras de DevExpress a IronBarcode.
Se requiere la lectura de códigos de barras. El escenario más común es una aplicación WinForms que lleva años generando códigos de barras y recibe una nueva solicitud de funcionalidad: la aplicación ahora debe escanear o verificar códigos de barras a partir de imágenes cargadas o capturas de cámara. DevExpress no tiene API de lectura. El equipo necesita una nueva biblioteca de todos modos, y tiene sentido consolidar la generación en esa misma biblioteca.
Se necesita un punto final de API web. Un equipo desarrolla un microservicio que genera etiquetas de código de barras bajo demanda, a las que se accede desde una interfaz web, una aplicación móvil u otro servicio. El proyecto ASP.NET Core no tiene dependencia de WinForms y el equipo no desea añadirla. La API estática de IronBarcode se integra en un punto final HTTP sin necesidad de código adicional de interfaz de usuario.
Implementación de Azure Functions o Lambda. Las implementaciones sin servidor suelen utilizar imágenes base de Linux y entornos de ejecución mínimos. BarCodeControl no está diseñado para este entorno. IronBarcode se ejecuta en Linux, en contenedores Docker, en Azure Functions y en AWS Lambda sin necesidad de realizar cambios en la configuración.
Costo de renovación de Suite para una sola función. Cuando llega el momento de la renovación y un equipo audita lo que realmente utiliza de la suite DXperience, descubrir que el único componente de DevExpress en un servicio particular es BarCodeControl crea una conversación sobre costos. Pagar una suscripción completa de DXperience ($1,699.99/año nuevo, $849.99/año en renovación) para generación de códigos de barras cuando una biblioteca independiente cuesta $999 perpetua es un argumento difícil de hacer.
Lectura de múltiples códigos de barras en archivos PDF. Los flujos de trabajo de procesamiento de documentos (lectura de códigos de barras en archivos PDF de facturas, manifiestos de envío o formularios escaneados) requieren compatibilidad con PDF y capacidad de lectura. IronBarcode lee directamente los archivos PDF sin necesidad de ninguna biblioteca adicional. DevExpress no ofrece ninguna de estas capacidades.
Conclusión
La oferta de códigos de barras de DevExpress se entiende mejor como una función de renderizado de interfaz de usuario integrada en un kit de herramientas de interfaz de usuario. Si tu aplicación es una aplicación de WinForms o Blazor que ya utiliza DevExpress para sus controles de cuadrícula y gráficos, y tu única necesidad de código de barras es mostrar visualmente un código de barras en un formulario, el BarCodeControl es una elección razonable — ya tienes la licencia.
En el momento que necesites cualquiera de lo siguiente, BarCodeControl deja de ser la herramienta adecuada: leer códigos de barras, generar códigos de barras en un contexto del lado del servidor, ejecutar en un entorno sin interfaz, trabajar en Linux, u operar sin una referencia de ensamblado de WinForms. El soporte de DevExpress ha confirmado que no dispone de funcionalidad de lectura y que no tiene previsto añadirla. La limitación del modo sin interfaz gráfica es un problema arquitectónico, no de configuración. Un control de interfaz de usuario es un control de interfaz de usuario.
IronBarcode está diseñado para el trabajo programático con códigos de barras: generación y lectura a través de una API estática, en cualquier entorno y en cualquier plataforma. Ambas herramientas resuelven problemas diferentes. El código de barras de DevExpress se utiliza para renderizar dentro de un formulario. IronBarcode sirve para procesar códigos de barras.

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 estructurados y visualmente atractivos.