Skip to footer content
MIGRATION GUIDES

Migrating from Telerik RadBarcode to IronBarcode

This guide provides a complete migration path from Telerik RadBarcode to IronBarcode for .NET developers who have reached the limits of what RadBarcode and RadBarcodeReader can do. It covers package replacement, namespace updates, license initialization, code-level migration examples, an API mapping reference, and a checklist for verifying the migration is complete. The examples focus on the scenarios most commonly encountered during Telerik barcode migrations: XAML control replacement, reading format expansion, server-side deployment, and PDF processing.

Why Migrate from Telerik RadBarcode

Telerik RadBarcode migrations are triggered by concrete technical requirements that the existing components cannot satisfy. The reasons below represent the conditions most commonly reported by teams who have completed or are evaluating this transition.

2D Reading Boundary: The RadBarcodeReader component in WPF and the BarCodeReader component in WinForms share the same reading engine, which is bounded by the DecodeType enum. That enum contains entries for 1D linear formats — Code128, Code39, EAN13, EAN8, UPCA, UPCE, Codabar, ITF — and nothing else. No entry exists for QR Code, DataMatrix, PDF417, or Aztec. When a new requirement arrives to process inbound QR codes or read DataMatrix labels from scanned documents, the DecodeType constraint becomes a hard blocker with no workaround available within the Telerik product family.

Platform Code Fragmentation: Reading with Telerik requires UI framework dependencies: RadBarcodeReader uses WPF types (BitmapImage) and BarCodeReader uses WinForms types (System.Drawing.Image). These types cannot be referenced in a shared .NET library, a console application, an ASP.NET Core project, or a Blazor server. A team that wants to centralize barcode reading logic in a shared service layer cannot do so with Telerik types — the reader implementations are permanently tied to their respective UI frameworks.

PDF Processing Gap: Many barcode workflows operate on documents rather than image files. Telerik RadBarcodeReader accepts only bitmap images. Reading a barcode embedded in a PDF page requires converting the page to an image using a separate library, then feeding that image to the Telerik reader — adding a dependency and still receiving only 1D results. For teams whose documents are primarily PDFs, this workaround adds friction at every point in the workflow.

Subscription Licensing: Telerik barcode functionality is not sold as a standalone package. Access to RadBarcode and RadBarcodeReader is bundled with platform-specific UI suite subscriptions — approximately $1,149 per developer per year for WinForms or WPF, or $1,469 per developer per year for all platforms under DevCraft UI. Teams whose primary requirement is barcode functionality, and who do not use other Telerik UI controls, absorb the full suite cost for a component that represents a small fraction of what is purchased.

The Fundamental Problem

The clearest expression of the Telerik reading limitation is that the component that generates a format cannot round-trip it through the reader:

// Telerik — generates a QR code, then cannot read it back
var qrBarcode = new RadBarcode();
qrBarcode.Value = "https://example.com/order/4821";
qrBarcode.Symbology = new QRCode { ErrorCorrectionLevel = ErrorCorrectionLevel.H };
// Save to file...

// Attempt to read the same QR code:
var reader = new RadBarcodeReader();
// DecodeType.QR does not exist — QR cannot be added to this list
reader.DecodeTypes = new[] { DecodeType.Code128, DecodeType.EAN13 };
var bitmap = new BitmapImage(new Uri("qr-output.png", UriKind.Absolute));
var result = reader.Decode(bitmap);
// result == null — always, for any QR code image
// Telerik — generates a QR code, then cannot read it back
var qrBarcode = new RadBarcode();
qrBarcode.Value = "https://example.com/order/4821";
qrBarcode.Symbology = new QRCode { ErrorCorrectionLevel = ErrorCorrectionLevel.H };
// Save to file...

// Attempt to read the same QR code:
var reader = new RadBarcodeReader();
// DecodeType.QR does not exist — QR cannot be added to this list
reader.DecodeTypes = new[] { DecodeType.Code128, DecodeType.EAN13 };
var bitmap = new BitmapImage(new Uri("qr-output.png", UriKind.Absolute));
var result = reader.Decode(bitmap);
// result == null — always, for any QR code image
' Telerik — generates a QR code, then cannot read it back
Dim qrBarcode As New RadBarcode()
qrBarcode.Value = "https://example.com/order/4821"
qrBarcode.Symbology = New QRCode With {.ErrorCorrectionLevel = ErrorCorrectionLevel.H}
' Save to file...

' Attempt to read the same QR code:
Dim reader As New RadBarcodeReader()
' DecodeType.QR does not exist — QR cannot be added to this list
reader.DecodeTypes = New DecodeType() {DecodeType.Code128, DecodeType.EAN13}
Dim bitmap As New BitmapImage(New Uri("qr-output.png", UriKind.Absolute))
Dim result = reader.Decode(bitmap)
' result == null — always, for any QR code image
$vbLabelText   $csharpLabel

IronBarcode closes this gap. Generation and reading use the same package, and the reading engine detects QR codes, DataMatrix, PDF417, and all other formats automatically:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-KEY";

// Generate a QR code
BarcodeWriter.CreateBarcode("https://example.com/order/4821", BarcodeEncoding.QRCode)
             .SaveAsPng("qr-output.png");

