DevExpress 条形码 vs IronBarcode:UI 控件 vs 独立库
DevExpress 是一款备受好评的.NET UI 工具包。 网格、计划表、图表和数据透视表控件广泛用于企业团队。 然而,条形码支持的情况则有所不同。 DevExpress 提供了一个 BarCodeControl—一个 WinForms 控件和一个 Blazor DxBarCode 标签—可以让您在表单上渲染条形码。 DevExpress 支持已确认不存在读取功能,并且当前没有添加计划。 如果您的条形码位于后台作业、Web API、PDF 文档或任何没有 UI 表单的环境中,则此控件不适用。
这一限制将 DevExpress 条形码产品的功能缩小到一个特定的领域:在 DevExpress WinForms 或Blazor UI 中以可视方式呈现条形码。 对于特定应用场景,它完全够用。但对于其他任何应用——例如服务器端生成、读取图像或 PDF 文件、在 Azure Functions 或 Docker 容器中进行无头处理——都需要使用不同的工具。
了解 DevExpress 条码控件
DevExpress BarCodeControl 位于 DevExpress.XtraEditors,其符号生成器类位于 DevExpress.XtraPrinting.BarCode 中。 它不是一个独立的库。 它包含在 DXperience 套件中,起价为每年 $1,699.99(Universal 订阅为 $2,299.99)。 没有单独的仅包含条形码的NuGet包可供安装。
BarCodeControl 是一个 WinForms 控件。 您可以使用符号系统对象对其进行配置,设置属性,然后它会在屏幕上呈现。 将该渲染保存到文件需要调用 DrawToBitmap,它需要一个预分配的合适大小的 Bitmap:
// 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()请注意这里存在几个摩擦点。 首先,barCode.Module 使用的是文档单位而不是像素,如果您考虑的是像素尺寸,这会导致不匹配。 其次,您必须在分配 Bitmap 之前知道最终的像素大小。 第三,该控件需要加载 WinForms 程序集——这意味着ASP.NET Core最小 API 或控制台后台服务必须加载 Windows Forms 基础结构才能生成条形码图像。
Blazor DxBarCode 标签在概念上类似,但它是用于 UI 渲染的 Razor 组件,而不是服务器端生成 API。
无读取功能
DevExpress 的官方立场是,他们不提供条形码识别或扫描功能。 DevExpress 支持中心声明:"DevExpress 条形码控件仅用于条形码生成。 我们不提供条形码识别/扫描功能。"目前无添加计划。
对于那些最初使用 DevExpress WinForms 应用程序开发,之后又需要扫描上传图片中的条形码或读取 PDF 附件中的二维码的团队来说,DevExpress 工具箱无法提供帮助。您需要引入一个单独的库来处理读取操作,这就引出了一个问题:为了保持 API 的一致性,生成端是否也应该迁移到该库?
IronBarcode可以处理双向通信:
//IronBarcodereading — 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}")
Next读取PDF文件不需要任何额外的库:
// 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}")
NextSuite捆绑问题
DevExpress 条形码组件不作为独立产品出售。 要在任何项目中使用 BarCodeControl,您的团队需要一个 DevExpress 订阅—ASP.NET & Blazor 层起始价为 $1,099.99/年,DXperience (WinForms + WPF) 为 $1,699.99/年,Universal 为 $2,299.99/年。 该Suite包括网格、图表、日程安排器、透视表和许多其他控件——如果您正在构建完整的 DevExpress WinForms 或Blazor应用程序,这是合理的。 如果您只需要为后端服务生成条形码,那么您实际上是在为整个 UI 工具包付费,而该服务永远不会使用这个工具包。
IronBarcode是一个独立软件包:
dotnet add package IronBarcode
永久Lite许可证起价为 749 美元(适用于一位开发者)。 未捆绑任何用户界面工具包。 您将获得条形码生成和读取功能、跨平台支持,以及其他您未要求的功能。
无头模式使用限制
在服务器端场景中,BarCodeControl 的根本问题在于它是一个 WinForms 控件。 在.NET 6+ ASP.NET Core最小 API 项目中,默认情况下不引用 WinForms 程序集。 要实例化 BarCodeControl,您的 API 项目必须明确针对 Windows 并加载 Windows Forms 运行时,或添加引用以解决您的 API 从未渲染的 UI 基础设施。
在 Azure 函数消耗计划中,完全没有 UI 层。 在运行 Linux 基础镜像的 Docker 容器中,Windows Forms GDI+ 依赖项可能完全缺失。 DevExpress 不在这些无头环境中正式支持使用 BarCodeControl。
IronBarcode使用完全程序化的静态 API:
// 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")这个调用可以在控制台应用程序、 ASP.NET Core控制器、由服务总线消息触发的 Azure 函数或在 Linux 上运行的 Docker 容器中正常工作。 API在不同环境下不会改变。 没有用户界面程序集依赖项。
返回条形码(PNG 文件响应)的 ASP.NET Core端点如下所示:
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)如果没有显著的解决方法,BarCodeControl 没有等价的模式。
了解IronBarcode
IronBarcode是一个独立的.NET库,用于生成和读取条形码。 API 是完全静态的——无需管理实例,无需控制生命周期,也无需依赖 UI。 生成和读取操作都在同一个调用中完成:
// 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-9921许可证激活只需在启动时执行一行命令:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"无网络通话。 没有错误处理样板代码。 本地验证。
并排二维码
二维码说明了用户界面控件和程序库之间的 API 差距。
DevExpress 二维码 — 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()IronBarcode二维码——效果相同,无需组装用户界面:
// IronBarcode: QR in one method chain
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");net在二维码中心添加品牌标识:
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 没有类似的嵌入式徽标功能。 该控件仅生成一个标准的二维码,没有其他功能。
功能对比
| 特征 | DevExpress 条形码 | IronBarcode |
|---|---|---|
| 条形码生成 | 是的(WinForms控件, Blazor标签) | 是的(程序化 API,所有环境) |
| 条形码读取/扫描 | 不——已正式确认 | 是的——图像、PDF、字节数组 |
| PDF条形码读取 | 否 | 是的——原生支持,无需额外库 |
| 独立NuGet包 | 不需要——需要 DXperienceSuite | 是的—仅限 IronBarcode |
| Suite费用 | 从 $1,099.99/年(ASP.NET & Blazor)到 $2,299.99/年(Universal) | 不适用 — 独立 |
| 许可证费用 | 仅限订阅 | 永久 749 美元起 |
| ASP.NET Core / 最小 API | 需要使用 WinForms 变通方法 | 本地支持 |
| Azure Functions | 不支持无头模式 | 全面支持 |
| Docker / Linux | Linux 基础镜像上的 GDI+ 问题 | 全面支持 |
| 控制台应用程序 | 需要加载 WinForms 程序集 | 本地支持 |
| 二维码生成 | 是的(通过 QRCodeGenerator 符号系统) | 是的(二维码写入器) |
| 带有嵌入式徽标的二维码 | 否 | 是的——.AddBrandLogo() |
| QR误差校正水平 | H、Q、M、L | 最高、高、中、低 |
| 代码 128 | 是 | 是 |
| 数据矩阵 | 是 | 是 |
| PDF417 | 是 | 是 |
| 阿兹特克 | 是 | 是 |
| 文件输出 | DrawToBitmap — 手动位图分配 | .SaveAsPng()、.SaveAsGif()、.SaveAsSvg() |
| 二进制输出(HTTP响应) | 手动位图 → 内存流 | .ToPngBinaryData() |
| 多线程读取 | 不适用——无读数 | 最大并行线程数 = 4 |
| 多条形码读取 | 不适用——无读数 | ExpectMultipleBarcodes = true |
| 平台 | Windows(WinForms / Blazor) | Windows、Linux、macOS、Docker、Azure、AWS Lambda |
| .NET版本支持 | .NET Framework + 现代.NET (Windows) | .NET Framework 4.6.2 及当前 .NET 版本 |
API 映射参考
熟悉 DevExpress BarCodeControl 模式的团队会发现这些等价物很有用:
| DevExpress 条形码 | IronBarcode |
|---|---|
new BarCodeControl() | 静态——无需实例 |
new Code128Generator() + barCode.Symbology = symbology | BarcodeEncoding.Code128 作为参数传递 |
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 (文档单位) | .ResizeTo(width, height) (像素) |
barCode.ShowText = true | .AddBarcodeText() |
DrawToBitmap(bitmap, rect) — 手动 Bitmap 分配 | .SaveAsPng(path) — 自动处理尺寸 |
手动 Bitmap → MemoryStream 用于 HTTP 响应 | .ToPngBinaryData() |
| 无读取 API | BarcodeReader.Read(imagePath) |
| 没有读取结果类型 | .Value (字符串), .Format (BarcodeEncoding) |
| 每个项目都需要 UI 程序集 | 适用于任何.NET项目类型 |
| 仅限套件(起价 $1,099.99/年) | 独立版(永久版起价 749 美元) |
当球队切换
通常有几个特定场景会触发从 DevExpress 条形码控件迁移到IronBarcode。
**读取需求出现。**最常见的情况是,一个 WinForms 应用程序多年来一直在生成条形码,现在收到一项新功能请求:该应用程序必须能够扫描或验证上传图像或相机拍摄图像中的条形码。 DevExpress 没有读取 API。 无论如何,团队都需要一个新的库,将生成过程整合到同一个库中也是合理的。
**需要一个 Web API 端点。**一个团队正在构建一个微服务,用于按需生成条形码标签——该服务可从 Web 前端、移动应用或其他服务调用。该ASP.NET Core项目不依赖 WinForms,团队也不希望添加 WinForms。IronBarcode的静态 API 可以集成到 HTTP 端点中,无需任何 UI 组装。
**Azure 函数或 Lambda 部署。**无服务器部署通常使用基于 Linux 的镜像和最小化的运行时环境。 BarCodeControl 并不是为此环境设计的。 IronBarcode无需任何配置更改即可在 Linux、Docker 容器、Azure Functions 和 AWS Lambda 上运行。
单个功能的套件续费成本。 当续费时间到来并且团队审核他们实际从 DXperience 套件中使用的内容时,发现特定服务中唯一的 DevExpress 组件是 BarCodeControl 引发成本讨论。 当一个独立库费用为 $999 永久时,为条形码生成支付全价 DXperience 订阅($1,699.99/年,新购,$849.99/年,续约)是很难下决心的。
**从 PDF 中读取多个条形码。**文档处理工作流程——从发票 PDF、发货清单或扫描表单中读取条形码——需要同时支持 PDF 和具备读取能力。 IronBarcode可以直接读取 PDF 文件,无需额外的库。 DevExpress 不具备这两种功能。
结论
DevExpress 的条形码解决方案最好理解为 UI 工具包中捆绑的一个 UI 渲染功能。 如果您的应用程序是一个已经使用 DevExpress 进行网格和图表控制的 WinForms 或 Blazor 应用程序,并且您唯一需要的条形码功能是将条形码在表单上可视化显示,那么 BarCodeControl 是一个合理的选择—您已经拥有许可证。
当您需要以下任何一项时,BarCodeControl 不再是合适的工具:读取条形码、在服务器端上下文中生成条形码、在无头环境中运行、在 Linux 上工作或无 WinForms 程序集引用操作。 DevExpress技术支持已确认目前没有读取功能,并且没有计划添加该功能。 无头模式的限制是架构问题,而不是配置问题。 UI控件就是UI控件。
IronBarcode专为程序化条形码工作而构建——通过静态 API 在任何环境、任何平台上生成和读取条形码。 这两种工具解决的是不同的问题。 DevExpress 条形码用于在表单内渲染。 IronBarcode用于处理条形码代码。

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。