Migrando de Código de barras DevExpress para IronBarcode
Se você utiliza o DevExpress por seus controles de grade, gráfico, agendador ou tabela dinâmica, mantenha-os. Esta migração é especificamente sobre substituir BarCodeControl por uma biblioteca que também pode ler códigos de barras, executar sem interface gráfica e implantar fora de um contexto de UI. Os controles de interface do usuário do DevExpress que você utiliza em seu aplicativo WinForms ou Blazor não serão afetados por esta migração. Apenas o código específico do código de barras é alterado.
O cenário típico que motiva essa migração é um dos três: surge uma necessidade de leitura e o DevExpress não consegue atendê-la; Um novo serviço precisa de geração de código de barras em ASP.NET Core ou em uma função na nuvem onde os assemblies do WinForms não estão presentes; ou quando chega a hora de renovar o Suite , o cálculo do custo por recurso ao usar um conjunto completo de ferramentas de interface do usuário apenas para a saída de código de barras deixa de fazer sentido.
Passo 1: Instale o IronBarcode
Se você estiver mantendo outros controles DevExpress no mesmo projeto, deixe os pacotes NuGet do DevExpress instalados. Apenas o código relacionado ao código de barras nos seus arquivos de origem será alterado. Se a geração de código de barras foi o único motivo para a presença do DevExpress em um projeto específico e você não utiliza outros controles DX nesse projeto, você pode remover os pacotes do DevExpress após a migração:
# Only remove DevExpress packages if no other DX controls are used in this project
dotnet remove package DevExpress.Win.Navigation
Etapa 2: Adicionar inicialização da licença
Adicione a ativação da licença do IronBarcode uma vez na inicialização do aplicativo — em Program.cs, App.xaml.cs ou no seu construtor de host:
// 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"Sem chamada de rede. Não há código de erro para verificar. Validação local.
Etapa 3: Substitua o código específico do código de barras
Procure por tipos de código de barras DevExpress em seu código-fonte. Todo o resto permanece inalterado:
# 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" .
Os resultados desta pesquisa são exatamente o que você irá substituir. Nada mais.
Exemplos de migração de código
Geração de código 128
Essa é a migração mais comum. Um BarCodeControl com uma simbologia Code128Generator se torna uma única chamada BarcodeWriter.CreateBarcode.
Antes — Controle 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 SubDepois — 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 SubO dimensionamento de unidade de documento barCode.Module = 0.02f foi removido. .ResizeTo(400, 100) aceita pixels diretamente. A alocação manual Bitmap e a chamada DrawToBitmap são substituídas por .SaveAsPng(), que lida com o dimensionamento automaticamente.
Geração de código QR
Antes — QR Code da DevExpress com correção de erros:
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 SubDepois — 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 mapeia para QRCodeWriter.QrErrorCorrectionLevel.Highest. A configuração CompactionMode.AlphaNumeric é tratada automaticamente pelo IronBarcode com base no conteúdo.
Código QR com logotipo da marca (recurso totalmente novo — não possível com 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 SubGeração de matriz de dados
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 patternDepois — 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")Geração 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 patternDepois — 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")Adicionando Leitura (Nova Capacidade)
A DevExpress não fornece uma API de leitura. Se surgir uma necessidade de leitura, é aí que o IronBarcode se paga imediatamente:
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)Ponto de extremidade de código de barras ASP.NET Core
Isso não era possível com BarCodeControl sem soluções alternativas para WinForms. O IronBarcode oferece suporte nativo a isso:
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)Leitura de códigos de barras em PDFs
O IronBarcode lê arquivos PDF nativamente. Sem PdfiumViewer, sem loop de renderização, sem pacotes extras:
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 comuns de migração
O módulo barCode.Module usa unidades de documento, não pixels.
barCode.Module controla a largura da barra mais estreita em unidades de documento (dependente do contexto de DPI de renderização). Isso não é uma contagem de pixels. Ao migrar, não tente converter o valor do módulo em pixels — em vez disso, decida quais dimensões de pixel deseja e use .ResizeTo(width, height) diretamente.
// 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 requer um bitmap pré-alocado.
O padrão antigo alocava um Bitmap de um tamanho específico e depois chamava DrawToBitmap para renderizá-lo. O .SaveAsPng() do IronBarcode lida com tudo isso internamente. Você não precisa pré-alocar nada.
// 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)Vinculação de dados WinForms
Se BarCodeControl estava vinculado a uma fonte de dados em um designer de WinForms, o equivalente do IronBarcode é ler o valor do seu modelo explicitamente e passá-lo para BarcodeWriter.CreateBarcode. IronBarcode não participa da vinculação de dados do WinForms — trata-se de uma API programática, não de um controle de interface do usuário. Se você precisar exibir o código de barras gerado em um formulário, gere os bytes da imagem e defina-os em um 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 SubSubstituição de namespace
Importações antigas a serem removidas:
// Remove these
using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;netNova importação a adicionar:
// Add this
using IronBarCode;Imports IronBarCodeReferência de Mapeamento de API
| Código de barras DevExpress | Equivalente ao IronBarcode |
|---|---|
new BarCodeControl() | Estático — nenhuma instância |
new Code128Generator() + barCode.Symbology = symbology | BarcodeEncoding.Code128 parametro |
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 | Primeiro argumento para CreateBarcode ou CreateQrCode |
barCode.Module = 0.02f | .ResizeTo(width, height) em pixels |
barCode.ShowText = true | .AddBarcodeText() |
DrawToBitmap(bitmap, rect) | .SaveAsPng(path) |
new Bitmap(w, h) + disposição manual | Não é necessário |
Bitmap → MemoryStream → HTTP | .ToPngBinaryData() |
| Sem API de leitura | BarcodeReader.Read(path) |
using DevExpress.XtraEditors + using DevExpress.XtraPrinting.BarCode | using IronBarCode |
Lista de verificação para migração
Use este padrão grep para encontrar todos os arquivos que precisam ser atualizados:
grep -r "BarCodeControl\|Code128Generator\|QRCodeGenerator\|DataMatrixGenerator\|PDF417Generator\|AztecCodeGenerator" --include="*.cs" .
grep -r "barCode\.Module\|barCode\.Symbology\|DrawToBitmap\|DevExpress\.XtraPrinting\.BarCode" --include="*.cs" .
Analise cada partida:
- Substitua
using DevExpress.XtraEditors;eusing DevExpress.XtraPrinting.BarCode;porusing IronBarCode; - Substitua
new BarCodeControl()+ configuração de simbologia porBarcodeWriter.CreateBarcode(data, BarcodeEncoding.X) - Substitua
new QRCodeGenerator()+ configuração de simbologia porQRCodeWriter.CreateQrCode(data, size, errorLevel) - Substitua
barCode.Module = Xpor.ResizeTo(width, height) - Substitua
DrawToBitmap+ padrãobitmap.Savepor.SaveAsPng(path) - Substitua os padrões de Bitmap-para-MemoryStream por
.ToPngBinaryData() - Adicione
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"na inicialização do aplicativo - Adicione chamadas
BarcodeReader.Read()onde quer que a capacidade de leitura seja necessária
Se um projeto usa o DevExpress apenas para controles de código de barras e nenhum outro componente DX, remova os pacotes NuGet do DevExpress depois que todas as referências a códigos de barras forem substituídas. Se o projeto utiliza controles de grade, gráfico ou outros controles de interface do usuário do DevExpress, mantenha esses pacotes instalados — esta migração afeta apenas o código de barras.

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.