Full disclosure: We're the developer relations team at Iron Software, the company behind IronQR, one of the libraries in this comparison. That said, we believe honest evaluations serve everyone better than marketing spin. We'll show our methodology, acknowledge our biases, and let the code speak for itself.

We ran each C# QR code library through identical evaluation criteria: simple QR generation, QR reading from images, customization depth, cross-platform support, and licensing cost. Below is the result, a comparison of 11 noteworthy QR code libraries in the .NET ecosystem, designed to help you pick the right one for your project on the first try.

Here's what three lines of QR generation look like with IronQR in Visual Studio, one of the libraries we'll cover:

using IronQr;
using IronSoftware.Drawing;

QrCode qr = QrWriter.Write("https://example.com");

AnyBitmap bitmap = qr.Save();

bitmap.SaveAs("myqr.png");

IronQR Example QR Code Output

That simplicity is table stakes. The real question is what happens when you need to read a damaged QR code from a warehouse scanner, embed a branded logo, target Linux containers, or process thousands of codes in a batch job. That's where libraries diverge, and where this comparison earns its keep.

The TL;DR: Master Comparison Table

Before we go deep, here's the full picture. This table captures the dimensions that matter most when selecting a QR library for a .NET project.

Library

Generate

Read

Logo/Styling

Micro QR

Cross-Platform

License

NuGet Downloads

IronQR

✅ ML-powered

✅ Full

✅ + RMQR

✅ Win/Mac/Linux/Mobile

Commercial ($749+)

~56K

QRCoder

✅ Moderate

⚠️ Partial (System.Drawing)

MIT (Free)

~68M

ZXing.Net

❌ Minimal

⚠️ Via bindings

Apache 2.0 (Free)

~32M

Net.Codecrete.QrCodeGenerator

MIT (Free)

~4.1M

SkiaSharp.QrCode

✅ Custom shapes

MIT (Free)

~1.2M

Aspose.BarCode

Commercial ($999+)

~5.4M

Syncfusion Barcode

✅ Moderate

✅ (UI control)

Commercial (Free community)

~2M+

Spire.Barcode

✅ Logo embed

⚠️ (System.Drawing)

Commercial ($599+)

~450K

IronBarcode

✅ Micro QR

✅ Win/Mac/Linux

Commercial ($749+)

~1.2M

Dynamsoft Barcode Reader

✅ High-perf

N/A

Commercial ($1,249+/yr)

~250K

BarcodeLib

⚠️ (System.Drawing)

Apache 2.0 (Free)

~4.5M

Table 1: Master comparison of 11 .NET QR code libraries across key selection criteria. Download counts are approximate as of early 2026.

The rest of this article unpacks each row, with code, tradeoffs, and honest assessments.

How Did We Evaluate These Libraries?

We evaluated each library against seven criteria, weighted by how often they drive real-world selection decisions:

  1. QR Generation — Can it create QR codes from strings, URLs, and structured data (vCards, Wi-Fi credentials)?
  2. QR Reading — Can it decode QR codes from images, scans, or PDFs? How does it handle damaged or rotated codes?
  3. Customization — Logo embedding, color control, module shape styling, error correction configuration
  4. QR Format Support — Standard QR, Micro QR, RMQR (Rectangular Micro QR)
  5. Cross-Platform — Does it run cleanly on Windows, Linux, macOS, and inside Docker containers without System.Drawing hacks?
  6. Licensing & Cost — Open-source vs. commercial, per-developer pricing, suite discounts
  7. Documentation & Ecosystem — API reference quality, tutorial availability, community size, active maintenance

All code examples target .NET 8 (LTS) and use top-level statements. Where .NET 10 introduces relevant improvements, we note them.

Which QR Library Should You Choose? A Decision Framework

Skip the 11 library profiles below if you already know your constraints. Here's the fast path:

"I need to generate QR codes for free with zero dependencies."QRCoder or Net.Codecrete.QrCodeGenerator. Both are MIT-licensed. QRCoder has more renderers and payload helpers; Net.Codecrete is lighter and avoids System.Drawing entirely.

"I need to both generate AND read QR codes."IronQR (ML-powered reading, best accuracy on damaged codes), ZXing.Net (free, battle-tested, broadest format support), or Aspose.BarCode (enterprise suite, expensive).

"I'm deploying to Linux/Docker and can't use System.Drawing."IronQR, SkiaSharp.QrCode, or Net.Codecrete.QrCodeGenerator. All three avoid the System.Drawing dependency that breaks cross-platform deployments.

"Performance and memory footprint are critical."SkiaSharp.QrCode leads in raw generation benchmarks. For reading performance, Dynamsoft Barcode Reader is purpose-built for high-throughput scanning.

"I already use an Aspose/Syncfusion/Iron Software suite." → Use what you have. Adding another vendor's QR library when your suite already includes one rarely makes sense from a licensing or maintenance perspective.