// Read that same QR code back — no format specification needed
var results = BarcodeReader.Read("qr-output.png");
Console.WriteLine(results.First().Value);
// Output: https://example.com/order/4821
// NuGet: dotnet add package IronBarcode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-KEY";

// Generate a QR code
BarcodeWriter.CreateBarcode("https://example.com/order/4821", BarcodeEncoding.QRCode)
             .SaveAsPng("qr-output.png");

// Read that same QR code back — no format specification needed
var results = BarcodeReader.Read("qr-output.png");
Console.WriteLine(results.First().Value);
// Output: https://example.com/order/4821
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-KEY"

' Generate a QR code
BarcodeWriter.CreateBarcode("https://example.com/order/4821", BarcodeEncoding.QRCode) _
             .SaveAsPng("qr-output.png")

' Read that same QR code back — no format specification needed
Dim results = BarcodeReader.Read("qr-output.png")
Console.WriteLine(results.First().Value)
' Output: https://example.com/order/4821
$vbLabelText   $csharpLabel

IronBarcode vs Telerik RadBarcode: Feature Comparison

Feature Telerik RadBarcode IronBarcode
1D barcode generation Yes (all platforms) Yes
2D barcode generation Yes (all platforms) Yes
1D barcode reading WPF + WinForms only Yes (all platforms)
QR code reading Not available Yes
DataMatrix reading Not available Yes
PDF417 reading Not available Yes
Aztec reading Not available Yes
PDF file reading Not available Yes (native)
Auto format detection No — DecodeType required Yes
ASP.NET Core reading Not available Yes
Blazor reading Not available Yes
Docker / Linux reading Not available Yes
Shared service library Not possible (platform types) Yes
Static read API No (requires instance) Yes
Standalone NuGet package No — UI suite required Yes
Perpetual license No — subscription Yes — from $999

Quick Start

Step 1: Replace NuGet Package

Remove the Telerik UI package for the platform or platforms in your project:

# WPF
dotnet remove package Telerik.UI.for.Wpf.60.Xaml

# WinForms
dotnet remove package Telerik.UI.for.WinForms.Common
dotnet remove package Telerik.UI.for.WinForms.Barcode

# Blazor
dotnet remove package Telerik.UI.for.Blazor
# WPF
dotnet remove package Telerik.UI.for.Wpf.60.Xaml

# WinForms
dotnet remove package Telerik.UI.for.WinForms.Common
dotnet remove package Telerik.UI.for.WinForms.Barcode

# Blazor
dotnet remove package Telerik.UI.for.Blazor
SHELL

If your project also uses other Telerik controls from the same package, leave the package in place and proceed to step 2. You will remove the barcode-specific API calls without removing the shared package.

Install IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

One package covers WPF, WinForms, ASP.NET Core, Blazor Server, console applications, Docker, Azure Functions, and AWS Lambda. The full platform compatibility details document the exact .NET versions and operating system targets supported.

Step 2: Update Namespaces

Remove Telerik barcode namespace imports and replace them with the IronBarcode namespace:

// Remove these namespace imports:
// using Telerik.Windows.Controls.Barcode;      // WPF reader and generator
// using Telerik.Windows.Controls;              // WPF general
// using Telerik.WinControls.UI;               // WinForms
// using Telerik.WinControls.UI.Barcode;        // WinForms barcode reader

// Add this:
using IronBarCode;
// Remove these namespace imports:
// using Telerik.Windows.Controls.Barcode;      // WPF reader and generator
// using Telerik.Windows.Controls;              // WPF general
// using Telerik.WinControls.UI;               // WinForms
// using Telerik.WinControls.UI.Barcode;        // WinForms barcode reader

// Add this:
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Step 3: Initialize License

Replace the Telerik license initialization with the IronBarcode key assignment at application startup:

// Remove:
// Telerik.WinControls.TelerikLicenseManager.InstallLicense("key");

// Add at application startup (Program.cs, App.xaml.cs, or composition root):
IronBarCode.License.LicenseKey = "YOUR-KEY";
// Remove:
// Telerik.WinControls.TelerikLicenseManager.InstallLicense("key");

// Add at application startup (Program.cs, App.xaml.cs, or composition root):
IronBarCode.License.LicenseKey = "YOUR-KEY";
$vbLabelText   $csharpLabel

The key assignment goes once in the application entry point. There is no license file to deploy, no per-platform initialization path, and no separate configuration for WPF versus ASP.NET Core.

Code Migration Examples

Generating a Barcode: XAML Control to Code-Based API

Telerik's generation in WPF is declarative — the RadBarcode XAML element renders directly in the UI tree. IronBarcode generates barcodes in code and returns a GeneratedBarcode object that can be saved as a file or converted to a BitmapSource for WPF display.

Telerik Approach:


<Window xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">
    <telerik:RadBarcode Value="PROD-2026-00184" Symbology="Code128" />
</Window>

<Window xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">
    <telerik:RadBarcode Value="PROD-2026-00184" Symbology="Code128" />
