Skip to footer content
MIGRATION GUIDES

Migrating from Barkoder SDK to IronBarcode

Barkoder ships official .NET packages — Plugin.Maui.Barkoder and Barkoder.Xamarin — but both are strictly mobile camera-scanning components. If you evaluated barKoder for its MatrixSight algorithm, DeBlur mode, multi-barcode detection, or DPM support and then discovered you need file input, PDF processing, server-side deployment, or barcode generation, none of that is available from barKoder on .NET. This guide shows how IronBarcode covers each of those requirements, with working code for every scenario.

Why Migrate from barKoder SDK

Teams moving from a barKoder evaluation to IronBarcode consistently report the same triggers:

Mobile Camera Surface Only: Barkoder's .NET footprint is Plugin.Maui.Barkoder (v1.6.8, March 2026) and Barkoder.Xamarin (v1.3.0). Both wrap the native iOS / Android SDKs and expose a BarkoderView camera control. There is no general-purpose Barkoder.NET library, no ASP.NET Core target, no console / worker / desktop target, and no Linux server target.

Read-Only Architecture: Barkoder is a scanning-only SDK. If your application needs to generate barcodes — print shipping labels, create QR codes for packaging, embed codes in documents — Barkoder provides nothing. Teams that discover a generation requirement mid-project need a library that covers both sides of the workflow.

No PDF Processing: In .NET enterprise applications, barcodes frequently appear in PDF documents — invoices, shipping manifests, medical records, compliance documents. Barkoder has no concept of this workflow. It is designed for live camera input on a mobile device and cannot process a PDF file.

No Server-Side Deployment: Barkoder's processing model is on-device mobile scanning. It cannot run in ASP.NET Core, Azure Functions, Docker containers, or AWS Lambda. Teams building server-side barcode APIs, document processing pipelines, or cloud functions have no path to Barkoder deployment.

No File / Stream Input: Even inside a MAUI app, BarkoderView only consumes live camera frames. There is no file-path, byte-array, or Stream overload, so processing an uploaded image or a gallery photo requires a different library.

The Fundamental Boundary

Barkoder's MAUI surface is camera-bound. A .NET developer using Plugin.Maui.Barkoder writes code that looks like this:

// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.SetFlashEnabled(false);
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
            Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
    }
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.SetFlashEnabled(false);
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
            Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
    }
}
Imports Barkoder.Maui

Public Partial Class ScanPage
    Inherits ContentPage
    Implements IBarkoderDelegate

    Public Sub New()
        InitializeComponent()
        BarkoderView.SetFlashEnabled(False)
        BarkoderView.StartScanning(Me)
    End Sub

    Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
        For Each r In result
            Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
        Next
    End Sub
End Class
$vbLabelText   $csharpLabel

IronBarcode provides a file / stream / PDF API for the same data:

// dotnet add package BarCode
using IronBarCode;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
Imports IronBarCode

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

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

Dim results = BarcodeReader.Read("scanned-label.png", options)
For Each result In results
    Console.WriteLine($"Format: {result.Format} | Value: {result.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode vs barKoder SDK: Feature Comparison

Feature barKoder SDK IronBarcode
.NET / C# API MAUI / Xamarin camera UI only Full .NET surface
NuGet Package Plugin.Maui.Barkoder, Barkoder.Xamarin BarCode
Damaged Barcode Recovery MatrixSight / DeBlur ReadingSpeed.ExtremeDetail + ML
Multi-Barcode Detection Yes ExpectMultipleBarcodes = true
DataMatrix / DPM Yes (read only) Yes — read and generate
QR Code Yes (read only) Yes — read and generate
PDF417 Yes Yes
Aztec Yes Yes
Code128, Code39, EAN Yes Yes — 50+ formats
Barcode Generation None Full — all formats
PDF Processing None Native
File / Stream / byte[] Input None — camera frames only Yes
ASP.NET Core None Full
Docker / Linux None Full
Azure Functions None Full
AWS Lambda None Full
Offline / Air-Gapped On-device Fully local
Async / Await Callback-based Full
Dependency Injection None Full .NET DI
iOS via MAUI Plugin.Maui.Barkoder (camera UI) Programmatic (file / stream)
Android via MAUI Plugin.Maui.Barkoder (camera UI) Programmatic (file / stream)
Pricing Annual subscription (EUR tiers) From $749 perpetual

Quick Start: barKoder SDK to IronBarcode Migration

Step 1: Replace NuGet Package

Install IronBarcode:

dotnet add package BarCode
dotnet add package BarCode
SHELL

If your project uses Plugin.Maui.Barkoder or Barkoder.Xamarin only for non-camera workflows (or you're moving entirely to file / PDF processing), remove it:

dotnet remove package Plugin.Maui.Barkoder
dotnet remove package Plugin.Maui.Barkoder
SHELL

If the app still needs a live camera UI, keep Plugin.Maui.Barkoder and add IronBarcode alongside it for the file / PDF / generation work.

Step 2: Update Namespaces

Remove the barKoder namespace where it is no longer needed, and add the IronBarcode namespace:

// Remove (if no longer needed)
// using Barkoder.Maui;

// Add
using IronBarCode;
// Remove (if no longer needed)
// using Barkoder.Maui;

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

Step 3: Initialize License

Add license initialization at application startup — in Program.cs for ASP.NET Core, or before any barcode operation in console or desktop apps:

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

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Code Migration Examples

Reading Barcodes from Images

The core reading scenario maps from barKoder's live camera frames to IronBarcode's file / stream / byte[] API.

barKoder MAUI Approach:

// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
        {
            Console.WriteLine($"Barcode: {r.TextualData}");
            Console.WriteLine($"Type: {r.BarcodeTypeName}");
        }
    }
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
        {
            Console.WriteLine($"Barcode: {r.TextualData}");
            Console.WriteLine($"Type: {r.BarcodeTypeName}");
        }
    }
}
Imports Barkoder.Maui

