DevExpress Barcode vs IronBarcode: C# Barcode Library Comparison
DevExpress is a well-regarded .NET UI toolkit. The grid, scheduler, chart, and pivot table controls are genuinely excellent and used by thousands of enterprise teams. The barcode support, however, is a different story. DevExpress ships a BarCodeControl — a WinForms control and a Blazor DxBarCode tag — that lets you render a barcode onto a form at design time. When their support team has been asked about barcode recognition, the answer has been consistent: no reading capability exists, and there are no current plans to add it. If your barcodes live in a background job, a web API, a PDF document, or any environment without a UI form in play, the control does not apply.
That constraint narrows the DevExpress barcode offering to a specific niche: rendering a barcode visually inside a DevExpress WinForms or Blazor UI. For that niche it works fine. For anything else — server-side generation, reading from images or PDFs, headless processing in Azure Functions or Docker containers — you need a different tool.
Understanding DevExpress Barcode Controls
DevExpress barcode functionality lives in DevExpress.XtraBars.BarCode and related symbology namespaces. It is not a standalone library. It is bundled in the DXperience suite, which costs approximately $2,499+ per year. There is no separate barcode-only NuGet package you can install.
The BarCodeControl is a WinForms control that inherits from the control hierarchy. You configure it with a symbology object, set properties, and it renders on screen. Saving that rendering to a file requires calling DrawToBitmap, which expects a pre-allocated Bitmap of the right size:
// DevExpress WinForms: UI control, not a library
using DevExpress.XtraBars.BarCode;
using DevExpress.XtraBars.BarCode.Symbologies;
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();
// DevExpress WinForms: UI control, not a library
using DevExpress.XtraBars.BarCode;
using DevExpress.XtraBars.BarCode.Symbologies;
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.XtraBars.BarCode
Imports DevExpress.XtraBars.BarCode.Symbologies
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()
Notice several friction points here. First, barCode.Module is in document units rather than pixels, which creates a mismatch if you are thinking in pixel dimensions. Second, you must know the final pixel size before allocating the Bitmap. Third, the control requires the WinForms assemblies to be loaded — which means an ASP.NET Core minimal API or a console background service must load Windows Forms infrastructure just to generate a barcode image.
The Blazor DxBarCode tag is conceptually similar but is a Razor component for UI rendering, not a server-side generation API.
No Reading Capability
DevExpress's official position is that they do not provide barcode recognition or scanning functionality. This is not a gap waiting to be filled in an upcoming release — it has been the consistent answer for years.
For teams that start with a DevExpress WinForms application and later receive a requirement to scan a barcode from an uploaded image or read a QR code from a PDF attachment, the DevExpress toolbox cannot help. You will need to bring in a separate library to handle reading, which immediately raises the question of whether the generation side should also move to that library for API consistency.
IronBarcode handles both directions:
// 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}");
}
// 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}")
Next
Reading from a PDF file requires zero extra libraries:
// 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}");
}
// 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}")
Next
The Suite Bundling Issue
DevExpress barcode components are not sold as a standalone product. To use BarCodeControl in any project, your team needs a DXperience suite license at roughly $2,499 per year per developer. The suite includes the grid, chart, scheduler, pivot, and many other controls — which is reasonable if you are building a full DevExpress WinForms or Blazor application. If you only need barcode generation for a backend service, you are paying for an entire UI toolkit that the service will never use.
IronBarcode is a standalone package:
dotnet add package IronBarcode
dotnet add package IronBarcode
The perpetual Lite license starts at $749 for one developer. There is no UI toolkit bundled in. You get barcode generation and reading, cross-platform support, and nothing else you did not ask for.
Headless Usage Limitation
The fundamental problem with BarCodeControl in server-side scenarios is that it is a WinForms control. In a .NET 6+ ASP.NET Core minimal API project, WinForms assemblies are not referenced by default. To instantiate BarCodeControl, your API project must either target Windows explicitly and load the Windows Forms runtime, or add workaround references that pull in UI infrastructure that your API will never render.
In an Azure Function consumption plan, you have no UI layer at all. In a Docker container running a Linux base image, the Windows Forms GDI+ dependencies may be absent entirely. DevExpress does not officially support BarCodeControl usage in these headless environments.
IronBarcode uses a fully programmatic, static 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");
// 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")
This exact call works in a console application, an ASP.NET Core controller, an Azure Function triggered by a Service Bus message, or a Docker container running on Linux. The API does not change between environments. There is no UI assembly dependency.
An ASP.NET Core endpoint that returns a barcode as a PNG file response looks like this:
app.MapGet("/barcode/{sku}", (string sku) =>
{
var bytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
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)
There is no equivalent pattern with BarCodeControl without significant workarounds.
Understanding IronBarcode
IronBarcode is a standalone .NET library for generating and reading barcodes. The API is fully static — no instances to manage, no control lifecycle, no UI dependency. Generation and reading both work in the same call:
// 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-9921
// 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-9921
Imports 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
License activation is a single line at startup:
IronBarCode.License.LicenseKey = "YOUR-KEY";
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-KEY"
No network call. No error-handling boilerplate. Local validation.
QR Code Side-by-Side
QR codes illustrate the API gap between a UI control and a programmatic library.
DevExpress QR code — WinForms control:
// DevExpress: QR via BarCodeControl + QRCodeGenerator symbology
using DevExpress.XtraBars.BarCode;
using DevExpress.XtraBars.BarCode.Symbologies;
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();
// DevExpress: QR via BarCodeControl + QRCodeGenerator symbology
using DevExpress.XtraBars.BarCode;
using DevExpress.XtraBars.BarCode.Symbologies;
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.XtraBars.BarCode
Imports DevExpress.XtraBars.BarCode.Symbologies
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 QR code — same result, no UI assembly required:
// IronBarcode: QR in one method chain
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");
// IronBarcode: QR in one method chain
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");
Adding a brand logo to the center of the QR code:
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");
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("qr-branded.png")
DevExpress has no equivalent for embedded logos. The control renders a standard QR code and nothing more.
Feature Comparison
| Feature | DevExpress Barcode | IronBarcode |
|---|---|---|
| Barcode generation | Yes (WinForms control, Blazor tag) | Yes (programmatic API, all environments) |
| Barcode reading / scanning | No — officially confirmed | Yes — images, PDFs, byte arrays |
| PDF barcode reading | No | Yes — native, no extra library |
| Standalone NuGet package | No — DXperience suite required | Yes — IronBarcode only |
| Suite cost | ~$2,499+/yr (full UI suite) | N/A — standalone |
| License cost | Subscription only | Perpetual from $749 |
| ASP.NET Core / minimal API | Requires WinForms workarounds | Native support |
| Azure Functions | Not supported headlessly | Full support |
| Docker / Linux | GDI+ issues on Linux base images | Full support |
| Console applications | Requires WinForms assembly loading | Native support |
| QR code generation | Yes (via QRCodeGenerator symbology) | Yes (QRCodeWriter) |
| QR with embedded logo | No | Yes — .AddBrandLogo() |
| QR error correction levels | H, Q, M, L | Highest, High, Medium, Low |
| Code 128 | Yes | Yes |
| Data Matrix | Yes | Yes |
| PDF417 | Yes | Yes |
| Aztec | Yes | Yes |
| File output | DrawToBitmap — manual Bitmap allocation | .SaveAsPng(), .SaveAsGif(), .SaveAsSvg() |
| Binary output (HTTP response) | Manual Bitmap → MemoryStream | .ToPngBinaryData() |
| Multi-thread reading | N/A — no reading | MaxParallelThreads = 4 |
| Multi-barcode reading | N/A — no reading | ExpectMultipleBarcodes = true |
| Platforms | Windows (WinForms / Blazor) | Windows, Linux, macOS, Docker, Azure, AWS Lambda |
| .NET version support | .NET Framework + modern .NET (Windows) | .NET 4.6.2 through .NET 9 |
API Mapping Reference
Teams familiar with the DevExpress BarCodeControl pattern will find these equivalences useful:
| DevExpress Barcode | IronBarcode |
|---|---|
new BarCodeControl() |
Static — no instance needed |
new Code128Generator() + barCode.Symbology = symbology |
BarcodeEncoding.Code128 passed as parameter |
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 (document units) |
.ResizeTo(width, height) (pixels) |
barCode.ShowText = true |
.AddBarcodeText() |
DrawToBitmap(bitmap, rect) — manual Bitmap allocation |
.SaveAsPng(path) — handles sizing automatically |
Manual Bitmap → MemoryStream for HTTP response |
.ToPngBinaryData() |
| No reading API | BarcodeReader.Read(imagePath) |
TextResult type |
.Value (string), .Format (BarcodeEncoding) |
| UI assembly required in every project | Works in any .NET project type |
| Suite-only (~$2,499+/yr) | Standalone (from $749 perpetual) |
When Teams Switch
Several specific scenarios commonly trigger the move from DevExpress barcode controls to IronBarcode.
Reading requirement arrives. The most common scenario is a WinForms application that has been generating barcodes for years, and a new feature request arrives: the application must now scan or verify barcodes from uploaded images or camera captures. DevExpress has no reading API. The team needs a new library regardless, and it makes sense to consolidate generation onto that same library.
Need for a web API endpoint. A team builds a microservice that generates barcode labels on demand — called from a web frontend, a mobile app, or another service. The ASP.NET Core project has no WinForms dependency and the team does not want to add one. IronBarcode's static API integrates into an HTTP endpoint without any UI assembly baggage.
Azure Function or Lambda deployment. Serverless deployments often use Linux base images and minimal runtimes. BarCodeControl is not designed for this environment. IronBarcode runs on Linux, in Docker containers, in Azure Functions, and in AWS Lambda without configuration changes.
Suite renewal cost for a single feature. When renewal comes around and a team audits what they actually use from the DXperience suite, discovering that the only DevExpress component in a particular service is BarCodeControl creates a cost conversation. Paying a full suite subscription for barcode generation when a standalone library costs $749 perpetual is a hard argument to make.
Multi-barcode reading from PDFs. Document processing workflows — reading barcodes from invoice PDFs, shipping manifests, or scanned forms — require both PDF support and reading capability. IronBarcode reads directly from PDF files with no extra library. DevExpress provides neither capability.
Conclusion
DevExpress's barcode offering is best understood as a UI rendering feature bundled inside a UI toolkit. If your application is a WinForms or Blazor application that already uses DevExpress for its grid and chart controls, and your only barcode need is displaying a barcode visually on a form, the BarCodeControl is a reasonable choice — you already have the license.
The moment you need any of the following, BarCodeControl stops being the right tool: reading barcodes, generating barcodes in a server-side context, running in a headless environment, working on Linux, or operating without a WinForms assembly reference. DevExpress support has confirmed no reading functionality and no plans to add it. The headless limitation is architectural, not a configuration problem. A UI control is a UI control.
IronBarcode is built for programmatic barcode work — generation and reading through a static API, in any environment, on any platform. The two tools solve different problems. DevExpress barcode is for rendering inside a form. IronBarcode is for processing barcodes in code.
Frequently Asked Questions
What is DevExpress Barcode?
DevExpress Barcode is a .NET barcode library for generating and reading barcodes in C# applications. It is one of several alternatives developers evaluate when selecting a barcode solution for .NET projects.
What are the main differences between DevExpress Barcode and IronBarcode?
IronBarcode uses a static, stateless API requiring no instance management, while DevExpress Barcode typically requires instance creation and configuration before use. IronBarcode also provides native PDF support, automatic format detection, and single-key licensing across all environments.
Is IronBarcode easier to license than DevExpress Barcode?
IronBarcode uses a single license key covering both development and production deployments. This simplifies CI/CD pipelines and Docker configurations compared to licensing systems that separate SDK keys from runtime keys.
Does IronBarcode support all barcode formats that DevExpress Barcode supports?
IronBarcode supports over 30 barcode symbologies including QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1, and many more. Format auto-detection means no explicit format enumeration is required.
Does IronBarcode support native PDF barcode reading?
Yes. IronBarcode reads barcodes directly from PDF files using BarcodeReader.Read("document.pdf") without requiring a separate PDF rendering library. Per-page results include page number, barcode format, value, and confidence score.
How does IronBarcode handle batch processing compared to DevExpress Barcode?
IronBarcode's static methods are stateless and naturally thread-safe, enabling direct use of Parallel.ForEach without per-thread instance management. There is no throughput ceiling at any pricing tier.
What .NET versions does IronBarcode support?
IronBarcode supports .NET Framework 4.6.2+, .NET Core 3.1, and .NET 5, 6, 7, 8, and 9 in a single NuGet package. Platform targets include Windows x64/x86, Linux x64, and macOS x64/ARM.
How do I install IronBarcode in a .NET project?
Install IronBarcode via NuGet: run 'Install-Package IronBarCode' in the Package Manager Console, or 'dotnet add package IronBarCode' in the CLI. No additional SDK installers or runtime files are required.
Can I evaluate IronBarcode before purchasing, unlike DevExpress?
Yes. IronBarcode's trial mode returns complete decoded barcode values — only generated output images receive a watermark. You can benchmark read accuracy on your own documents before committing to a purchase.
What is the pricing difference between DevExpress Barcode and IronBarcode?
IronBarcode starts at $749 for a perpetual single-developer license covering development and production. Pricing details and volume options are available on the IronBarcode licensing page. There is no separate runtime license requirement.
Is it straightforward to migrate from DevExpress Barcode to IronBarcode?
Migration from DevExpress Barcode to IronBarcode primarily involves replacing instance-based API calls with IronBarcode's static methods, removing licensing boilerplate, and updating result property names. Most migrations involve reducing code rather than adding it.
Does IronBarcode generate QR codes with logos?
Yes. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") embeds a brand image in a QR code natively with configurable error correction. Colored QR codes are also supported via ChangeBarCodeColor().