</Window>
XML
@* Blazor — TelerikBarcode renders as a Razor component *@
<TelerikBarcode Value="PROD-2026-00184" Type="@BarcodeType.Code128" />

IronBarcode Approach:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Save to file — replaces XAML generation + manual export
BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Display in WPF — assign to an Image control's Source property
var bitmapSource = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
                                .ToBitmapSource();
barcodeImageControl.Source = bitmapSource;

// Serve in Blazor or ASP.NET Core — return as base64 src attribute
byte[] bytes = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
                            .ResizeTo(400, 100)
                            .ToPngBinaryData();
string imgSrc = $"data:image/png;base64,{Convert.ToBase64String(bytes)}";
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Save to file — replaces XAML generation + manual export
BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Display in WPF — assign to an Image control's Source property
var bitmapSource = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
                                .ToBitmapSource();
barcodeImageControl.Source = bitmapSource;

// Serve in Blazor or ASP.NET Core — return as base64 src attribute
byte[] bytes = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
                            .ResizeTo(400, 100)
                            .ToPngBinaryData();
string imgSrc = $"data:image/png;base64,{Convert.ToBase64String(bytes)}";
Imports IronBarCode

' Save to file — replaces XAML generation + manual export
BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128) _
             .ResizeTo(400, 100) _
             .SaveAsPng("barcode.png")

' Display in WPF — assign to an Image control's Source property
Dim bitmapSource = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128) _
                                .ToBitmapSource()
barcodeImageControl.Source = bitmapSource

' Serve in Blazor or ASP.NET Core — return as base64 src attribute
Dim bytes As Byte() = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128) _
                                   .ResizeTo(400, 100) _
                                   .ToPngBinaryData()
Dim imgSrc As String = $"data:image/png;base64,{Convert.ToBase64String(bytes)}"
$vbLabelText   $csharpLabel

The BarcodeEncoding enum covers the same symbologies as Telerik's Symbology enum. Switching to QR code generation changes only the enum argument. For the full range of 2D barcode generation options, including QR error correction levels and DataMatrix dimensions, the IronBarcode documentation provides complete examples.

Reading Barcodes from Desktop Applications

Telerik provides two separate reader classes for desktop platforms — RadBarcodeReader for WPF and BarCodeReader for WinForms — with different class names, different property names, and different input types. IronBarcode replaces both with a single static call that works identically in either project type.

Telerik WPF Approach:

WPF reading requires a RadBarcodeReader instance, explicit DecodeType configuration, a BitmapImage object loaded from a URI, and a call to reader.Decode(). The result property is .Text.

using Telerik.Windows.Controls.Barcode;
using System.Windows.Media.Imaging;

public string ReadProductBarcode(string imagePath)
{
    var reader = new RadBarcodeReader();
    reader.DecodeTypes = new DecodeType[]
    {
        DecodeType.Code128,
        DecodeType.Code39,
        DecodeType.EAN13,
        DecodeType.EAN8,
        DecodeType.UPCA,
        DecodeType.UPCE,
        DecodeType.Codabar,
        DecodeType.ITF
    };

    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
    var result = reader.Decode(bitmap);

    return result?.Text ?? "No barcode found";
}
using Telerik.Windows.Controls.Barcode;
using System.Windows.Media.Imaging;

public string ReadProductBarcode(string imagePath)
{
    var reader = new RadBarcodeReader();
    reader.DecodeTypes = new DecodeType[]
    {
        DecodeType.Code128,
        DecodeType.Code39,
        DecodeType.EAN13,
        DecodeType.EAN8,
        DecodeType.UPCA,
        DecodeType.UPCE,
        DecodeType.Codabar,
        DecodeType.ITF
    };

    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
    var result = reader.Decode(bitmap);

    return result?.Text ?? "No barcode found";
}
Imports Telerik.Windows.Controls.Barcode
Imports System.Windows.Media.Imaging

Public Function ReadProductBarcode(imagePath As String) As String
    Dim reader = New RadBarcodeReader()
    reader.DecodeTypes = New DecodeType() {
        DecodeType.Code128,
        DecodeType.Code39,
        DecodeType.EAN13,
        DecodeType.EAN8,
        DecodeType.UPCA,
        DecodeType.UPCE,
        DecodeType.Codabar,
        DecodeType.ITF
    }

    Dim bitmap = New BitmapImage(New Uri(imagePath, UriKind.Absolute))
    Dim result = reader.Decode(bitmap)

    Return If(result?.Text, "No barcode found")
End Function
$vbLabelText   $csharpLabel

Telerik WinForms Approach:

The WinForms BarCodeReader class uses a different name, a different property name (DecodeType singular rather than DecodeTypes plural), and takes a System.Drawing.Image rather than a BitmapImage.

using Telerik.WinControls.UI.Barcode;
using System.Drawing;

public string ReadShippingLabel(string imagePath)
{
    var reader = new BarCodeReader();
    reader.DecodeType = new DecodeType[]
    {
        DecodeType.Code128,
        DecodeType.ITF,
        DecodeType.EAN13
    };

    using var image = Image.FromFile(imagePath);
    var result = reader.Read(image);

    return result?.Text ?? "No barcode found";
}
using Telerik.WinControls.UI.Barcode;
using System.Drawing;