"I'm building a Blazor/MAUI mobile app with QR scanning."IronQR has explicit MAUI and Blazor integration guides. Microsoft MVP Jeff Fritz built a QR-based digital business card app using IronQR with Blazor, a real-world example of this exact pattern.

The 11 .NET QR Code Libraries Compared

1. IronQR — ML-Powered QR Reading and Generation with Cross Platform Support

IronQR is Iron Software's dedicated QR code library, separate from their broader IronBarcode product. Its standout feature is a machine learning model (ONNX-based) that detects and reads QR codes from imperfect images, rotated, partially obscured, or photographed at odd angles, often in just a few lines of code.

It is also capable of creating QR code objects with ease, with support to style QR codes with images, add custom colors, and save your QR image to different output formats.

Generation:

using IronQr;
using IronSoftware.Drawing;

// Generate a styled QR code with logo
var options = new QrOptions(QrErrorCorrectionLevel.High, 20);

QrCode qr = QrWriter.Write("https://example.com", options);

var style = new QrStyleOptions
{
    Dimensions = 300,
    Margins = 10,
    Color = new Color("#2E75B6"),
    Logo = new QrLogo { Bitmap = AnyBitmap.FromFile("logo.png"), Width = 80, Height = 80 }

};

AnyBitmap styledQr = qr.Save(style);

styledQr.SaveAs("branded-qr.png");

IronQR Generated QR Output

Reading:

using IronQr;
using IronSoftware.Drawing;

var reader = new QrReader();

var input = new QrImageInput(AnyBitmap.FromFile("scanned-qr.jpg"));

IEnumerable<QrResult> results = reader.Read(input);

foreach (var result in results)
    Console.WriteLine($"Value: {result.Value}");

IronQR Read Output

The ML model is what differentiates IronQR from every other library on this list. In our testing, it successfully decoded QR codes from conference badge photos and angled smartphone screenshots where ZXing.Net and basic image-processing readers returned nothing. The tradeoff is package size, the ONNX model adds weight. If you don't need reading, IronQR.Slim ships without the ML model and is significantly lighter.

Strengths:

Limitations:

Best for: Projects that need both generation and reading, especially where scan conditions are imperfect (mobile apps, warehouse scanning, conference/event scenarios). The Jeff Fritz QR business card case study demonstrates IronQR handling real-time QR generation with Blazor and custom branding.

The QRCoder library is the single most downloaded QR code package on NuGet, with over 68 million downloads. Originally created by Raffael Herrmann in 2013 and now maintained by Shane32, it's a pure C# implementation focused exclusively on QR code generation (not reading).

using QRCoder;

// Generate a QR code and save as PNG bytes
using var qrGenerator = new QRCodeGenerator();

using var qrCodeData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

using var pngQrCode = new PngByteQRCode(qrCodeData);

byte[] qrCodeImage = pngQrCode.GetGraphic(20);

File.WriteAllBytes("qrcoder-output.png", qrCodeImage);

QRCoder Output Image

QRCoder provides multiple renderers: PngByteQRCode (cross-platform, no System.Drawing dependency), QRCode (System.Drawing-based, Windows only), SvgQRCode, AsciiQRCode, and more. It also includes payload generators for structured data like Wi-Fi credentials, vCards, and bookmarks, which saves you from formatting those strings manually.

Strengths:

Limitations:

Best for: Projects that only need QR generation, especially when budget is zero. If you need to generate Wi-Fi QR codes or vCards and don't need to read codes at all, QRCoder is the pragmatic default choice for most .NET developers.

3. ZXing.Net — The Swiss Army Knife of Barcode Libraries

ZXing.Net ("Zebra Crossing") is the .NET port of the original Java ZXing library. It's a general-purpose barcode library supporting over 15 formats, QR Code, Data Matrix, Aztec, PDF 417, UPC, EAN, Code 128, and more. QR support is a subset of its broader capabilities.

using ZXing;
using ZXing.Common;
using ZXing.QrCode;

// Generate a QR code
var writer = new BarcodeWriterPixelData
{
    Format = BarcodeFormat.QR_CODE,
    Options = new QrCodeEncodingOptions { Height = 250, Width = 250, Margin = 1 }
};

var pixelData = writer.Write("https://example.com");

// Reading a QR code requires a binding package (e.g., ZXing.Net.Bindings.SkiaSharp)

ZXing.Net Output

ZXing.Net requires platform-specific binding packages for rendering and reading. The core package provides encoding/decoding logic; you add ZXing.Net.Bindings.Windows.Compatibility, ZXing.Net.Bindings.SkiaSharp, or ZXing.Net.Bindings.ImageSharp depending on your target platform. This modular approach is flexible but adds integration complexity.

Strengths:

Limitations:

Best for: Projects that need both QR code and traditional barcode support (retail, logistics) and want a free, proven option. If your priority is QR-specific features like styling or ML-powered reading rather than broad barcode format coverage, a dedicated QR library will serve you better.

4. Net.Codecrete.QrCodeGenerator — Lightweight and Standards-Focused