Public Partial Class ScanPage
    Inherits ContentPage
    Implements IBarkoderDelegate

    Public Sub New()
        InitializeComponent()
        BarkoderView.StartScanning(Me)
    End Sub

    Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
        For Each r In result
            Console.WriteLine($"Barcode: {r.TextualData}")
            Console.WriteLine($"Type: {r.BarcodeTypeName}")
        Next
    End Sub
End Class
$vbLabelText   $csharpLabel

IronBarcode Approach:

// dotnet add package BarCode
using IronBarCode;

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

var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;

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

var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Value: {result.Value}");
}
Imports IronBarCode

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

Dim results = BarcodeReader.Read("scan.png")
For Each result In results
    Console.WriteLine($"Format: {result.Format}")
    Console.WriteLine($"Value: {result.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode's BarcodeReader.Read() auto-detects the barcode format without requiring a format to be specified in advance. The same call works for images captured by a mobile device and uploaded to a server, images loaded from a file system, or images received as byte arrays from a stream. For comprehensive reading documentation, see the IronBarcode reading guide.

Damaged Barcode Recovery (DeBlur Mode Equivalent)

Barkoder's DeBlur mode is one of its most cited capabilities. IronBarcode provides the equivalent for file input through ReadingSpeed.ExtremeDetail.

barKoder MAUI Approach:

// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;

BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Recovered: {r.TextualData}");
}
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;

BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Recovered: {r.TextualData}");
}
Imports Barkoder.Maui

' Live camera scanning with DeBlur enabled via configuration
BarkoderView.SetEnabledBarcodeTypes() ' configure formats
BarkoderView.StartScanning(Me)

Public Sub DidFinishScanning(result As BarcodeResult())
    For Each r In result
        Console.WriteLine($"Recovered: {r.TextualData}")
    Next
End Sub
$vbLabelText   $csharpLabel

IronBarcode Approach:

using IronBarCode;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("worn-shipping-label.png", options);

if (results.Any())
{
    Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
    Console.WriteLine("Could not decode — image quality too low");
}
using IronBarCode;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("worn-shipping-label.png", options);

if (results.Any())
{
    Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
    Console.WriteLine("Could not decode — image quality too low");
}
Imports IronBarCode

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

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

Dim results = BarcodeReader.Read("worn-shipping-label.png", options)

If results.Any() Then
    Console.WriteLine($"Recovered barcode: {results.First().Value}")
Else
    Console.WriteLine("Could not decode — image quality too low")
End If
$vbLabelText   $csharpLabel

ReadingSpeed.ExtremeDetail runs a multi-pass ML-based image analysis pipeline, applying contrast enhancement, sharpening, rotation correction, and damage recovery before attempting to decode. For batch workflows, use ReadingSpeed.Balanced as the default and fall back to ExtremeDetail only for images that Balanced fails to decode.

Multi-Barcode Detection

Barkoder's multi-barcode frame scanning maps to IronBarcode's ExpectMultipleBarcodes option, which works on images and PDFs alike.

barKoder MAUI Approach:

// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
Imports Barkoder.Maui

BarkoderView.StartScanning(Me)

Public Sub DidFinishScanning(result As BarcodeResult())
    For Each r In result
        Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
    Next
