Migrando desde Código de barras DevExpress a IronBarcode
Si utiliza DevExpress por sus controles de cuadrícula, gráficos, programador o tabla dinámica, consérvelos. Esta migración se refiere específicamente a reemplazar BarCodeControl con una biblioteca que también pueda leer códigos de barras, funcionar sin interfaz de usuario y desplegarse fuera de un contexto de UI. Los controles de interfaz de usuario de DevExpress que utiliza para su aplicación WinForms o Blazor no se verán afectados por esta migración. Solo cambia el código específico del código de barras.
El escenario típico que motiva esta migración es uno de estos tres: surge un requisito de lectura y DevExpress no puede satisfacerlo; Un nuevo servicio requiere la generación de códigos de barras en ASP.NET Core o en una función en la nube donde no estén presentes los ensamblados de WinForms; o llega el momento de renovar la Suite y el cálculo del coste por función de usar un conjunto completo de herramientas de interfaz de usuario solo para la salida de códigos de barras deja de tener sentido.
Paso 1: Instalar IronBarcode
Si va a mantener otros controles de DevExpress en el mismo proyecto, deje los paquetes NuGet de DevExpress en su lugar. Solo cambia el código relacionado con el código de barras en tus archivos fuente. Si la generación de códigos de barras fue la única razón por la que DevExpress apareció en un proyecto en particular y no utiliza ningún otro control de DX allí, puede eliminar los paquetes de DevExpress de ese proyecto después de la migración:
# Only remove DevExpress packages if no other DX controls are used in this project
dotnet remove package DevExpress.Win.Navigation
Paso 2: Agregar inicialización de licencia
Agrega la activación de la licencia de IronBarcode una vez al inicio de la aplicación — en Program.cs, App.xaml.cs o tu host builder:
// In Program.cs (ASP.NET Core) or application entry point
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
' In Program.vb (ASP.NET Core) or application entry point
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"No hay llamada de red. No hay código de error que comprobar. Validación local.
Paso 3: Reemplazar el código específico del código de barras
Busque en su código fuente los tipos de códigos de barras de DevExpress. Todo lo demás permanece igual:
# Find barcode-related DevExpress usage — ignore grid, chart, and other DX components
grep -r "BarCodeControl\|Code128Generator\|QRCodeGenerator\|DataMatrixGenerator\|PDF417Generator\|AztecCodeGenerator\|DevExpress.XtraPrinting.BarCode" --include="*.cs" .
grep -r "barCode\.Module\|DrawToBitmap\|BarCode\.Symbology" --include="*.cs" .
Los resultados de esta búsqueda son exactamente lo que reemplazarás. Nada más.
Ejemplos de migración de código
Generación del código 128
Esta es la migración más común. Un BarCodeControl con una simbología Code128Generator se convierte en una única llamada BarcodeWriter.CreateBarcode.
Antes — Control DevExpress WinForms:
using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;
using System.Drawing;
using System.Drawing.Imaging;
public void GenerateCode128(string data, string outputPath)
{
var barCode = new BarCodeControl();
var symbology = new Code128Generator();
symbology.CharacterSet = Code128CharacterSet.CharsetAuto;
barCode.Symbology = symbology;
barCode.Text = data;
barCode.Module = 0.02f;
barCode.ShowText = true;
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(outputPath, ImageFormat.Png);
bitmap.Dispose();
}Imports DevExpress.XtraEditors
Imports DevExpress.XtraPrinting.BarCode
Imports System.Drawing
Imports System.Drawing.Imaging
Public Sub GenerateCode128(data As String, outputPath As String)
Dim barCode As New BarCodeControl()
Dim symbology As New Code128Generator()
symbology.CharacterSet = Code128CharacterSet.CharsetAuto
barCode.Symbology = symbology
barCode.Text = data
barCode.Module = 0.02F
barCode.ShowText = True
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(outputPath, ImageFormat.Png)
bitmap.Dispose()
End SubDespués — IronBarcode:
// NuGet: dotnet add package BarCode
using IronBarCode;
public void GenerateCode128(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateCode128(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(outputPath)
End SubEl dimensionamiento del documento-unidad de barCode.Module = 0.02f ha desaparecido. .ResizeTo(400, 100) toma píxeles directamente. La asignación manual de Bitmap y la llamada a DrawToBitmap se reemplazan por .SaveAsPng(), que maneja el dimensionamiento automáticamente.
Generación de códigos QR
Antes: DevExpress QR con corrección de errores:
using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;
using System.Drawing;
using System.Drawing.Imaging;
public void GenerateQrCode(string url, string outputPath)
{
var barCode = new BarCodeControl();
var symbology = new QRCodeGenerator();
symbology.ErrorCorrectionLevel = QRCodeErrorCorrectionLevel.H;
symbology.CompactionMode = QRCodeCompactionMode.AlphaNumeric;
barCode.Symbology = symbology;
barCode.Text = url;
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(outputPath, ImageFormat.Png);
bitmap.Dispose();
}Imports DevExpress.XtraEditors
Imports DevExpress.XtraPrinting.BarCode
Imports System.Drawing
Imports System.Drawing.Imaging
Public Sub GenerateQrCode(url As String, outputPath As String)
Dim barCode As New BarCodeControl()
Dim symbology As New QRCodeGenerator()
symbology.ErrorCorrectionLevel = QRCodeErrorCorrectionLevel.H
symbology.CompactionMode = QRCodeCompactionMode.AlphaNumeric
barCode.Symbology = symbology
barCode.Text = url
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(outputPath, ImageFormat.Png)
bitmap.Dispose()
End SubDespués — IronBarcode:
using IronBarCode;
public void GenerateQrCode(string url, string outputPath)
{
QRCodeWriter.CreateQrCode(url, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateQrCode(url As String, outputPath As String)
QRCodeWriter.CreateQrCode(url, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.SaveAsPng(outputPath)
End SubQRCodeErrorCorrectionLevel.H se asigna a QRCodeWriter.QrErrorCorrectionLevel.Highest. La configuración de CompactionMode.AlphaNumeric es manejada automáticamente por IronBarcode según el contenido.
Código QR con el logotipo de la marca (funcionalidad totalmente nueva, no posible con DevExpress):
using IronBarCode;
public void GenerateBrandedQrCode(string url, string logoPath, string outputPath)
{
QRCodeWriter.CreateQrCode(url, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo(logoPath)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateBrandedQrCode(url As String, logoPath As String, outputPath As String)
QRCodeWriter.CreateQrCode(url, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo(logoPath) _
.SaveAsPng(outputPath)
End SubGeneración de matriz de datos
Antes — DevExpress:
using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;
var barCode = new BarCodeControl();
var symbology = new DataMatrixGenerator();
symbology.MatrixSize = DataMatrixSize.Matrix26x26;
barCode.Symbology = symbology;
barCode.Text = "PART-7734-X";
// ... DrawToBitmap patternImports DevExpress.XtraEditors
Imports DevExpress.XtraPrinting.BarCode
Dim barCode As New BarCodeControl()
Dim symbology As New DataMatrixGenerator()
symbology.MatrixSize = DataMatrixSize.Matrix26x26
barCode.Symbology = symbology
barCode.Text = "PART-7734-X"
' ... DrawToBitmap patternDespués — IronBarcode:
using IronBarCode;
BarcodeWriter.CreateBarcode("PART-7734-X", BarcodeEncoding.DataMatrix)
.ResizeTo(260, 260)
.SaveAsPng("datamatrix.png");Imports IronBarCode
BarcodeWriter.CreateBarcode("PART-7734-X", BarcodeEncoding.DataMatrix) _
.ResizeTo(260, 260) _
.SaveAsPng("datamatrix.png")Generación PDF417
Antes — DevExpress:
using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;
var barCode = new BarCodeControl();
barCode.Symbology = new PDF417Generator();
barCode.Text = "SHIPMENT-DATA-2026";
// ... DrawToBitmap patternImports DevExpress.XtraEditors
Imports DevExpress.XtraPrinting.BarCode
Dim barCode As New BarCodeControl()
barCode.Symbology = New PDF417Generator()
barCode.Text = "SHIPMENT-DATA-2026"
' ... DrawToBitmap patternDespués — IronBarcode:
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIPMENT-DATA-2026", BarcodeEncoding.PDF417)
.ResizeTo(400, 150)
.SaveAsPng("pdf417.png");Imports IronBarCode
BarcodeWriter.CreateBarcode("SHIPMENT-DATA-2026", BarcodeEncoding.PDF417) _
.ResizeTo(400, 150) _
.SaveAsPng("pdf417.png")Agregar capacidad de lectura (nueva funcionalidad)
DevExpress no proporciona ninguna API de lectura. Si surge la necesidad de realizar una lectura, es aquí donde IronBarcode se amortiza de inmediato:
using IronBarCode;
// Read from an image file
var results = BarcodeReader.Read("uploaded-label.png");
foreach (var result in results)
{
Console.WriteLine($"Found {result.Format}: {result.Value}");
}
// Read with options for better accuracy on difficult images
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var detailedResults = BarcodeReader.Read("multi-barcode-sheet.png", options);Imports IronBarCode
' Read from an image file
Dim results = BarcodeReader.Read("uploaded-label.png")
For Each result In results
Console.WriteLine($"Found {result.Format}: {result.Value}")
Next
' Read with options for better accuracy on difficult images
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim detailedResults = BarcodeReader.Read("multi-barcode-sheet.png", options)Punto final de código de barras de ASP.NET Core
Esto no era posible con BarCodeControl sin soluciones alternativas en WinForms. IronBarcode lo admite de forma nativa:
using IronBarCode;
// In Program.cs or a controller
app.MapGet("/label/{sku}", (string sku) =>
{
var pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return Results.File(pngBytes, "image/png", $"{sku}.png");
});
app.MapGet("/qr/{data}", (string data) =>
{
var pngBytes = QRCodeWriter.CreateQrCode(data, 300, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.ToPngBinaryData();
return Results.File(pngBytes, "image/png");
});Imports IronBarCode
' In Program.vb or a controller
app.MapGet("/label/{sku}", Function(sku As String)
Dim pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return Results.File(pngBytes, "image/png", $"{sku}.png")
End Function)
app.MapGet("/qr/{data}", Function(data As String)
Dim pngBytes = QRCodeWriter.CreateQrCode(data, 300, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.ToPngBinaryData()
Return Results.File(pngBytes, "image/png")
End Function)Lectura de códigos de barras en archivos PDF
IronBarcode lee archivos PDF de forma nativa. Sin PdfiumViewer, sin bucle de renderizado, sin paquetes adicionales:
using IronBarCode;
// Read all barcodes from all pages of a PDF
var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in results)
{
Console.WriteLine($"Barcode: {result.Value} | Format: {result.Format}");
}Imports IronBarCode
' Read all barcodes from all pages of a PDF
Dim results = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In results
Console.WriteLine($"Barcode: {result.Value} | Format: {result.Format}")
NextProblemas comunes de migración
barCode.Module utiliza unidades de documento, no píxeles.
barCode.Module controla el ancho de la barra más estrecha en unidades de documento (dependiente del contexto de DPI de renderización). Esto no es un recuento de píxeles. Al migrar, no intentes convertir el valor del módulo a píxeles; en su lugar, decide qué dimensiones en píxeles deseas y usa .ResizeTo(width, height) directamente.
// Before: barCode.Module = 0.02f — document units, indirect sizing
// After:
.ResizeTo(400, 100) // explicit pixel dimensions' Before: barCode.Module = 0.02F — document units, indirect sizing
' After:
.ResizeTo(400, 100) ' explicit pixel dimensionsDrawToBitmap requiere un mapa de bits preasignado.
El patrón antiguo asignaba un Bitmap de un tamaño específico, luego llamaba a DrawToBitmap para renderizar en él. El .SaveAsPng() de IronBarcode maneja todo esto internamente. No se asigna nada previamente.
// Before: must know size upfront, allocate, draw, save, dispose
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(path, ImageFormat.Png);
bitmap.Dispose();
// After: size specified once, everything else handled
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(path);' Before: must know size upfront, allocate, draw, save, dispose
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(path, ImageFormat.Png)
bitmap.Dispose()
' After: size specified once, everything else handled
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(path)Enlace de datos de WinForms
Si BarCodeControl estaba vinculado a una fuente de datos en un diseñador de WinForms, el equivalente en IronBarcode es leer el valor de tu modelo explícitamente y pasarlo a BarcodeWriter.CreateBarcode. IronBarcode no participa en el enlace de datos de WinForms; es una API programática, no un control de interfaz de usuario. Si necesitas mostrar el código de barras generado en un formulario, genera los bytes de imagen y establécelos en un PictureBox:
using IronBarCode;
// Generate and display in a WinForms PictureBox
private void UpdateBarcodeDisplay(string value)
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
using var ms = new System.IO.MemoryStream(bytes);
pictureBox1.Image = System.Drawing.Image.FromStream(ms);
}Imports IronBarCode
Imports System.IO
' Generate and display in a WinForms PictureBox
Private Sub UpdateBarcodeDisplay(value As String)
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Using ms As New MemoryStream(bytes)
pictureBox1.Image = System.Drawing.Image.FromStream(ms)
End Using
End SubReemplazo de espacio de nombres
Importaciones antiguas que se deben eliminar:
// Remove these
using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;netNueva importación para añadir:
// Add this
using IronBarCode;Imports IronBarCodeReferencia de mapeo de API
| Código de barras DevExpress | Equivalente de IronBarcode |
|---|---|
new BarCodeControl() | Estático: ninguna instancia |
new Code128Generator() + barCode.Symbology = symbology | BarcodeEncoding.Code128 parámetro |
new QRCodeGenerator() + QRCodeErrorCorrectionLevel.H | QRCodeWriter.CreateQrCode(data, size, QRCodeWriter.QrErrorCorrectionLevel.Highest) |
new DataMatrixGenerator() + DataMatrixSize.Matrix26x26 | BarcodeWriter.CreateBarcode(data, BarcodeEncoding.DataMatrix) |
new PDF417Generator() | BarcodeWriter.CreateBarcode(data, BarcodeEncoding.PDF417) |
new AztecCodeGenerator() | BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Aztec) |
barCode.Text = value | Primer argumento para CreateBarcode o CreateQrCode |
barCode.Module = 0.02f | .ResizeTo(width, height) en píxeles |
barCode.ShowText = true | .AddBarcodeText() |
DrawToBitmap(bitmap, rect) | .SaveAsPng(path) |
new Bitmap(w, h) + eliminación manual | No es necesario |
Bitmap → MemoryStream → HTTP | .ToPngBinaryData() |
| No se puede leer la API | BarcodeReader.Read(path) |
using DevExpress.XtraEditors + using DevExpress.XtraPrinting.BarCode | using IronBarCode |
Lista de comprobación de la migración
Utilice este patrón grep para encontrar todos los archivos que necesitan actualizarse:
grep -r "BarCodeControl\|Code128Generator\|QRCodeGenerator\|DataMatrixGenerator\|PDF417Generator\|AztecCodeGenerator" --include="*.cs" .
grep -r "barCode\.Module\|barCode\.Symbology\|DrawToBitmap\|DevExpress\.XtraPrinting\.BarCode" --include="*.cs" .
Analiza cada partido:
- Reemplaza
using DevExpress.XtraEditors;yusing DevExpress.XtraPrinting.BarCode;conusing IronBarCode; - Reemplaza
new BarCodeControl()+ configuración de simbología conBarcodeWriter.CreateBarcode(data, BarcodeEncoding.X) - Reemplaza
new QRCodeGenerator()+ configuración de simbología conQRCodeWriter.CreateQrCode(data, size, errorLevel) - Reemplaza
barCode.Module = Xcon.ResizeTo(width, height) - Reemplaza
DrawToBitmap+ patrónbitmap.Savecon.SaveAsPng(path) - Reemplaza patrones de Bitmap-a-MemoryStream con
.ToPngBinaryData() - Agrega
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"al inicio de la aplicación - Agrega llamadas
BarcodeReader.Read()donde sea necesaria la capacidad de lectura
Si un proyecto utiliza DevExpress únicamente para controles de códigos de barras y ningún otro componente de DX, elimine los paquetes NuGet de DevExpress después de reemplazar todas las referencias a códigos de barras. Si el proyecto utiliza la cuadrícula, el gráfico u otros controles de interfaz de usuario de DevExpress, mantenga esos paquetes; esta migración solo afecta al código de los 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.