Net.Codecrete.QrCodeGenerator is a clean, minimal QR code generation library by Manuel Bleichenbacher. It's a .NET translation of Project Nayuki's Java QR code generator, focused on correctness and standards compliance (ISO/IEC 18004).

using Net.Codecrete.QrCodeGenerator;

var qr = QrCode.EncodeText("https://example.com", QrCode.Ecc.Medium);

string svg = qr.ToSvgString(4);

File.WriteAllText("output.svg", svg);

Example Ouptut with Net.Codecrete.QrCodeGenerator

With ~4.1 million NuGet downloads, it's well-adopted for a focused library. Its standout quality is zero dependencies on System.Drawing — it generates SVG, XAML path data, PNG, and BMP natively. This makes it an excellent choice for cross-platform .NET projects and ASP.NET Core services running in Docker.

Strengths:

Limitations:

Best for: Developers who need a small, correct, cross-platform QR generator with SVG output and no System.Drawing baggage. If your deployment target is Linux or Docker and you only need generation, this library deserves serious consideration.

5. SkiaSharp.QrCode — High-Performance Cross-Platform Generation

SkiaSharp.QrCode by guitarrapc is a performance-focused QR generation library built on SkiaSharp. It was created specifically to avoid System.Drawing's GDI+ limitations while delivering native-level performance through SkiaSharp's hardware acceleration.

using SkiaSharp.QrCode.Image;

// One-liner: generate and save
QRCodeImageBuilder.SavePng("https://example.com", "qrcode.png");

// Or with custom settings
var pngBytes = new QRCodeImageBuilder("https://example.com")
    .WithSize(512, 512)
    .WithErrorCorrection(ECCLevel.H)
    .ToByteArray();

SkiaSharp.QrCode One-Liner Output

Benchmark results from the project's repository show SkiaSharp.QrCode outperforming QRCoder and other .NET QR libraries in both speed and memory allocation for generation tasks. It achieves zero-copy rendering directly to the SkiaSharp canvas, avoiding intermediate buffer allocations.

Strengths:

Limitations:

Best for: High-throughput server applications generating QR codes at scale (e.g., ticketing systems, bulk label generation) where performance and memory efficiency matter most. Also ideal if you're already using SkiaSharp in your project.

6. Aspose.BarCode — Enterprise-Grade Barcode Suite to Generate QR Codes

Aspose.BarCode for .NET is a comprehensive commercial library supporting over 80 barcode symbologies including QR Code, Micro QR, Data Matrix, PDF417, and all common 1D formats. It's part of the broader Aspose ecosystem used by enterprises for document processing.

using Aspose.BarCode.Generation;
using Aspose.BarCode.BarCodeRecognition;

// Generate
var generator = new BarcodeGenerator(EncodeTypes.QR, "https://example.com");
generator.Parameters.Barcode.XDimension.Pixels = 4;
generator.Save("aspose-qr.png", BarCodeImageFormat.Png);

// Read
using var reader = new BarCodeReader("aspose-qr.png", DecodeType.QR);

foreach (var result in reader.ReadBarCodes())
    Console.WriteLine($"Type: {result.CodeTypeName}, Text: {result.CodeText}");

Aspose.BarCode QR Output

Aspose.BarCode Read Output

Aspose.BarCode provides QualitySettings presets that balance recognition speed against tolerance for damaged codes, from HighPerformance (fast, clean images) to HighQuality (slower, handles noise and distortion).

Strengths:

Limitations:

Expensive, perpetual licenses start at $999 for a single developer

Best for: Enterprises already invested in the Aspose ecosystem, or projects requiring support for many barcode formats beyond QR. For QR-only projects, the price-to-value ratio is hard to justify.

7. Syncfusion Barcode — UI Control with QR Capabilities

Syncfusion's Barcode component is a UI control available across their ASP.NET Core, Blazor, WPF, WinForms, and Xamarin platforms. Unlike standalone libraries, it's designed to render barcodes and QR codes directly within Syncfusion's UI framework.

Syncfusion provides a Community License that's free for individual developers and small businesses (revenue under $1M, up to 5 developers). This makes it uniquely accessible among commercial options.

Strengths:

Limitations:

Best for: Teams already using Syncfusion's UI suite who need to render QR codes within their existing UI components. For this use case, it's the path of least resistance.

8. Spire.Barcode — eIceBlue's Barcode Toolkit for Creating QR Codes

Spire.Barcode for .NET by eIceBlue supports generation and reading of QR codes and common barcode formats. It integrates with their broader document manipulation suite (Spire.Doc, Spire.PDF, Spire.XLS).

using Spire.Barcode;

BarcodeSettings settings = new BarcodeSettings();

settings.Type = BarCodeType.QRCode;

settings.Data = "https://example.com";

settings.QRCodeECL = QRCodeECL.H;

settings.X = 3.0f;

BarCodeGenerator generator = new BarCodeGenerator(settings);

Image qrImage = generator.GenerateImage();