End Sub
$vbLabelText   $csharpLabel

IronBarcode Approach:

using IronBarCode;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
};

// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);

foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
using IronBarCode;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
};

// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);

foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
Imports IronBarCode

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

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}

' Works identically on images and PDFs
Dim results = BarcodeReader.Read("shipping-manifest.pdf", options)

For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}")
Next
$vbLabelText   $csharpLabel

This is a single method call. No page extraction, no multiple requests, no per-barcode processing overhead. The PDF is read natively.

DataMatrix Generation and Reading

Barkoder reads DataMatrix but cannot generate it. IronBarcode covers both sides of the workflow, which is the common requirement in industrial tracking systems.

barKoder MAUI Approach:

// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Part ID: {r.TextualData}");
}
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Part ID: {r.TextualData}");
}
Imports Barkoder.Maui

' Camera-only DataMatrix scanning; no generation available
BarkoderView.StartScanning(Me)

Public Sub DidFinishScanning(result As BarcodeResult())
    For Each r In result
        Console.WriteLine($"Part ID: {r.TextualData}")
    Next
End Sub
$vbLabelText   $csharpLabel

IronBarcode Approach:

using IronBarCode;

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

// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
    .SaveAsPng("part-label.png");

// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Part Serial: {result.Value}");
    Console.WriteLine($"Barcode Type: {result.Format}");
}
using IronBarCode;

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

// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
    .SaveAsPng("part-label.png");

// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Part Serial: {result.Value}");
    Console.WriteLine($"Barcode Type: {result.Format}");
}
Imports IronBarCode

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

' Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("part-label.png")

' Read DataMatrix from a scanned industrial part image
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

Dim results = BarcodeReader.Read("etched-part-photo.png", options)
For Each result In results
    Console.WriteLine($"Part Serial: {result.Value}")
    Console.WriteLine($"Barcode Type: {result.Format}")
Next
$vbLabelText   $csharpLabel

For a full list of supported encoding formats and generation options, see the IronBarcode barcode generation documentation.

QR Code Generation with Branding

Barkoder does not generate barcodes. IronBarcode generates QR codes with embedded logos, which is a common requirement for marketing, packaging, and product identification workflows.

barKoder MAUI Approach:

Not available — Plugin.Maui.Barkoder is a reader-only SDK with no
generation API on any platform.

IronBarcode Approach:

using IronBarCode;

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

// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
    .AddBrandLogo("company-logo.png")
    .SaveAsPng("branded-qr.png");
using IronBarCode;

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

// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
    .AddBrandLogo("company-logo.png")
    .SaveAsPng("branded-qr.png");
Imports IronBarCode

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

' QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500) _
    .AddBrandLogo("company-logo.png") _
    .SaveAsPng("branded-qr.png")
$vbLabelText   $csharpLabel

ASP.NET Core Barcode API Endpoint

Barkoder has no server-side deployment model. The equivalent of a mobile scanning upload endpoint — receiving an image from any client and returning barcode data — requires a .NET library.

barKoder Approach:

Not available — Plugin.Maui.Barkoder runs only inside a MAUI app head
against a live camera. There is no ASP.NET Core integration and no
server-side execution model.

IronBarcode Approach:

// In Program.cs
using IronBarCode;

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

app.MapPost("/api/scan", async (IFormFile file) =>
{
    using var stream = file.OpenReadStream();
    var imageBytes = new byte[stream.Length];
    await stream.ReadAsync(imageBytes);

    var options = new BarcodeReaderOptions
    {
        Speed = ReadingSpeed.Balanced,
        ExpectMultipleBarcodes = true,
    };

    var results = BarcodeReader.Read(imageBytes, options);

    return Results.Ok(results.Select(r => new
    {
        Value = r.Value,
        Format = r.Format.ToString(),
    }));
});
// In Program.cs
using IronBarCode;

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

app.MapPost("/api/scan", async (IFormFile file) =>
{
    using var stream = file.OpenReadStream();
    var imageBytes = new byte[stream.Length];
    await stream.ReadAsync(imageBytes);

    var options = new BarcodeReaderOptions
    {
        Speed = ReadingSpeed.Balanced,
        ExpectMultipleBarcodes = true,
    };

    var results = BarcodeReader.Read(imageBytes, options);

    return Results.Ok(results.Select(r => new
    {
        Value = r.Value,
        Format = r.Format.ToString(),
    }));
});
Imports IronBarCode

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