public string ReadShippingLabel(string imagePath)
{
    var reader = new BarCodeReader();
    reader.DecodeType = new DecodeType[]
    {
        DecodeType.Code128,
        DecodeType.ITF,
        DecodeType.EAN13
    };

    using var image = Image.FromFile(imagePath);
    var result = reader.Read(image);

    return result?.Text ?? "No barcode found";
}
Imports Telerik.WinControls.UI.Barcode
Imports System.Drawing

Public Function ReadShippingLabel(imagePath As String) As String
    Dim reader = New BarCodeReader()
    reader.DecodeType = New DecodeType() {
        DecodeType.Code128,
        DecodeType.ITF,
        DecodeType.EAN13
    }

    Using image As Image = Image.FromFile(imagePath)
        Dim result = reader.Read(image)
        Return If(result?.Text, "No barcode found")
    End Using
End Function
$vbLabelText   $csharpLabel

IronBarcode Approach:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

public string ReadProductBarcode(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.FirstOrDefault()?.Value ?? "No barcode found";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

public string ReadProductBarcode(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.FirstOrDefault()?.Value ?? "No barcode found";
}
Imports IronBarCode

Public Function ReadProductBarcode(imagePath As String) As String
    Dim results = BarcodeReader.Read(imagePath)
    Return If(results.FirstOrDefault()?.Value, "No barcode found")
End Function
$vbLabelText   $csharpLabel

BarcodeReader.Read() is a static method — no reader instance is needed. It accepts a file path string directly without requiring a BitmapImage or System.Drawing.Image load. Format detection is automatic across all 50+ supported types. The result property is .Value rather than .Text. This same call works without modification in both WPF and WinForms applications — there is no platform-specific variant. It also reads QR codes, DataMatrix, and any other format present in the image, unlike the Telerik readers which are restricted to 1D formats.

Reading QR Codes: Previously Impossible with Telerik

If your codebase contains a comment or a NotSupportedException documenting that QR reading is unavailable, this is its replacement. No configuration path exists in Telerik that enables QR reading — this scenario has no Telerik equivalent.

Telerik Approach:

// RadBarcodeReader does not support QR codes.
// DecodeType.QR does not exist in the Telerik enum.
public string ReadQrCode(string imagePath)
{
    throw new NotSupportedException(
        "Telerik RadBarcodeReader cannot read QR codes. " +
        "DecodeType.QR is not a valid enum value.");
}
// RadBarcodeReader does not support QR codes.
// DecodeType.QR does not exist in the Telerik enum.
public string ReadQrCode(string imagePath)
{
    throw new NotSupportedException(
        "Telerik RadBarcodeReader cannot read QR codes. " +
        "DecodeType.QR is not a valid enum value.");
}
' RadBarcodeReader does not support QR codes.
' DecodeType.QR does not exist in the Telerik enum.
Public Function ReadQrCode(imagePath As String) As String
    Throw New NotSupportedException("Telerik RadBarcodeReader cannot read QR codes. " & _
                                    "DecodeType.QR is not a valid enum value.")
End Function
$vbLabelText   $csharpLabel

IronBarcode Approach:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

public string ReadQrCode(string imagePath)
{
    // QR codes, DataMatrix, PDF417, and Aztec are all detected automatically
    var results = BarcodeReader.Read(imagePath);
    return results.FirstOrDefault()?.Value ?? "No QR code found";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

public string ReadQrCode(string imagePath)
{
    // QR codes, DataMatrix, PDF417, and Aztec are all detected automatically
    var results = BarcodeReader.Read(imagePath);
    return results.FirstOrDefault()?.Value ?? "No QR code found";
}
Imports IronBarCode

Public Function ReadQrCode(imagePath As String) As String
    ' QR codes, DataMatrix, PDF417, and Aztec are all detected automatically
    Dim results = BarcodeReader.Read(imagePath)
    Return If(results.FirstOrDefault()?.Value, "No QR code found")
End Function
$vbLabelText   $csharpLabel

The same BarcodeReader.Read() call that reads EAN-13 barcodes reads QR codes. There is no separate configuration for 2D formats. For a complete list of supported barcode formats across reading and generation, the IronBarcode documentation covers all 50+ entries with format-specific notes.

Reading Barcodes in an ASP.NET Core Endpoint

Telerik provides no barcode reading component for ASP.NET Core or Blazor. If an existing application routes uploaded images to a desktop service for reading because the web layer had no Telerik reader, that workaround is replaced by direct reading in the web layer.

Telerik Approach:

// No Telerik reading API available in ASP.NET Core.
// Workaround: forward uploaded file to a WPF or WinForms service
// that can reference Telerik.Windows.Controls.Barcode.
[HttpPost("read")]
public async Task<IActionResult> ReadBarcode(IFormFile imageFile)
{
    // Must proxy to desktop service — no Telerik reader available here
    var bytes = await ReadAllBytesAsync(imageFile);
    var result = await _desktopBridgeService.ReadAsync(bytes);
    return Ok(result);
}
// No Telerik reading API available in ASP.NET Core.
// Workaround: forward uploaded file to a WPF or WinForms service
// that can reference Telerik.Windows.Controls.Barcode.
[HttpPost("read")]
public async Task<IActionResult> ReadBarcode(IFormFile imageFile)
{
    // Must proxy to desktop service — no Telerik reader available here
    var bytes = await ReadAllBytesAsync(imageFile);
    var result = await _desktopBridgeService.ReadAsync(bytes);
    return Ok(result);
}
Imports Microsoft.AspNetCore.Mvc

' No Telerik reading API available in ASP.NET Core.
' Workaround: forward uploaded file to a WPF or WinForms service
' that can reference Telerik.Windows.Controls.Barcode.
<HttpPost("read")>
Public Async Function ReadBarcode(imageFile As IFormFile) As Task(Of IActionResult)
    ' Must proxy to desktop service — no Telerik reader available here
    Dim bytes = Await ReadAllBytesAsync(imageFile)
    Dim result = Await _desktopBridgeService.ReadAsync(bytes)
    Return Ok(result)
End Function
$vbLabelText   $csharpLabel

IronBarcode Approach:

// NuGet: dotnet add package IronBarcode
using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
    [HttpPost("read")]
    public IActionResult ReadBarcode(IFormFile imageFile)
    {
        using var stream = imageFile.OpenReadStream();
        var results = BarcodeReader.Read(stream);
        return Ok(results.Select(r => new
        {
            Format = r.BarcodeType.ToString(),
            Value = r.Value
        }));
    }

    [HttpGet("generate")]
    public IActionResult GenerateBarcode([FromQuery] string data)
    {
        var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
                                 .ResizeTo(400, 100)
                                 .ToPngBinaryData();
        return File(bytes, "image/png");
    }
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
    [HttpPost("read")]
    public IActionResult ReadBarcode(IFormFile imageFile)
    {
        using var stream = imageFile.OpenReadStream();
        var results = BarcodeReader.Read(stream);
        return Ok(results.Select(r => new
        {
            Format = r.BarcodeType.ToString(),
            Value = r.Value
        }));
    }

    [HttpGet("generate")]
    public IActionResult GenerateBarcode([FromQuery] string data)
    {
        var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
                                 .ResizeTo(400, 100)
                                 .ToPngBinaryData();
        return File(bytes, "image/png");
    }
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/barcode")>
Public Class BarcodeController
    Inherits ControllerBase

    <HttpPost("read")>
    Public Function ReadBarcode(imageFile As IFormFile) As IActionResult
        Using stream = imageFile.OpenReadStream()
            Dim results = BarcodeReader.Read(stream)
            Return Ok(results.Select(Function(r) New With {
                .Format = r.BarcodeType.ToString(),
                .Value = r.Value
            }))
        End Using
    End Function

    <HttpGet("generate")>
    Public Function GenerateBarcode(<FromQuery> data As String) As IActionResult
        Dim bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
                                 .ResizeTo(400, 100) _
                                 .ToPngBinaryData()
        Return File(bytes, "image/png")
    End Function
End Class
$vbLabelText   $csharpLabel

BarcodeReader.Read() accepts a Stream directly, so the uploaded file stream is passed without writing to disk. This controller deploys to Linux, Docker, or Azure App Service without modification.

Reading Barcodes from PDF Files

Telerik has no PDF barcode reading capability. Adding PDF reading to an existing Telerik-based codebase requires a PDF rendering library to convert pages to images before passing them to RadBarcodeReader. IronBarcode reads PDF files directly.

Telerik Approach:

// No direct PDF reading support in RadBarcodeReader.
// Workaround: use a separate PDF library to extract page images
using SomePdfLibrary; // third-party dependency
using Telerik.Windows.Controls.Barcode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = new List<string>();
    var pages = PdfRenderer.ExtractPages(pdfPath); // third-party call

    foreach (var pageImage in pages)
    {
        var reader = new RadBarcodeReader();
        reader.DecodeTypes = new[] { DecodeType.Code128, DecodeType.EAN13 };
        var bitmap = ConvertToBitmapImage(pageImage); // conversion required
        var result = reader.Decode(bitmap);
        if (result != null)
            results.Add(result.Text); // 1D only — QR codes on PDF pages are missed
    }
    return results;
}
// No direct PDF reading support in RadBarcodeReader.
// Workaround: use a separate PDF library to extract page images
using SomePdfLibrary; // third-party dependency
using Telerik.Windows.Controls.Barcode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = new List<string>();
    var pages = PdfRenderer.ExtractPages(pdfPath); // third-party call

    foreach (var pageImage in pages)
    {
        var reader = new RadBarcodeReader();
        reader.DecodeTypes = new[] { DecodeType.Code128, DecodeType.EAN13 };
        var bitmap = ConvertToBitmapImage(pageImage); // conversion required
        var result = reader.Decode(bitmap);
        if (result != null)
            results.Add(result.Text); // 1D only — QR codes on PDF pages are missed
    }
    return results;
}
Imports SomePdfLibrary ' third-party dependency
Imports Telerik.Windows.Controls.Barcode

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim results As New List(Of String)()
    Dim pages = PdfRenderer.ExtractPages(pdfPath) ' third-party call

    For Each pageImage In pages
        Dim reader As New RadBarcodeReader()
        reader.DecodeTypes = New DecodeType() {DecodeType.Code128, DecodeType.EAN13}
        Dim bitmap = ConvertToBitmapImage(pageImage) ' conversion required
        Dim result = reader.Decode(bitmap)
        If result IsNot Nothing Then
            results.Add(result.Text) ' 1D only — QR codes on PDF pages are missed
        End If
    Next

    Return results