qrImage.Save("spire-qr.png", ImageFormat.Png);

Spire.Barcode QR Output

Strengths:

Limitations:

Best for: Teams already using eIceBlue's Spire document suite who need QR functionality integrated with their document processing pipeline.

9. IronBarcode — Iron Software's Broader Barcode Library

IronBarcode is Iron Software's general-purpose barcode library supporting 50+ barcode formats including QR codes. Where IronQR is the specialist, IronBarcode is the generalist, it handles everything when it comes to barcode functionality, from UPC-A to Data Matrix alongside QR codes.

using IronBarCode;

// Generate a styled QR code
GeneratedBarcode qr = QRCodeWriter.CreateQrCode("https://example.com", 250, QRCodeWriter.QrErrorCorrectionLevel.High);

qr.AddBarcodeValueTextBelowBarcode();

qr.SetMargins(10);

qr.ChangeBarCodeColor(IronSoftware.Drawing.Color.DarkBlue);

qr.SaveAsPng("ironbarcode-qr.png");

// Read QR codes from an image
var results = BarcodeReader.Read("scanned-image.png");

foreach (var result in results)
    Console.WriteLine($"Format: {result.BarcodeType}, Value: {result.Value}");

IronBarcode QR Output

Strengths:

Limitations:

Best for: Projects that need both QR codes and traditional barcodes (retail POS, shipping labels, inventory management) in a single library. If your project only handles QR codes, IronQR is the better fit from Iron Software.

10. Dynamsoft Barcode Reader — High-Performance Scanning SDK

Dynamsoft Barcode Reader is a commercial SDK focused on reading barcodes and QR codes from images, video streams, and camera feeds. It does not generate QR codes, it's a pure scanning solution optimized for speed and accuracy.

Strengths:

Limitations:

Best for: Industrial scanning applications, mobile scanning SDKs, and scenarios where reading accuracy and speed on imperfect real-world inputs is the top priority. If you need both generation and reading, pair it with a generation-only library.

11. BarcodeLib — Minimalist Barcode Generation

BarcodeLib is a lightweight, open-source barcode generation library. While it supports QR codes through its integration with ZXing.Net's encoding engine, its primary strength is simple 1D barcode generation (Code 128, Code 39, EAN, UPC, ITF).

Strengths:

Limitations:

Best for: Projects where 1D barcodes are the primary requirement and QR code generation is an occasional secondary need. For QR-focused projects, use a dedicated QR library instead.

Real-World QR Code Patterns in .NET

Library selection depends partly on which QR code patterns your project requires. Here are the most common real-world scenarios, with code showing how leading libraries handle each one.

The most common pattern, encoding a URL for posters, packaging, or digital campaigns. Every library handles this, so the differentiator is customization depth.

IronQR (styled with brand colors):

using IronQr;
using IronSoftware.Drawing;

var options = new QrOptions(QrErrorCorrectionLevel.High, 20);

QrCode qr = QrWriter.Write("https://yoursite.com/promo", options);

var style = new QrStyleOptions
{
    Dimensions = 400,
    Color = new Color("#1B365D"),
    Logo = new QrLogo { Bitmap = AnyBitmap.FromFile("brand-logo.png"), Width = 90, Height = 90 }
};

qr.Save(style).SaveAs("branded-promo-qr.png");

Output

QRCoder (minimal, zero-cost):

using QRCoder;

using var generator = new QRCodeGenerator();

using var data = generator.CreateQrCode("https://yoursite.com/promo", QRCodeGenerator.ECCLevel.H);

using var png = new PngByteQRCode(data);

File.WriteAllBytes("promo-qr.png", png.GetGraphic(20));

Output

Both produce a scannable QR code. IronQR adds branding in one pass; QRCoder requires a separate image compositing step for logos.

Pattern 2: Wi-Fi Credential Sharing

Restaurants, hotels, and offices commonly display QR codes that auto-connect devices to Wi-Fi. The payload string follows a specific format: WIFI:T:{auth};S:{ssid};P:{password};;

QRCoder (with built-in payload generator):

using QRCoder;

var wifiPayload = new PayloadGenerator.WiFi("GuestNetwork", "Welcome2026!", PayloadGenerator.WiFi.Authentication.WPA);

using var generator = new QRCodeGenerator();

using var data = generator.CreateQrCode(wifiPayload);

using var png = new PngByteQRCode(data);

File.WriteAllBytes("wifi-qr.png", png.GetGraphic(20));

Output

QRCoder's PayloadGenerator handles the format string correctly — including escaping special characters in SSIDs and passwords. This is one of QRCoder's genuine advantages; with other libraries, you'd format the WIFI string manually:

SkiaSharp.QrCode (manual payload):

using SkiaSharp.QrCode.Image;

string wifiString = "WIFI:T:WPA;S:GuestNetwork;P:Welcome2026!;;";

QRCodeImageBuilder.SavePng(wifiString, "wifi-qr.png");

Output