app.MapPost("/api/scan", Async Function(file As IFormFile) As Task(Of IResult)
    Using stream = file.OpenReadStream()
        Dim imageBytes(CInt(stream.Length) - 1) As Byte
        Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)

        Dim options As New BarcodeReaderOptions With {
            .Speed = ReadingSpeed.Balanced,
            .ExpectMultipleBarcodes = True
        }

        Dim results = BarcodeReader.Read(imageBytes, options)

        Return Results.Ok(results.Select(Function(r) New With {
            .Value = r.Value,
            .Format = r.Format.ToString()
        }))
    End Using
End Function)
$vbLabelText   $csharpLabel

barKoder SDK API to IronBarcode Mapping Reference

This table maps barKoder's MAUI / Xamarin surface to the equivalent IronBarcode call:

barKoder API IronBarcode Equivalent
License set via barKoder portal / config IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
DeBlur configuration on BarkoderView Speed = ReadingSpeed.ExtremeDetail
Multi-scan configuration on BarkoderView ExpectMultipleBarcodes = true
SetEnabledBarcodeTypes(...) BarcodeEncoding.<Format> (auto-detected on read)
BarkoderView.StartScanning(IBarkoderDelegate) BarcodeReader.Read("image.png") — synchronous
BarcodeResult.TextualData result.Value
BarcodeResult.BarcodeTypeName result.Format
MatrixSight damage recovery ReadingSpeed.ExtremeDetail with ML preprocessing
Live camera frame input File path / Stream / byte[] input
On-device processing Fully local — no network calls
No generation support BarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode()
No PDF support BarcodeReader.Read("document.pdf") — native
No server deployment Works in ASP.NET Core, Docker, Azure Functions, Lambda
No page index (N/A) result.PageNumber — available on PDF reads

Common Migration Issues and Solutions

Issue 1: NuGet Package Names

barKoder SDK: The official .NET packages are Plugin.Maui.Barkoder and Barkoder.Xamarin. Neither covers non-mobile scenarios.

Solution: Install IronBarcode:

dotnet add package BarCode
dotnet add package BarCode
SHELL

