Código de barras DevExpress vs IronBarcode: Controle de UI vs Biblioteca Autônoma
DevExpress é um kit de ferramentas de interface de usuário .NET muito conceituado. O grid, scheduler, gráfico e controles de tabela dinâmica são amplamente usados por equipes empresariais. O suporte para código de barras, no entanto, é uma história diferente. DevExpress entrega um BarCodeControl — um controle WinForms e uma tag Blazor DxBarCode — que permite renderizar um código de barras em um formulário. O suporte da DevExpress confirmou que não existe capacidade de leitura e não há planos atuais de adicioná-la. Se seus códigos de barras estiverem em uma tarefa em segundo plano, uma API da web, um documento PDF ou qualquer ambiente sem um formulário de interface do usuário, o controle não se aplica.
Essa restrição limita a oferta de código de barras da DevExpress a um nicho específico: renderizar um código de barras visualmente dentro de uma interface de usuário DevExpress WinForms ou Blazor . Para esse nicho específico, funciona bem. Para qualquer outra coisa — geração no servidor, leitura de imagens ou PDFs, processamento sem interface gráfica em Azure Functions ou contêineres Docker — você precisa de uma ferramenta diferente.
Entendendo os controles de código de barras da DevExpress
DevExpress BarCodeControl reside em DevExpress.XtraEditors, com suas classes de geração de simbologia em DevExpress.XtraPrinting.BarCode. Não se trata de uma biblioteca independente. É agrupado na suíte DXperience, que começa em $1.699,99 por ano (assinaturas Universais são $2.299,99). Não existe um pacote NuGet separado, exclusivo para códigos de barras, que você possa instalar.
O BarCodeControl é um controle WinForms. Você o configura com um objeto de simbologia, define as propriedades e ele é renderizado na tela. Salvar essa renderização em um arquivo requer chamar DrawToBitmap, que espera um Bitmap pré-alocado do tamanho certo:
// 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()Observe os vários pontos de atrito aqui. Primeiro, barCode.Module está em unidades de documento em vez de pixels, o que cria uma discrepância se você está pensando nas dimensões em pixels. Segundo, você deve saber o tamanho final em pixels antes de alocar o Bitmap. Em terceiro lugar, o controle exige que os assemblies do WinForms sejam carregados — o que significa que uma API mínima do ASP.NET Core ou um serviço em segundo plano do console deve carregar a infraestrutura do Windows Forms apenas para gerar uma imagem de código de barras.
A tag Blazor DxBarCode é conceitualmente semelhante, mas é um componente Razor para renderização de UI, não uma API de geração do lado do servidor.
Sem capacidade de leitura
A posição oficial da DevExpress é que eles não fornecem funcionalidade de reconhecimento ou digitalização de código de barras. O Centro de Suporte DevExpress afirma: "O controle DevExpress BarCode é projetado apenas para geração de códigos de barras. Não fornecemos funcionalidade de reconhecimento/escaneamento de códigos de barras." Não há planos atuais de adicioná-la.
Para equipes que começam com um aplicativo DevExpress WinForms e posteriormente recebem a necessidade de escanear um código de barras de uma imagem carregada ou ler um código QR de um anexo PDF, o conjunto de ferramentas DevExpress não será suficiente. Será necessário utilizar uma biblioteca separada para lidar com a leitura, o que imediatamente levanta a questão de se a parte de geração também deve migrar para essa biblioteca para manter a consistência da API.
O IronBarcode lida com ambas as direções:
//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}");
}
A leitura de um arquivo PDF não requer nenhuma biblioteca adicional:
// 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}")
NextA questão do pacote de Suite
Os componentes de código de barras da DevExpress não são vendidos como um produto independente. Para usar BarCodeControl em qualquer projeto, sua equipe precisa de uma assinatura DevExpress — o nível ASP.NET & Blazor começa em $1.099,99/ano, DXperience (WinForms + WPF) é $1.699,99/ano, e Universal é $2.299,99/ano. O Suite inclui o grid, o gráfico, o agendador, a tabela dinâmica e muitos outros controles — o que é razoável se você estiver criando um aplicativo completo DevExpress WinForms ou Blazor . Se você precisa apenas da geração de código de barras para um serviço de backend, estará pagando por um conjunto completo de ferramentas de interface do usuário que o serviço nunca utilizará.
IronBarcode é um pacote independente:
dotnet add package IronBarcode
A licença Lite perpétua tem um preço inicial de US$ 749 para um desenvolvedor. Não há nenhum conjunto de ferramentas de interface do usuário incluído. Você obtém geração e leitura de códigos de barras, suporte multiplataforma e nada mais que você não tenha solicitado.
Limitação de uso em modo headless
O problema fundamental com BarCodeControl em cenários do lado do servidor é que ele é um controle WinForms. Em um projeto de API mínima ASP.NET Core .NET 6+, os assemblies do WinForms não são referenciados por padrão. Para instanciar BarCodeControl, seu projeto API deve ou direcionar explicitamente para Windows e carregar o runtime Windows Forms, ou adicionar referências de contorno que tragam uma infraestrutura de UI que sua API nunca renderizará.
Em um plano de consumo do Azure Functions, você não tem nenhuma camada de interface do usuário. Em um contêiner Docker executando uma imagem base do Linux, as dependências do GDI+ do Windows Forms podem estar completamente ausentes. DevExpress não oferece suporte oficial ao uso de BarCodeControl nesses ambientes sem cabeça.
IronBarcode utiliza uma API estática e 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")Essa chamada exata funciona em um aplicativo de console, um controlador ASP.NET Core , uma Função do Azure acionada por uma mensagem do Service Bus ou um contêiner Docker em execução no Linux. A API não muda entre ambientes. Não há dependência de montagem da interface do usuário.
Um endpoint ASP.NET Core que retorna um código de barras como um arquivo PNG de resposta tem a seguinte aparência:
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)Não há padrão equivalente com BarCodeControl sem contornizações significativas.
Entendendo o IronBarcode
IronBarcode é uma biblioteca .NET independente para gerar e ler códigos de barras. A API é totalmente estática — sem instâncias para gerenciar, sem controle de ciclo de vida, sem dependência de interface do usuário. A geração e a leitura funcionam na mesma chamada:
// 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-9921A ativação da licença é feita em uma única linha no processo de inicialização:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Sem chamada de rede. Sem código padrão para tratamento de erros. Validação local.
Código QR lado a lado
Os códigos QR ilustram a lacuna de API entre um controle de interface do usuário e uma biblioteca programática.
Código QR DevExpress — controle 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 IronBarcode— mesmo resultado, sem necessidade de montagem de interface de usuário:
// IronBarcode: QR in one method chain
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");netAdicionar o logotipo da marca ao centro do 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")A DevExpress não possui equivalente para logotipos incorporados. O controle exibe um código QR padrão e nada mais.
Comparação de recursos
| Recurso | Código de barras DevExpress | IronBarcode |
|---|---|---|
| Geração de código de barras | Sim (controle WinForms, tag Blazor ) | Sim (API programática, todos os ambientes) |
| Leitura/escaneamento de código de barras | Não — confirmado oficialmente | Sim — imagens, PDFs, matrizes de bytes |
| Leitura de código de barras em PDF | Não | Sim — nativo, sem biblioteca extra |
| Pacote NuGet independente | Não — é necessário o Suite DXperience. | Sim — apenas IronBarcode |
| Custo da Suite | A partir de $1.099,99/ano (ASP.NET & Blazor) até $2.299,99/ano (Universal) | N/A — independente |
| Custo da licença | Somente por assinatura | Perpétuo a partir de $999 |
| ASP.NET Core / API mínima | Requer soluções alternativas para WinForms. | Suporte nativo |
| Azure Functions | Não é compatível com modo headless. | Suporte total |
| Docker / Linux | Problemas com GDI+ em imagens base do Linux | Suporte total |
| Aplicativos de console | Requer o carregamento do assembly WinForms. | Suporte nativo |
| Geração de código QR | Sim (via simbologia QRCodeGenerator) | Sim (QRCodeWriter) |
| QR Code com logotipo incorporado | Não | Sim — .AdicionarLogotipoDaMarca() |
| Níveis de correção de erros de QR Code | H, Q, M, L | Máximo, Alto, Médio, Baixo |
| Código 128 | Sim | Sim |
| Matriz de dados | Sim | Sim |
| PDF417 | Sim | Sim |
| asteca | Sim | Sim |
| Saída de arquivo | DrawToBitmap — alocação manual de Bitmap | .SalvarComoPng(), .SalvarComoGif(), .SalvarComoSvg() |
| Saída binária (resposta HTTP) | Bitmap manual → Fluxo de memória | .ToPngBinaryData() |
| Leitura multithread | N/A — sem leitura | MaxParallelThreads = 4 |
| Leitura de múltiplos códigos de barras | N/A — sem leitura | ExpectMultipleBarcodes = true |
| Plataformas | Windows (WinForms / Blazor) | Windows, Linux, macOS, Docker, Azure, AWS Lambda |
| Suporte à versão .NET | .NET Framework + .NET moderno (Windows) | .NET Framework 4.6.2 até o .NET atual |
Referência de Mapeamento de API
As equipes familiarizadas com o padrão DevExpress BarCodeControl acharão essas equivalências úteis:
| Código de barras DevExpress | IronBarcode |
|---|---|
new BarCodeControl() | Estático — nenhuma instância necessária |
new Code128Generator() + barCode.Symbology = symbology | BarcodeEncoding.Code128 passado 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) (pixels) |
barCode.ShowText = true | .AddBarcodeText() |
DrawToBitmap(bitmap, rect) — alocação manual de Bitmap | .SaveAsPng(path) — lida com o dimensionamento automaticamente |
Manual Bitmap → MemoryStream para resposta HTTP | .ToPngBinaryData() |
| Sem API de leitura | BarcodeReader.Read(imagePath) |
| Tipo de resultado de leitura negativa | .Value (string), .Format (BarcodeEncoding) |
| A montagem da interface do usuário é necessária em todos os projetos. | Funciona em qualquer tipo de projeto .NET. |
| Apenas suíte (a partir de $1.099,99/ano) | Autônomo (a partir de US$ 749, licença perpétua) |
Quando as equipes trocam
Diversos cenários específicos costumam motivar a migração dos controles de código de barras DevExpress para o IronBarcode.
Chega um requisito de leitura. O cenário mais comum é o de um aplicativo WinForms que gera códigos de barras há anos e, de repente, surge uma nova solicitação de recurso: o aplicativo agora precisa escanear ou verificar códigos de barras a partir de imagens carregadas ou capturas de câmera. DevExpress não possui API de leitura. A equipe precisa de uma nova biblioteca de qualquer forma, e faz sentido consolidar a geração nessa mesma biblioteca.
Necessidade de um endpoint de API web. Uma equipe está desenvolvendo um microsserviço que gera etiquetas de código de barras sob demanda — acionadas por um frontend web, um aplicativo móvel ou outro serviço. O projeto ASP.NET Core não possui dependência do WinForms e a equipe não deseja adicionar uma. A API estática do IronBarcode se integra a um endpoint HTTP sem a necessidade de qualquer configuração adicional de interface de usuário.
Implantação do Azure Functions ou Lambda. Implantações sem servidor geralmente usam imagens base do Linux e tempos de execução mínimos. BarCodeControl não é projetado para este ambiente. O IronBarcode funciona no Linux, em contêineres Docker, no Azure Functions e no AWS Lambda sem necessidade de alterações de configuração.
Custo de renovação da suíte para uma única funcionalidade. Quando a renovação acontece e uma equipe audita o que realmente usa da suíte DXperience, descobrir que o único componente DevExpress em um serviço específico é BarCodeControl cria uma conversa sobre custo. Pagar uma assinatura completa do DXperience ($1.699,99/ano novo, $849,99/ano na renovação) para geração de códigos de barras quando uma biblioteca autônoma custa $999 perpétuo é um argumento difícil de fazer.
Leitura de múltiplos códigos de barras em PDFs. Os fluxos de trabalho de processamento de documentos — como a leitura de códigos de barras em PDFs de faturas, manifestos de remessa ou formulários digitalizados — exigem suporte a PDF e capacidade de leitura. O IronBarcode lê diretamente arquivos PDF sem necessidade de bibliotecas adicionais. A DevExpress não oferece nenhuma dessas funcionalidades.
Conclusão
A solução de código de barras da DevExpress é melhor compreendida como um recurso de renderização de interface do usuário integrado a um kit de ferramentas de interface do usuário. Se o seu aplicativo é um aplicativo WinForms ou Blazor que já utiliza DevExpress para seus controles de grade e gráfico, e sua única necessidade de código de barras é exibi-lo visualmente em um formulário, o BarCodeControl é uma escolha razoável — você já possui a licença.
No momento em que você precisa de qualquer um dos seguintes, BarCodeControl deixa de ser a ferramenta certa: ler códigos de barras, gerar códigos de barras em um contexto do lado do servidor, executar em um ambiente sem cabeça, trabalhar no Linux ou operar sem uma referência de assembly WinForms. O suporte da DevExpress confirmou que não há funcionalidade de leitura e que não há planos para adicioná-la. A limitação do modo headless é arquitetônica, não um problema de configuração. Um controle de interface do usuário é um controle de interface do usuário.
O IronBarcode foi desenvolvido para trabalho programático com códigos de barras — geração e leitura por meio de uma API estática, em qualquer ambiente e em qualquer plataforma. As duas ferramentas resolvem problemas diferentes. O código de barras DevExpress serve para ser renderizado dentro de um formulário.IronBarcode serve para processar códigos de barras em código.

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.