Pattern 3: vCard Contact Sharing (Business Cards, Events)

Digital business cards — like the one Microsoft MVP Jeff Fritz built using IronQR and Blazor — encode contact data in vCard format. The QR code, when scanned, prompts the device to add the contact directly.

QRCoder (with payload generator):

using QRCoder;

var contact = new PayloadGenerator.ContactData(
    outputType: PayloadGenerator.ContactData.ContactOutputType.VCard3,
    firstname: "Jane",
    lastname: "Doe",
    email: "jane@example.com",
    phone: "+1-555-0100",
    org: "Acme Corp",
    orgTitle: "Lead Developer"
);

using var generator = new QRCodeGenerator();

using var data = generator.CreateQrCode(contact);

using var png = new PngByteQRCode(data);

File.WriteAllBytes("contact-qr.png", png.GetGraphic(15));

Output

IronQR (manual vCard string with styling):

using IronQr;
using IronSoftware.Drawing;

string vcard = """
BEGIN:VCARD
VERSION:3.0
FN:Jane Doe
ORG:Acme Corp
TITLE:Lead Developer
TEL:+1-555-0100
EMAIL:jane@example.com
END:VCARD
""";

QrCode qr = QrWriter.Write(vcard, new QrOptions(QrErrorCorrectionLevel.High));

var style = new QrStyleOptions { Dimensions = 350, Color = new Color("#333333") };

qr.Save(style).SaveAs("contact-qr.png");

Output

QRCoder wins on convenience here with its structured payload generators. IronQR wins when you need styling or will also read the QR code back later.

Pattern 4: Reading QR Codes from Imperfect Images

This is where the field narrows dramatically. Most .NET QR libraries are generation-only. For reading — especially from real-world images captured by phone cameras, warehouse scanners, or document scans — you need IronQR, ZXing.Net, Aspose.BarCode, or Dynamsoft.

IronQR (ML-powered, handles damaged codes):

using IronQr;
using IronSoftware.Drawing;

var reader = new QrReader();

var input = new QrImageInput(AnyBitmap.FromFile("blurry-photo.jpg"));

var results = reader.Read(input);

foreach (var result in results)
    Console.WriteLine($"Decoded: {result.Value}");

Output

ZXing.Net (traditional image processing):

using ZXing;
using ZXing.SkiaSharp;

var reader = new BarcodeReader();

using var bitmap = SkiaSharp.SKBitmap.Decode("blurry-photo.jpg");

var result = reader.Decode(bitmap);

if (result != null)
    Console.WriteLine($"Decoded: {result.Text}");

else
    Console.WriteLine("Could not decode QR code");

Output

The critical difference: IronQR's ML model can detect QR codes at angles, under partial occlusion, and with significant blur, scenarios where traditional pixel-analysis approaches like ZXing.Net return null. In our testing with conference badge photos and angled screenshots, IronQR decoded successfully in cases where ZXing.Net did not. The tradeoff is package weight (the ONNX model) and a commercial license.

Pattern 5: Batch QR Code Generation (Labels, Tickets, Inventory)

High-throughput scenarios — generating hundreds or thousands of QR codes for event tickets, inventory labels, or shipping — require attention to performance and memory.

SkiaSharp.QrCode (optimized for throughput):

using SkiaSharp.QrCode.Image;

var ticketIds = Enumerable.Range(1, 1000).Select(i => $"TICKET-2026-{i:D5}");

foreach (var id in ticketIds)
{
    var pngBytes = QRCodeImageBuilder.GetPngBytes(id);
    File.WriteAllBytes($"tickets/{id}.png", pngBytes);
}

Output

IronQR (with async for server workloads):

using IronQr;
using IronSoftware.Drawing;

var items = Enumerable.Range(1, 500).Select(i => $"INV-{i:D6}");

foreach (var item in items)
{
    QrCode qr = QrWriter.Write(item);
    qr.Save().SaveAs($"labels/{item}.png");
}

Output

For pure generation speed, SkiaSharp.QrCode's zero-allocation architecture makes it the performance leader. Its benchmarks show lower memory pressure and faster throughput than QRCoder and other alternatives. For projects where reading is also needed, IronQR's ReadAsync method enables parallel scanning on server workloads.

Pattern 6: Embedding QR Codes in PDF Documents

A common enterprise pattern: generating invoices, shipping documents, or compliance paperwork with embedded QR codes. This requires a library that either outputs to PDF directly or integrates with a PDF library.

IronQR + IronPDF (same vendor, designed to work together):

using IronQr;
using IronPdf;
using IronSoftware.Drawing;

QrCode qr = QrWriter.Write("INV-2026-001-VERIFIED");

AnyBitmap qrImage = qr.Save();

qrImage.SaveAs("temp-qr.png");

var renderer = new ChromePdfRenderer();