End Function
$vbLabelText   $csharpLabel

IronBarcode Approach:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r =>
        $"Page {r.PageNumber}: {r.BarcodeType} — {r.Value}").ToList();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r =>
        $"Page {r.PageNumber}: {r.BarcodeType} — {r.Value}").ToList();
}
Imports IronBarCode

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim results = BarcodeReader.Read(pdfPath)
    Return results.Select(Function(r) $"Page {r.PageNumber}: {r.BarcodeType} — {r.Value}").ToList()
End Function
$vbLabelText   $csharpLabel

No separate PDF library is needed. No page extraction step. No image conversion. Pass the PDF path and IronBarcode processes all pages, returning all barcodes with page number tracking. Both 1D and 2D barcodes on PDF pages are detected.

Telerik RadBarcode API to IronBarcode Mapping Reference

Telerik RadBarcode IronBarcode
TelerikLicenseManager.InstallLicense("key") IronBarCode.License.LicenseKey = "key"
<telerik:RadBarcode Value="..." Symbology="Code128" /> BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
<TelerikBarcode Type="@BarcodeType.Code128" /> Server-side generation returning ToPngBinaryData()
Symbology.Code128 BarcodeEncoding.Code128
Symbology.QRCode BarcodeEncoding.QRCode
new RadBarcodeReader() (WPF) Static class — no instance needed
new BarCodeReader() (WinForms) Static class — no instance needed
reader.DecodeTypes = new DecodeType[] { ... } (WPF) Auto-detection — no specification needed
reader.DecodeType = new DecodeType[] { ... } (WinForms) Auto-detection — no specification needed
reader.Decode(bitmapImage) (WPF) BarcodeReader.Read(imagePath)
reader.Read(drawingImage) (WinForms) BarcodeReader.Read(imagePath)
result.Text result.Value
result.Symbology result.BarcodeType
BitmapImage required as input (WPF) File path, Stream, or byte array accepted
System.Drawing.Image required as input (WinForms) File path, Stream, or byte array accepted
1D formats only in reading 50+ formats including all 2D types
WPF and WinForms reading only All .NET platforms
No PDF reading support BarcodeReader.Read("file.pdf") — native