If Plugin.Maui.Barkoder is no longer needed (you're moving entirely to file / PDF / server processing), remove it:

dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
SHELL

Issue 2: Camera Frame Input vs File Input

barKoder SDK: All input arrives as a live camera frame — a continuous video feed processed on-device. There is no file path input mode.

Solution: IronBarcode accepts files, streams, byte arrays, and System.Drawing.Image objects. For images uploaded from a mobile client, read the request stream directly:

using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
Imports System.IO

Using stream = file.OpenReadStream()
    Dim imageBytes = New Byte(stream.Length - 1) {}
    Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
    Dim results = BarcodeReader.Read(imageBytes, options)
End Using
$vbLabelText   $csharpLabel

Issue 3: Callback-Based API vs Synchronous Result

barKoder SDK: BarkoderView.StartScanning(IBarkoderDelegate) uses a delegate / callback pattern — DidFinishScanning(BarcodeResult[]) fires asynchronously as barcodes are detected in the camera feed.

Solution: IronBarcode's BarcodeReader.Read() is synchronous and returns an IEnumerable<BarcodeResult> directly. In ASP.NET Core contexts where async is required, wrap in Task.Run():

var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
$vbLabelText   $csharpLabel

Issue 4: DeBlur Mode Configuration

barKoder SDK: DeBlur is enabled on the BarkoderView configuration before scanning begins and applies to all subsequent scans.

Solution: In IronBarcode, the equivalent is ReadingSpeed.ExtremeDetail set per-read through BarcodeReaderOptions. Create the options object once and reuse it:

var deepOptions = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
var deepOptions = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
Imports System

Dim deepOptions As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

' Reuse across multiple reads
Dim results = BarcodeReader.Read("image.png", deepOptions)
$vbLabelText   $csharpLabel

Issue 5: Missing Generation Capability

barKoder SDK: Barkoder is read-only. There is no API for generating barcodes or QR codes.

Solution: IronBarcode covers both reading and generation. Use BarcodeWriter for standard formats and QRCodeWriter for QR codes:

// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");

// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
    .SaveAsPng("product-qr.png");

// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
    .ToPngBinaryData();
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");

// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
    .SaveAsPng("product-qr.png");

// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports System

' Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping-label.png")

' QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500) _
    .SaveAsPng("product-qr.png")

' Get as bytes for embedding in API response or PDF
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

barKoder SDK Migration Checklist

Pre-Migration Tasks

Audit your codebase for barKoder references:

grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
SHELL

Document the barcode scenarios currently implemented or planned:

  • Which barcode formats need to be read (Code128, DataMatrix, QR, PDF417, etc.)
  • Whether damaged barcode recovery is required (ReadingSpeed.ExtremeDetail)
  • Whether multi-barcode detection is required (ExpectMultipleBarcodes = true)
  • Whether barcode generation is required (BarcodeWriter, QRCodeWriter)
  • Whether PDF processing is required (BarcodeReader.Read("doc.pdf"))
  • Deployment targets (ASP.NET Core, Azure Functions, Docker, Lambda, desktop, MAUI)

Code Update Tasks

  1. Remove Plugin.Maui.Barkoder or Barkoder.Xamarin from .csproj where it is no longer needed
  2. Install the BarCode NuGet package
  3. Remove using Barkoder.Maui; (or the Xamarin equivalent) where no longer needed
  4. Add using IronBarCode; to all barcode processing files
  5. Add IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; at application startup
  6. Replace BarkoderView.StartScanning / DidFinishScanning callbacks with BarcodeReader.Read(filePath, options)
  7. Map BarcodeResult.TextualData to result.Value
  8. Map BarcodeResult.BarcodeTypeName to result.Format
  9. Map DeBlur configuration to Speed = ReadingSpeed.ExtremeDetail in BarcodeReaderOptions
  10. Map multi-scan configuration to ExpectMultipleBarcodes = true in BarcodeReaderOptions
  11. Add BarcodeWriter.CreateBarcode() calls for any generation requirements
  12. Add QRCodeWriter.CreateQrCode() calls for QR code generation requirements
  13. Replace any PDF pre-processing code with BarcodeReader.Read("document.pdf")
  14. Wrap synchronous BarcodeReader.Read() calls in Task.Run() for async ASP.NET Core endpoints

Post-Migration Testing

After completing the code updates, verify the following:

  • Confirm BarcodeReader.Read() returns results for all image formats used (PNG, JPEG, TIFF, BMP)
  • Verify that ReadingSpeed.ExtremeDetail recovers barcodes from the lowest-quality samples in your test set
  • Confirm ExpectMultipleBarcodes = true returns the correct count of barcodes from multi-barcode documents
  • Test PDF reading against all PDF versions used in production document workflows
  • Verify BarcodeWriter.CreateBarcode() output is scannable by your target scanners
  • Verify QRCodeWriter.CreateQrCode() output is scannable by mobile QR readers
  • Test the ASP.NET Core endpoint (if applicable) with file uploads from mobile clients
  • Confirm correct operation in Docker, Azure, or Lambda deployment targets
  • Run end-to-end tests covering the full read-process-generate cycle where applicable

Key Benefits of Migrating to IronBarcode

A Platform That Covers Non-Camera .NET: IronBarcode installs from NuGet and runs in any .NET project — ASP.NET Core, Azure Functions, Lambda, Docker, console, worker, WPF, WinForms, Avalonia, Blazor, and MAUI alike. Barkoder's Plugin.Maui.Barkoder covers only the camera UI inside a MAUI mobile app head; IronBarcode covers everything else.

Damage-Tolerant Reading Without a Camera: The capabilities that made Barkoder compelling — DeBlur, MatrixSight, damage recovery — are present in IronBarcode through ReadingSpeed.ExtremeDetail and ML-based image preprocessing. The same accuracy improvements that Barkoder achieves on live camera input, IronBarcode achieves on files, scanned documents, and uploaded images.

Complete Read and Generate Workflow: Barkoder is read-only. IronBarcode covers both barcode reading and generation across 50+ formats from a single package. Teams that need to generate shipping labels, create QR codes for packaging, or embed barcodes in documents do not need a second library.

Native PDF Support: Reading barcodes from PDF documents — invoices, manifests, medical records, compliance documents — is a first-class IronBarcode capability. No intermediate image extraction, no per-page API calls, and no additional dependencies. A multi-page PDF is processed in a single BarcodeReader.Read() call.

Full Server-Side Deployment: IronBarcode runs in ASP.NET Core, Azure Functions, AWS Lambda, Docker containers, and any other .NET hosting environment. It processes barcodes locally with no network calls, no API keys to manage, and no latency added by a remote service. Processing one barcode or one million costs the same — there are no per-request charges.

Predictable Perpetual Pricing: IronBarcode is available on a one-time perpetual license starting at $749 for a single developer, with no per-request charges, no volume limits, and no subscription renewals. For teams building production applications that process barcodes at scale, the cost model is simple and predictable.

Frequently Asked Questions

Why should I migrate from Barkoder SDK 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 Barkoder 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 Barkoder SDK 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 Barkoder SDK 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 Barkoder SDK?

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 Barkoder?

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 Barkoder SDK 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