var pdf = renderer.RenderHtmlAsPdf($@"
    <h1>Invoice #2026-001</h1>
    <p>Scan to verify authenticity:</p>
    <img src='temp-qr.png' width='200' />
");

pdf.SaveAs("invoice-with-qr.pdf");

Output

Aspose.BarCode integrates similarly with Aspose.PDF, and Spire.Barcode with Spire.PDF. The vendor-ecosystem pattern is strong here, mixing PDF and QR libraries from different vendors works but requires more glue code.

Feature Matrix: How Do These Libraries Stack Up?

Here's a granular look at QR-specific capabilities across all 11 libraries.

Feature

IronQR

QRCoder

ZXing.Net

Codecrete

SkiaSharp.QrCode

Aspose

Syncfusion

Spire

IronBarcode

Dynamsoft

BarcodeLib

Standard QR

✅ Read

✅ Basic

Micro QR

✅ Read

RMQR

Logo embedding

⚠️ Manual

⚠️ Canvas

N/A

Color control

N/A

Module shapes

✅ Rounded

✅ Circle/Round

N/A

SVG output

N/A

PDF embedding

N/A

Structured data

✅ WiFi/vCard

N/A

ML-powered read

N/A

N/A

N/A

N/A

N/A

Async support

N/A

NativeAOT

N/A

Table 2: Detailed QR-specific feature comparison. ⚠️ indicates partial support requiring additional code or workarounds. N/A means the feature category doesn't apply (e.g., styling for read-only libraries).

A few patterns emerge. QRCoder's built-in payload generators for Wi-Fi credentials and vCards are unique among generation libraries, a genuine time-saver. IronQR and IronBarcode are the only libraries supporting RMQR (Rectangular Micro QR), which matters for edge-of-label and narrow-space industrial applications. And SkiaSharp.QrCode's NativeAOT support makes it the only option for projects targeting ahead-of-time compilation.

The System.Drawing Problem — Why Cross-Platform Matters

Since .NET 6, System.Drawing.Common throws PlatformNotSupportedException on non-Windows platforms unless you explicitly opt in with a runtime configuration switch. Even when you force it to work on Linux, it depends on libgdiplus, which is unreliable, poorly maintained, and a frequent source of Docker deployment headaches.

This matters for QR library selection because several popular options depend on System.Drawing for rendering:

Library

System.Drawing Dependency

Cross-Platform Status

QRCoder

Some renderers (use PngByteQRCode to avoid)

⚠️ Mixed — depends on renderer choice

ZXing.Net

Core is clean; bindings may depend on it

⚠️ Mixed — depends on binding package

BarcodeLib

Direct dependency

❌ Windows-focused

Spire.Barcode

Direct dependency

❌ Windows-focused

IronQR

No dependency (uses IronSoftware.Drawing)

✅ Cross-platform

SkiaSharp.QrCode

No dependency (uses SkiaSharp)

✅ Cross-platform

Net.Codecrete.QrCodeGenerator

No dependency

✅ Cross-platform

Aspose.BarCode

Conditional dependency

✅ Generally cross-platform

Table 3: System.Drawing dependency status. Libraries marked ❌ will require workarounds or may not work reliably in Linux/Docker deployments.

The tradeoff here is clear: if your deployment targets include anything beyond Windows desktop, filter your library shortlist to those in the ✅ column. QRCoder gets a conditional pass, the PngByteQRCode renderer avoids System.Drawing, but you need to be deliberate about which renderer you use.

Here's a concrete example of how this plays out. A common Docker deployment for an ASP.NET Core QR code service:

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

WORKDIR /app

# No need to install libgdiplus when using IronQR, SkiaSharp.QrCode, or Codecrete

# Libraries that depend on System.Drawing would require:

# RUN apt-get update && apt-get install -y libgdiplus

# ...and even then, rendering quality is inconsistent

COPY --from=build /app/publish .

ENTRYPOINT ["dotnet", "QrService.dll"]

With System.Drawing-free libraries, your Docker images stay small, your builds stay clean, and you avoid the libgdiplus dependency that introduces subtle rendering differences between development (Windows) and production (Linux) environments. This isn't a theoretical concern, it's a deployment issue we've seen cause QR code readability failures in production.

What Will This Cost? Licensing Breakdown

Cost is often the tiebreaker. Here's the full picture:

Library

License

Cost

Free Tier

What You Get

QRCoder

MIT

Free

Full

Generation only, community support

ZXing.Net

Apache 2.0

Free

Full

Generation + reading, community support

Net.Codecrete.QrCodeGenerator

MIT

Free

Full

Generation only, community support

SkiaSharp.QrCode

MIT

Free

Full

Generation only, community support

BarcodeLib

Apache 2.0

Free

Full

Basic generation, community support

Syncfusion Barcode

Commercial

Paid (suite)

Community License (< $1M revenue, ≤ 5 devs)

UI control, generation only

Spire.Barcode

Commercial

~$599+

Free limited edition

Generation + reading

IronQR

Commercial

$749+ per dev

30-day trial

Generation + ML reading, email/chat support

IronBarcode

Commercial

$749+ per dev

30-day trial

50+ formats, generation + reading, support

Aspose.BarCode

Commercial

$999+ per dev

Eval (watermarked)

80+ formats, generation + reading, support

Dynamsoft

Commercial

$1,249+/year

30-day trial

High-perf reading only, SDK support

Table 4: Licensing and cost comparison. All commercial prices are starting rates for a single-developer perpetual license unless otherwise noted. Verify current pricing on each vendor's website.

The Iron Suite bundle (all 10 Iron Software products for the price of 2, starting at $1,498) is worth evaluating if you need more than just QR functionality, you'd get IronPDF, IronXL, IronOCR, IronBarcode, and IronQR for roughly the same price as a single Aspose.BarCode license.

For pure open-source projects, QRCoder (generation) + ZXing.Net (reading) gives you complete QR capability at zero license cost. The tradeoff is integration complexity and lower reading accuracy on damaged codes.

.NET Version Compatibility: Where Each Library Stands

If you're targeting modern .NET, you need to know which libraries actively support your runtime. Here's the current state:

Library

.NET 8 (LTS)

.NET 9

.NET 10

.NET Framework 4.x

.NET Standard 2.0

IronQR

✅ 4.6.2+

QRCoder

✅ 3.5+

ZXing.Net

✅ 2.0+

Net.Codecrete.QrCodeGenerator

✅ via Standard

SkiaSharp.QrCode

Aspose.BarCode

Syncfusion Barcode

Spire.Barcode

⚠️ Verify

IronBarcode

✅ 4.6.2+

Dynamsoft

⚠️ Verify

BarcodeLib

⚠️ Verify

Table 5: .NET version compatibility. ⚠️ Verify means the library likely works but we haven't confirmed explicit .NET 10 testing from the vendor.

Most libraries target .NET Standard 2.0, which ensures broad compatibility. The distinction matters more for libraries with native dependencies, IronQR's ML model, SkiaSharp.QrCode's rendering engine, and Dynamsoft's scanning SDK all ship platform-specific binaries that need to match your target runtime and OS. When upgrading .NET versions, test these libraries first.

QRCoder stands out for legacy support, it targets all the way back to .NET Framework 3.5, making it the only viable option for teams maintaining very old codebases that can't migrate to modern .NET yet.

Choosing by Project Type: Practical Recommendations

Beyond features and cost, your project type narrows the field significantly. Here's how the most common .NET project types map to library recommendations:

ASP.NET Core Web APIs (generating QR codes as a service): Performance and cross-platform matter most. SkiaSharp.QrCode for maximum throughput. IronQR if you need reading too. Avoid System.Drawing-dependent libraries — they'll cause issues in containerized deployments.

Blazor / MAUI mobile apps (scanning and generating): IronQR has dedicated MAUI integration and Blazor examples. ZXing.Net has community bindings for Xamarin/MAUI. Dynamsoft offers the strongest mobile camera SDK but at the highest price.

WPF / WinForms desktop apps: All 11 libraries work here. System.Drawing isn't a problem on Windows. QRCoder with the QRCode renderer (System.Drawing-based) is the simplest free option. Net.Codecrete.QrCodeGenerator's XAML path output integrates natively with WPF vector rendering.

Console tools / CI pipelines: Lightweight matters. Net.Codecrete.QrCodeGenerator or QRCoder with PngByteQRCode, minimal dependencies, fast startup, no native assets to manage.

Enterprise document workflows (invoices, compliance): IronQR + IronPDF, or Aspose.BarCode + Aspose.PDF. The vendor-ecosystem integration saves significant glue code. Consider the Iron Suite if you need PDF, Excel, and QR in the same project, it's priced competitively against individual Aspose products.

Switching Libraries: What to Expect

If you're migrating from one QR library to another — maybe you outgrew a generation-only library and now need reading, or you're moving off System.Drawing for Linux deployments — here's what the migration typically looks like.

From QRCoder to IronQR: The most common migration path. QRCoder's QRCodeGenerator.CreateQrCode() pattern maps cleanly to IronQR's QrWriter.Write(). The key difference is that IronQR returns a QrCode object that you then style and save, rather than returning raw pixel data. If you used QRCoder's payload generators (Wi-Fi, vCard), you'll need to format those strings yourself with IronQR, or keep QRCoder as a payload-formatting utility alongside IronQR for generation and reading.

From ZXing.Net to IronQR: ZXing.Net's BarcodeWriter maps to QrWriter, and BarcodeReader maps to QrReader. The biggest change is dropping the platform-specific binding packages, IronQR handles image I/O through IronSoftware.Drawing.AnyBitmap, which abstracts away the platform layer. You'll also gain the ML reading model, which means codes that ZXing.Net couldn't decode may now work without any code changes on your end.

From System.Drawing to cross-platform alternatives: This is less about QR libraries and more about your image pipeline. If your QR generation code passes System.Drawing.Bitmap objects to other parts of your application, you'll need to refactor those touchpoints. IronQR uses AnyBitmap, SkiaSharp.QrCode uses SKBitmap, and Net.Codecrete uses raw byte arrays or SVG strings. Plan for this ripple effect when estimating migration effort.

General advice: Wrap your QR generation and reading behind an interface (IQrGenerator, IQrReader) from the start. This makes library switching a matter of swapping one implementation, rather than hunting through your entire codebase for library-specific API calls. It's a small upfront investment that pays for itself the first time you need to change libraries.

Frequently Asked Questions

What is the best QR code library for C#? There is no universal "best." QRCoder dominates free generation. IronQR leads in reading accuracy thanks to its ML model. ZXing.Net is the best free option for combined generation and reading. Aspose.BarCode wins on breadth. The decision framework above maps your specific constraints to the right choice.

How do I add a logo to a QR code in C#? IronQR provides a QrStyleOptions.Logo property. IronBarcode has CreateQrCodeWithLogo(). Spire.Barcode supports it via QRCodeLogoImage. With QRCoder, you generate the QR code and composite the logo image yourself using an image library. Always use High error correction when embedding logos, as the logo obscures data modules, without High EC, the code may become unscannable.

Can I read QR codes from PDF files in .NET? IronQR and IronBarcode can read QR codes directly from PDF documents. Aspose.BarCode can as well when combined with Aspose.PDF. For other libraries, you'd need to rasterize the PDF page to an image first, then scan the image, which adds a dependency on a PDF rendering library and may reduce recognition accuracy depending on the rasterization resolution.

Which library works best in Docker/Linux containers? IronQR, SkiaSharp.QrCode, and Net.Codecrete.QrCodeGenerator all work without System.Drawing and run cleanly in Linux containers. QRCoder works if you use the PngByteQRCode renderer specifically. Avoid BarcodeLib and Spire.Barcode for containerized workloads unless you're willing to install libgdiplus and accept the rendering inconsistencies it introduces.

Is QRCoder still actively maintained? Yes. Maintainership transferred to Shane32 in 2025, and the library has received updates including Micro QR code support and improved documentation. It remains under active development.

What error correction level should I use? QR codes support four error correction levels: L (7% recovery), M (15%), Q (25%), and H (30%). Use L for clean digital displays where the code won't be damaged. Use M (the default for most libraries) for general-purpose use. Use Q for printed materials that may get scuffed or partially covered. Use H when embedding a logo, since the logo physically obscures data modules — H gives you the maximum redundancy to compensate. Higher error correction increases the QR code's physical size (more modules), so there's a tradeoff between resilience and density.

How do I generate QR codes for Micro QR or RMQR formats? Micro QR codes are smaller versions of standard QR codes, useful when space is extremely limited (small labels, PCB markings). RMQR (Rectangular Micro QR) is an even more specialized format designed for narrow spaces where a square code won't fit. IronQR and IronBarcode support both Micro QR and RMQR. QRCoder supports Micro QR generation. Aspose.BarCode supports Micro QR. No other library on this list handles RMQR, it's a relatively new ISO standard (ISO/IEC 23941:2022) with limited ecosystem support.

Can I use multiple QR libraries in the same project? Yes, but be thoughtful about it. A common pattern is QRCoder for generation (free, lightweight) plus IronQR for reading (ML-powered accuracy). The main risk is dependency conflicts, particularly if both libraries pull in different versions of System.Drawing or image processing packages. Use separate service classes and be explicit about which library handles which responsibility.

What's the maximum data a QR code can hold? A standard QR code (Version 40, the largest) can encode up to 7,089 numeric characters, 4,296 alphanumeric characters, or 2,953 bytes of binary data. In practice, you rarely approach these limits, a typical URL or vCard uses a fraction of this capacity. Micro QR codes hold significantly less (up to 35 numeric characters at the largest Micro QR version). If you're encoding large payloads, consider whether a URL pointing to the data (rather than the data itself) might be a better architectural choice.

Conclusion: Let the Use Case Drive the Decision

No single library wins every scenario. The right choice depends on three questions: Do you need reading, generation, or both? Where are you deploying? What's your budget?

Here's our condensed recommendation:

Two combinations deserve special mention for teams that need both generation and reading without a commercial license: QRCoder (generation) + ZXing.Net (reading) covers the full workflow at zero cost. The tradeoff is integration complexity, you're managing two libraries, two dependency trees, and two API patterns. If that complexity isn't worth it, IronQR unifies both capabilities under a single API with an ML-powered reading engine that handles real-world image quality better than traditional approaches.

We built this comparison to be the resource we wished existed when we were evaluating QR libraries ourselves. Every library on this list solves a real problem for a real audience, the question is which problem matches yours.

For IronQR's full API reference, getting started guide, and code examples, see the official documentation. For IronBarcode's broader barcode capabilities, visit the IronBarcode documentation.

What QR library are you using in your .NET projects, and what drove your decision? We'd love to hear about edge cases and real-world experiences in the comments.