Common Migration Issues and Solutions

Issue 1: XAML Barcode Control Replacement

Telerik: <telerik:RadBarcode> is a visual control that renders directly in the WPF UI element tree. It cannot be replaced with an Image element without code-behind changes.

Solution: Replace the <telerik:RadBarcode> element with an <Image> control and generate the barcode in code-behind. Bind the Image.Source to a BitmapSource generated by IronBarcode:

// In code-behind or ViewModel
using IronBarCode;

var generated = BarcodeWriter.CreateBarcode(barcodeValue, BarcodeEncoding.Code128)
                             .ResizeTo(400, 100);
BarcodeImage.Source = generated.ToBitmapSource();
// In code-behind or ViewModel
using IronBarCode;

var generated = BarcodeWriter.CreateBarcode(barcodeValue, BarcodeEncoding.Code128)
                             .ResizeTo(400, 100);
BarcodeImage.Source = generated.ToBitmapSource();
Imports IronBarCode

' In code-behind or ViewModel
Dim generated = BarcodeWriter.CreateBarcode(barcodeValue, BarcodeEncoding.Code128) _
                             .ResizeTo(400, 100)
BarcodeImage.Source = generated.ToBitmapSource()
$vbLabelText   $csharpLabel

For Blazor, replace <TelerikBarcode> with an <img> element whose src attribute receives a base64-encoded PNG generated server-side.

Issue 2: DecodeType Removal Side Effects

Telerik: The DecodeTypes (WPF) or DecodeType (WinForms) property filters which formats the reader attempts to detect. Removing this filter in an IronBarcode migration means IronBarcode will now return results for all formats present in the image, including formats that were previously excluded by the filter.

Solution: Remove the DecodeType assignment block entirely. If the additional detected formats cause unexpected results in downstream logic — for example, if code assumed only one barcode format would ever be returned — add optional filtering using BarcodeReaderOptions:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    ExpectedBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.EAN13
};
var results = BarcodeReader.Read(imagePath, options);
using IronBarCode;

var options = new BarcodeReaderOptions
{
    ExpectedBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.EAN13
};
var results = BarcodeReader.Read(imagePath, options);
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .ExpectedBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.EAN13
}
Dim results = BarcodeReader.Read(imagePath, options)
$vbLabelText   $csharpLabel

This is optional. The default behavior (detect all formats) is correct for most use cases and produces results that the previous Telerik implementation could not.

