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 |
|---|---|---|---|---|---|---|---|
|
✅ |
✅ ML-powered |
✅ Full |
✅ + RMQR |
✅ Win/Mac/Linux/Mobile |
Commercial ($749+) |
~56K |
|
|
✅ |
❌ |
✅ Moderate |
✅ |
⚠️ Partial (System.Drawing) |
MIT (Free) |
~68M |
|
|
✅ |
✅ |
❌ 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+ |
|
✅ |
✅ |
✅ Logo embed |
❌ |
⚠️ (System.Drawing) |
Commercial ($599+) |
~450K |
|
|
✅ |
✅ |
✅ |
✅ Micro QR |
✅ Win/Mac/Linux |
Commercial ($749+) |
~1.2M |
|
|
Dynamsoft Barcode Reader |
❌ |
✅ High-perf |
N/A |
✅ |
✅ |
Commercial ($1,249+/yr) |
~250K |
|
✅ |
❌ |
❌ |
❌ |
⚠️ (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:
- QR Generation — Can it create QR codes from strings, URLs, and structured data (vCards, Wi-Fi credentials)?
- QR Reading — Can it decode QR codes from images, scans, or PDFs? How does it handle damaged or rotated codes?
- Customization — Logo embedding, color control, module shape styling, error correction configuration
- QR Format Support — Standard QR, Micro QR, RMQR (Rectangular Micro QR)
- Cross-Platform — Does it run cleanly on Windows, Linux, macOS, and inside Docker containers without System.Drawing hacks?
- Licensing & Cost — Open-source vs. commercial, per-developer pricing, suite discounts
- 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:
- ML-powered reading handles damaged, rotated, and partially obscured QR codes and prioritizes accuracy
- Supports QR Code, Micro QR, and RMQR (Rectangular Micro QR) formats
- Full styling API: colors, logos, rounded modules, margins
- Cross-platform: Windows, macOS, Linux, iOS, Android, Docker, Azure, AWS
- Async reading support (ReadAsync) for server workloads
- Save to multiple formats such as PNG image, JPG, multi page TIFF, and more
- User friendly API makes it easy to use
Limitations:
- Commercial license required ($749+ per developer for deployment)
- Full package is heavier than open-source alternatives due to ML model
- NuGet download count is lower than mature open-source options, newer product (launched ~2023)
- Generation-only projects may not need the ML overhead
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.
2. QRCoder — The Most Popular Open-Source QR Generator
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:
- MIT license, completely free for commercial use
- 68M+ NuGet downloads, massive community adoption and proven stability
- Multiple renderer options including a PngByteQRCode that avoids System.Drawing
- Built-in payload generators (Wi-Fi, vCard, geolocation, calendar events)
- Micro QR code support
- Zero dependencies on .NET Standard targets
Limitations:
- Generation only, cannot read or decode QR code image files
- Some renderers (like QRCode) depend on System.Drawing.Common, which is Windows-only since .NET 6
- No logo embedding built-in (you'd composite the image yourself)
- No advanced styling (module shapes, gradients)
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:
- Apache 2.0 license, free for commercial use
- Both generation and reading in a single library
- Supports 15+ barcode formats beyond QR codes
- 32M+ NuGet downloads, battle-tested, extensive community knowledge
- Bindings available for SkiaSharp, ImageSharp, OpenCV, and more
Limitations:
- QR-specific features are basic, no logo embedding, no advanced styling
- Reading accuracy on damaged/rotated QR codes is moderate compared to ML-powered solutions
- Binding packages add dependency management complexity
- API design shows its age, less fluent than modern .NET libraries
- Active maintenance pace has slowed (community-maintained)
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:
- MIT license, completely free
- Zero System.Drawing dependency, truly cross-platform
- Small footprint, fast generation
- SVG and XAML output built-in (useful for WPF, WinUI, and web scenarios)
- Correct implementation of all 40 QR versions and all 4 error correction levels
- Extensive example projects (WinForms, WPF, ASP.NET Core, SkiaSharp, ImageSharp)
Limitations:
- Generation only, no QR reading capability
- No logo embedding or advanced styling features
- Limited customization compared to QRCoder's payload generators
- Less community content and tutorials compared to QRCoder or ZXing.Net
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:
- MIT license, free for commercial use
- Best-in-class generation performance (benchmarked)
- Minimal memory allocation, low GC pressure for high-throughput scenarios
- NativeAOT ready (.NET Native AOT compilation support)
- Custom module shapes (circles, rounded rectangles) for styled QR codes
- Works on Windows, Linux, macOS, iOS, Android, WebAssembly
Limitations:
- Generation only, no QR reading
- Requires SkiaSharp native dependencies (platform-specific NuGet packages)
- Smaller community than QRCoder or ZXing.Net
- No payload generators (Wi-Fi, vCard), you format those strings yourself
- UTF-8 only, no ISO-8859-2 or Shift JIS encoding
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:
- Both generation and reading with sophisticated quality tuning
- 80+ barcode format support, the broadest on this list
- Advanced reading handles noisy scans, low-contrast, skewed, and damaged codes
- Rich customization: colors, borders, bar height, rotation, text positioning
- Cross-platform: .NET Framework, .NET Core, .NET 5+, Xamarin
- Comprehensive documentation and API reference
Limitations:
Expensive, perpetual licenses start at $999 for a single developer
- Large package size reflecting the breadth of format support
- Overkill if you only need QR codes, you're paying for 80+ formats you won't use
- API design is verbose compared to purpose-built QR libraries
- Walled-garden ecosystem, integrates best with other Aspose products
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:
- Free Community License for qualifying individuals and small businesses
- Integrated UI control for Blazor, WPF, WinForms, Xamarin, and MAUI
- Supports QR Code, Data Matrix, Code 39, Code 128, EAN, UPC, and more
- Full color and dimension customization
- Part of a massive UI component suite (1,800+ controls)
Limitations:
- Generation only, no reading/scanning capability
- Tightly coupled to Syncfusion's UI framework, not a standalone library you call from a service layer
- Commercial license required beyond Community License thresholds
- Overkill if you only need a QR code generator and not a full UI suite
- Less flexible than code-first libraries for backend/API scenarios
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:
- Both generation and reading
- Logo embedding in QR codes
- Integrates with Spire.PDF for embedding QR codes directly in documents
- Error correction level and module size control
Limitations:
- Relies on System.Drawing, limited cross-platform support
- Commercial license required (starts around $599)
- Smaller community and fewer tutorials compared to alternatives
- API uses older patterns (System.Drawing.Image) rather than modern abstractions
- Limited NuGet adoption (~450K downloads)
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:
- Both generation and reading across 50+ barcode formats
- Styled QR code generation with CreateQrCodeWithLogo()
- Automatic image preprocessing: rotation correction, noise handling, distortion compensation
- Cross-platform: Windows, macOS, Linux
- Can read barcodes directly from PDF documents
- Micro QR and RMQR support via recent updates
Limitations:
- Commercial license ($749+ per developer)
- QR reading uses traditional image processing rather than IronQR's ML model, less accurate on severely damaged codes
- Broader scope means QR-specific features are less deep than IronQR
- If you only need QR codes, IronQR is the more focused (and lighter) choice from the same vendor
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:
- Industry-leading reading speed for real-time scanning applications
- Handles complex scenarios: multiple barcodes per image, DPM (Direct Part Marking), low-quality scans
- Webcam and mobile camera integration SDKs
- Supports .NET, JavaScript, Python, Java, C++, and mobile platforms
- Advanced algorithms for damaged, blurred, and perspective-distorted codes
Limitations:
- Reading only, does not generate QR codes
- Annual subscription licensing ($1,249+/year), no perpetual option
- Most expensive option on this list for QR-only use cases
- .NET SDK is less prominent than their JavaScript and mobile offerings
- Overkill for simple "scan a clean QR code from a PNG" scenarios
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:
- Apache 2.0 license, free for commercial use
- 4.5M+ NuGet downloads, well-established
- Simple API for 1D barcode generation
- Lightweight footprint
Limitations:
- QR code support is basic and derived from ZXing.Net internals
- Relies on System.Drawing, Windows-centric
- No QR reading capability
- No QR-specific customization (logos, colors, module shapes)
- Not the right tool if QR codes are your primary need
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.
Pattern 1: URL QR Codes (Marketing, Product Links)
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:
- Free generation only: QRCoder (maximum community support, payload generators) or Net.Codecrete.QrCodeGenerator (maximum portability, zero dependencies)
- Free generation + reading: ZXing.Net (battle-tested, broad format support)
- Commercial generation + ML reading: IronQR (best accuracy on imperfect images, cross-platform)
- Enterprise multi-format: Aspose.BarCode (80+ formats, enterprise ecosystem)
- Maximum generation performance: SkiaSharp.QrCode (NativeAOT, zero-allocation architecture)
- Industrial scanning: Dynamsoft Barcode Reader (purpose-built for high-throughput, real-time decoding)
- Already in a vendor ecosystem: Use what your suite provides (Syncfusion, Aspose, Iron Software, eIceBlue)
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.