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
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
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
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
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
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"
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
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
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
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
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
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
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
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
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")
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)
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
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
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
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))
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)
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()
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" .
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
- Remove
Plugin.Maui.BarkoderorBarkoder.Xamarinfrom.csprojwhere it is no longer needed - Install the
BarCodeNuGet package - Remove
using Barkoder.Maui;(or the Xamarin equivalent) where no longer needed - Add
using IronBarCode;to all barcode processing files - Add
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";at application startup - Replace
BarkoderView.StartScanning/DidFinishScanningcallbacks withBarcodeReader.Read(filePath, options) - Map
BarcodeResult.TextualDatatoresult.Value - Map
BarcodeResult.BarcodeTypeNametoresult.Format - Map DeBlur configuration to
Speed = ReadingSpeed.ExtremeDetailinBarcodeReaderOptions - Map multi-scan configuration to
ExpectMultipleBarcodes = trueinBarcodeReaderOptions - Add
BarcodeWriter.CreateBarcode()calls for any generation requirements - Add
QRCodeWriter.CreateQrCode()calls for QR code generation requirements - Replace any PDF pre-processing code with
BarcodeReader.Read("document.pdf") - Wrap synchronous
BarcodeReader.Read()calls inTask.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.ExtremeDetailrecovers barcodes from the lowest-quality samples in your test set - Confirm
ExpectMultipleBarcodes = truereturns 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.