Issue 3: TelerikLicenseManager Cleanup

Telerik: Telerik.WinControls.TelerikLicenseManager.InstallLicense(key) calls appear at application startup, typically in Program.cs (WinForms) or App.xaml.cs (WPF). The key is often stored in app settings, a configuration file, or hardcoded in the startup method.

Solution: Remove the TelerikLicenseManager.InstallLicense() call. Replace it with the IronBarcode key assignment at the same startup location:

// Remove:
// Telerik.WinControls.TelerikLicenseManager.InstallLicense("TELERIK-KEY");

// Add:
IronBarCode.License.LicenseKey = "YOUR-IRONBARCODE-KEY";
// Remove:
// Telerik.WinControls.TelerikLicenseManager.InstallLicense("TELERIK-KEY");

// Add:
IronBarCode.License.LicenseKey = "YOUR-IRONBARCODE-KEY";
$vbLabelText   $csharpLabel

If the Telerik package remains installed (because other non-barcode Telerik controls are still in use), the TelerikLicenseManager call for those controls should be preserved. Only remove the call if the Telerik packages themselves are being fully removed.

Telerik RadBarcode Migration Checklist

Pre-Migration Tasks

Audit the codebase for all Telerik barcode usage before making code changes:

# License initialization
grep -r "TelerikLicenseManager.InstallLicense" --include="*.cs" .

# XAML generation controls
grep -r "RadBarcode" --include="*.xaml" .
grep -r "TelerikBarcode" --include="*.razor" .

# Code-behind generation references
grep -r "RadBarcode" --include="*.cs" .
grep -r "Symbology\." --include="*.cs" .

# Reading API — WPF
grep -r "RadBarcodeReader" --include="*.cs" .
grep -r "DecodeTypes\." --include="*.cs" .
grep -r "reader\.Decode(" --include="*.cs" .

# Reading API — WinForms
grep -r "BarCodeReader" --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
grep -r "reader\.Read(" --include="*.cs" .

# Result property access
grep -r "result\.Text" --include="*.cs" .
grep -r "result\.Symbology" --include="*.cs" .
# License initialization
grep -r "TelerikLicenseManager.InstallLicense" --include="*.cs" .

# XAML generation controls
grep -r "RadBarcode" --include="*.xaml" .
grep -r "TelerikBarcode" --include="*.razor" .

# Code-behind generation references
grep -r "RadBarcode" --include="*.cs" .
grep -r "Symbology\." --include="*.cs" .

# Reading API — WPF
grep -r "RadBarcodeReader" --include="*.cs" .
grep -r "DecodeTypes\." --include="*.cs" .
grep -r "reader\.Decode(" --include="*.cs" .

# Reading API — WinForms
grep -r "BarCodeReader" --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
grep -r "reader\.Read(" --include="*.cs" .

# Result property access
grep -r "result\.Text" --include="*.cs" .
grep -r "result\.Symbology" --include="*.cs" .
SHELL

Document each match. Note which files contain XAML controls, which contain reading code, and which platform each file belongs to.

Code Update Tasks

  1. Remove Telerik barcode NuGet packages (or retain if needed for other controls)
  2. Install IronBarcode NuGet package in each project that requires barcode functionality
  3. Add IronBarCode.License.LicenseKey = "YOUR-KEY" at each application startup entry point
  4. Remove Telerik namespace imports and add using IronBarCode
  5. Replace <telerik:RadBarcode> XAML elements with <Image> controls
  6. Generate barcode images in code-behind using BarcodeWriter.CreateBarcode(...).ToBitmapSource()
  7. Replace <TelerikBarcode> Razor components with base64 <img> sources generated server-side
  8. Replace new RadBarcodeReader() instances with BarcodeReader.Read(path) static calls
  9. Replace new BarCodeReader() instances with BarcodeReader.Read(path) static calls
  10. Delete all reader.DecodeTypes = new DecodeType[] { ... } and reader.DecodeType = new DecodeType[] { ... } blocks
  11. Replace reader.Decode(bitmapImage) calls with BarcodeReader.Read(imagePath)
  12. Replace reader.Read(drawingImage) calls with BarcodeReader.Read(imagePath)
  13. Rename result.Text to result.Value at all reading result access points
  14. Rename result.Symbology to result.BarcodeType at all format check points
  15. Replace Symbology.Code128 and similar generation enum values with BarcodeEncoding.Code128
  16. Remove TelerikLicenseManager.InstallLicense() calls where Telerik packages are fully removed

Post-Migration Testing

  • Verify that all previously-read 1D barcodes (Code128, EAN13, etc.) continue to return correct values
  • Confirm that QR codes in test images are now read successfully where they previously returned null
  • Test that generated barcodes (saved as PNG or served as bytes) render visibly and scan correctly
  • Verify that ASP.NET Core or Blazor endpoints that previously could not perform reading now function correctly
  • If PDF reading was added, confirm that barcodes on each PDF page are detected with correct page numbers
  • Run the grep audit commands from the Pre-Migration section to confirm no remaining Telerik barcode API references
  • Confirm that IronBarCode.License.LicenseKey is set before the first BarcodeReader.Read() or BarcodeWriter.CreateBarcode() call

Key Benefits of Migrating to IronBarcode

Complete 2D Format Support: After migration, QR Code, DataMatrix, PDF417, and Aztec formats are readable by the same API call that was already reading Code128 and EAN13. No additional configuration is required and no separate library is needed for 2D formats. The reading engine handles format identification automatically.

Unified Cross-Platform API: The same BarcodeReader.Read() and BarcodeWriter.CreateBarcode() calls compile and run identically in WPF, WinForms, ASP.NET Core, Blazor, console applications, and Docker containers. Barcode logic written once in a shared service library works across every project type in the solution without modification.

Native PDF File Processing: IronBarcode reads barcodes from PDF files directly, processing all pages and returning results with page number metadata. Workflows that previously required a PDF rendering library plus a Telerik reading step are consolidated into a single method call, removing the third-party dependency and the intermediate image conversion step.

Eliminated Subscription Dependency for Barcode Access: After migration, barcode functionality is available through IronBarcode's perpetual licensing model. Continued access does not require annual renewal. Teams whose primary use of the Telerik suite was barcode-related reduce their recurring licensing overhead to a one-time cost.

Simplified Codebase: The DecodeType configuration block, the BitmapImage loading step, the platform-specific reader class selection, and the result.Text property chain are all replaced by a single static method call with an auto-detecting result collection. Code that previously required different implementations for WPF and WinForms reading collapses into a single shared implementation.

Please noteTelerik is a registered trademark of its respective owner. This site is not affiliated with, endorsed by, or sponsored by Progress Software. All product names, logos, and brands are property of their respective owners. Comparisons are for informational purposes only and reflect publicly available information at the time of writing.

Frequently Asked Questions

Why should I migrate from Telerik Barcode to IronBarcode?

Common reasons include simplifying licensing (removing SDK + runtime key complexity), eliminating throughput limits, gaining native PDF support, improving Docker/CI/CD deployment, and reducing API boilerplate in production code.

How do I replace Telerik API calls with IronBarcode?

Replace instance creation and licensing boilerplate with IronBarCode.License.LicenseKey = "key". Replace reader calls with BarcodeReader.Read(path) and writer calls with BarcodeWriter.CreateBarcode(data, encoding). Static methods require no instance management.

How much code changes when migrating from Telerik Barcode to IronBarcode?

Most migrations result in fewer lines of code. Licensing boilerplate, instance constructors, and explicit format configuration are removed. Core read/write operations map to shorter IronBarcode equivalents with cleaner result objects.

Do I need to keep both Telerik Barcode and IronBarcode installed during migration?

No. Most migrations are direct replacements rather than parallel operation. Migrate one service class at a time, replace the NuGet reference, and update the instantiation and API call patterns before moving to the next class.

What is the NuGet package name for IronBarcode?

The package is 'IronBarCode' (with capital B and C). Install it with 'Install-Package IronBarCode' or 'dotnet add package IronBarCode'. The using directive in code is 'using IronBarCode;'.

How does IronBarcode simplify Docker deployment compared to Telerik Barcode?

IronBarcode is a NuGet package with no external SDK files or mounted license configuration. In Docker, set the IRONBARCODE_LICENSE_KEY environment variable and the package handles license validation at startup.

Does IronBarcode detect all barcode formats automatically after migrating from Telerik?

Yes. IronBarcode auto-detects symbology across all supported formats. Explicit BarcodeTypes enumeration is not required. If format is already known and performance matters, BarcodeReaderOptions allows restricting the search space as an optimization.

Can IronBarcode read barcodes from PDFs without a separate library?

Yes. BarcodeReader.Read("document.pdf") processes PDF files natively. Results include PageNumber, Format, Value, and Confidence for each barcode found. No external PDF rendering step is required.

How does IronBarcode handle parallel barcode processing?

IronBarcode's static methods are stateless and thread-safe. Use Parallel.ForEach directly over file lists without per-thread instance management. BarcodeReaderOptions.MaxParallelThreads controls the internal thread budget.

What result properties change when migrating from Telerik Barcode to IronBarcode?

Common renames: BarcodeValue becomes Value, BarcodeType becomes Format. IronBarcode results also add Confidence and PageNumber. A solution-wide search-and-replace handles the renames in existing result-processing code.

How do I set up IronBarcode licensing in a CI/CD pipeline?

Store IRONBARCODE_LICENSE_KEY as a pipeline secret and assign IronBarCode.License.LicenseKey in application startup code. One secret covers all environments including development, test, staging, and production.

Does IronBarcode support QR code generation with custom styling?

Yes. QRCodeWriter.CreateQrCode() supports custom colors via ChangeBarCodeColor(), logo embedding via AddBrandLogo(), configurable error correction levels, and multiple output formats including PNG, JPG, PDF, and stream.

Jordi Bardia
Software Engineer
Jordi is most proficient in Python, C# and C++, when he isn’t leveraging his skills at Iron Software; he’s game programming. Sharing responsibilities for product testing, product development and research, Jordi adds immense value to continual product improvement. The varied experience keeps him challenged and engaged, and he ...
Read More

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me