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. 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. 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: IronQR using IronQr; using IronSoftware.Drawing; QrCode qr = QrWriter.Write("https://example.com"); AnyBitmap bitmap = qr.Save(); bitmap.SaveAs("myqr.png"); 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. read 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 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 Library Generate Read Logo/Styling Micro QR Cross-Platform License NuGet Downloads Library Library Library Generate Generate Generate Read Read Read Logo/Styling Logo/Styling Logo/Styling Micro QR Micro QR Micro QR Cross-Platform Cross-Platform Cross-Platform License License License NuGet Downloads NuGet Downloads NuGet Downloads IronQR ✅ ✅ ML-powered ✅ Full ✅ + RMQR ✅ Win/Mac/Linux/Mobile Commercial ($749+) ~56K IronQR IronQR IronQR IronQR ✅ ✅ ✅ ML-powered ✅ ML-powered ✅ Full ✅ Full ✅ + RMQR ✅ + RMQR ✅ Win/Mac/Linux/Mobile ✅ Win/Mac/Linux/Mobile Commercial ($749+) Commercial ($749+) ~56K ~56K QRCoder ✅ ❌ ✅ Moderate ✅ ⚠️ Partial (System.Drawing) MIT (Free) ~68M QRCoder QRCoder QRCoder QRCoder ✅ ✅ ❌ ❌ ✅ Moderate ✅ Moderate ✅ ✅ ⚠️ Partial (System.Drawing) ⚠️ Partial (System.Drawing) MIT (Free) MIT (Free) ~68M ~68M ZXing.Net ✅ ✅ ❌ Minimal ❌ ⚠️ Via bindings Apache 2.0 (Free) ~32M ZXing.Net ZXing.Net ZXing.Net ZXing.Net ✅ ✅ ✅ ✅ ❌ Minimal ❌ Minimal ❌ ❌ ⚠️ Via bindings ⚠️ Via bindings Apache 2.0 (Free) Apache 2.0 (Free) ~32M ~32M Net.Codecrete.QrCodeGenerator ✅ ❌ ❌ ❌ ✅ MIT (Free) ~4.1M Net.Codecrete.QrCodeGenerator Net.Codecrete.QrCodeGenerator Net.Codecrete.QrCodeGenerator ✅ ✅ ❌ ❌ ❌ ❌ ❌ ❌ ✅ ✅ MIT (Free) MIT (Free) ~4.1M ~4.1M SkiaSharp.QrCode ✅ ❌ ✅ Custom shapes ❌ ✅ MIT (Free) ~1.2M SkiaSharp.QrCode SkiaSharp.QrCode SkiaSharp.QrCode ✅ ✅ ❌ ❌ ✅ Custom shapes ✅ Custom shapes ❌ ❌ ✅ ✅ MIT (Free) MIT (Free) ~1.2M ~1.2M Aspose.BarCode ✅ ✅ ✅ ✅ ✅ Commercial ($999+) ~5.4M Aspose.BarCode Aspose.BarCode Aspose.BarCode ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Commercial ($999+) Commercial ($999+) ~5.4M ~5.4M Syncfusion Barcode ✅ ❌ ✅ Moderate ❌ ✅ (UI control) Commercial (Free community) ~2M+ Syncfusion Barcode Syncfusion Barcode Syncfusion Barcode ✅ ✅ ❌ ❌ ✅ Moderate ✅ Moderate ❌ ❌ ✅ (UI control) ✅ (UI control) Commercial (Free community) Commercial (Free community) ~2M+ ~2M+ Spire.Barcode ✅ ✅ ✅ Logo embed ❌ ⚠️ (System.Drawing) Commercial ($599+) ~450K Spire.Barcode Spire.Barcode Spire.Barcode Spire.Barcode ✅ ✅ ✅ ✅ ✅ Logo embed ✅ Logo embed ❌ ❌ ⚠️ (System.Drawing) ⚠️ (System.Drawing) Commercial ($599+) Commercial ($599+) ~450K ~450K IronBarcode ✅ ✅ ✅ ✅ Micro QR ✅ Win/Mac/Linux Commercial ($749+) ~1.2M IronBarcode IronBarcode IronBarcode IronBarcode ✅ ✅ ✅ ✅ ✅ ✅ ✅ Micro QR ✅ Micro QR ✅ Win/Mac/Linux ✅ Win/Mac/Linux Commercial ($749+) Commercial ($749+) ~1.2M ~1.2M Dynamsoft Barcode Reader ❌ ✅ High-perf N/A ✅ ✅ Commercial ($1,249+/yr) ~250K Dynamsoft Barcode Reader Dynamsoft Barcode Reader Dynamsoft Barcode Reader ❌ ❌ ✅ High-perf ✅ High-perf N/A N/A ✅ ✅ ✅ ✅ Commercial ($1,249+/yr) Commercial ($1,249+/yr) ~250K ~250K BarcodeLib ✅ ❌ ❌ ❌ ⚠️ (System.Drawing) Apache 2.0 (Free) ~4.5M BarcodeLib BarcodeLib BarcodeLib BarcodeLib ✅ ✅ ❌ ❌ ❌ ❌ ❌ ❌ ⚠️ (System.Drawing) ⚠️ (System.Drawing) Apache 2.0 (Free) Apache 2.0 (Free) ~4.5M ~4.5M Table 1: Master comparison of 11 .NET QR code libraries across key selection criteria. Download counts are approximate as of early 2026. 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 QR Generation — Can it create QR codes from strings, URLs, and structured data (vCards, Wi-Fi credentials)? QR Generation QR Reading — Can it decode QR codes from images, scans, or PDFs? How does it handle damaged or rotated codes? QR Reading Customization — Logo embedding, color control, module shape styling, error correction configuration Customization QR Format Support — Standard QR, Micro QR, RMQR (Rectangular Micro QR) QR Format Support Cross-Platform — Does it run cleanly on Windows, Linux, macOS, and inside Docker containers without System.Drawing hacks? Cross-Platform Licensing & Cost — Open-source vs. commercial, per-developer pricing, suite discounts Licensing & Cost Documentation & Ecosystem — API reference quality, tutorial availability, community size, active maintenance Documentation & Ecosystem All code examples target .NET 8 (LTS) and use top-level statements. Where .NET 10 introduces relevant improvements, we note them. .NET 8 (LTS) 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 generate QR codes for free with zero dependencies." QRCoder Net.Codecrete.QrCodeGenerator "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 need to both generate AND read QR codes." IronQR ZXing.Net Aspose.BarCode "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. "I'm deploying to Linux/Docker and can't use System.Drawing." IronQR SkiaSharp.QrCode Net.Codecrete.QrCodeGenerator "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. "Performance and memory footprint are critical." SkiaSharp.QrCode Dynamsoft Barcode Reader "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 already use an Aspose/Syncfusion/Iron Software suite." "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. "I'm building a Blazor/MAUI mobile app with QR scanning." IronQR built a QR-based digital business card app 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. ONNX 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: 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"); 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: 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}"); 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: 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 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: 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 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) NuGet download count 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. Best for: Jeff Fritz QR business card case study 2. QRCoder — The Most Popular Open-Source QR Generator QRCoder 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). over 68 million downloads maintained by Shane32 generation 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); 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: 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 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: 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) Generation only, cannot read or decode QR code image files Generation only 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. Best for: 3. ZXing.Net — The Swiss Army Knife of Barcode Libraries ZXing.Net 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. ZXing.Net .NET port 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) 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: 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 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 32M+ NuGet downloads Bindings available for SkiaSharp, ImageSharp, OpenCV, and more Limitations: 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) 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. Best for: 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). .NET translation of Project Nayuki's Java QR code generator 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); 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. ~4.1 million NuGet downloads Strengths: 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) 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: 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 Generation only, no QR reading capability Generation only 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. Best for: 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. guitarrapc 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(); 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: 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 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: 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 Generation only, no QR reading Generation only 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. Best for: 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. Aspose.BarCode for .NET 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}"); 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: 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 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: Limitations: Expensive, perpetual licenses start at $999 for a single developer Expensive 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 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. Best for: 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. Community License Strengths: 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) 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: 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 Generation only, no reading/scanning capability Generation only 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. Best for: 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). Spire.Barcode for .NET 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); 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: 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 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: 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) 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. Best for: 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}"); 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: 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 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: 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 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. Best for: 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. Dynamsoft Barcode Reader reading Strengths: 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 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: 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 Reading only, does not generate QR codes Reading only 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. Best for: 11. BarcodeLib — Minimalist Barcode Generation BarcodeLib 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). open-source barcode generation library Strengths: Strengths: Apache 2.0 license, free for commercial use 4.5M+ NuGet downloads, well-established Simple API for 1D barcode generation Lightweight footprint Apache 2.0 license, free for commercial use 4.5M+ NuGet downloads, well-established Simple API for 1D barcode generation Lightweight footprint Limitations: 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 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. Best for: 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): 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"); 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 Output QRCoder (minimal, zero-cost): 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)); 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 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): 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)); 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 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): SkiaSharp.QrCode (manual payload): using SkiaSharp.QrCode.Image; string wifiString = "WIFI:T:WPA;S:GuestNetwork;P:Welcome2026!;;"; QRCodeImageBuilder.SavePng(wifiString, "wifi-qr.png"); using SkiaSharp.QrCode.Image; string wifiString = "WIFI:T:WPA;S:GuestNetwork;P:Welcome2026!;;"; QRCodeImageBuilder.SavePng(wifiString, "wifi-qr.png"); Output 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. Microsoft MVP Jeff Fritz built using IronQR and Blazor QRCoder (with payload generator): 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)); 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 Output IronQR (manual vCard string with styling): 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"); 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 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): 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}"); 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 Output ZXing.Net (traditional image processing): 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"); 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 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): 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); } 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 Output IronQR (with async for server workloads): 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"); } 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 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): 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"); 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 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 ❌ ❌ ❌ ❌ 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 ❌ ❌ ❌ ❌ Feature IronQR QRCoder ZXing.Net Codecrete SkiaSharp.QrCode Aspose Syncfusion Spire IronBarcode Dynamsoft BarcodeLib Feature Feature Feature IronQR IronQR IronQR QRCoder QRCoder QRCoder ZXing.Net ZXing.Net ZXing.Net Codecrete Codecrete Codecrete SkiaSharp.QrCode SkiaSharp.QrCode SkiaSharp.QrCode Aspose Aspose Aspose Syncfusion Syncfusion Syncfusion Spire Spire Spire IronBarcode IronBarcode IronBarcode Dynamsoft Dynamsoft Dynamsoft BarcodeLib BarcodeLib BarcodeLib Standard QR ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Read ✅ Basic Standard QR Standard QR Standard QR ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Read ✅ Read ✅ Basic ✅ Basic Micro QR ✅ ✅ ❌ ❌ ❌ ✅ ❌ ❌ ✅ ✅ Read ❌ Micro QR Micro QR Micro QR ✅ ✅ ✅ ✅ ❌ ❌ ❌ ❌ ❌ ❌ ✅ ✅ ❌ ❌ ❌ ❌ ✅ ✅ ✅ Read ✅ Read ❌ ❌ RMQR ✅ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ✅ ❌ ❌ RMQR RMQR RMQR ✅ ✅ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ✅ ✅ ❌ ❌ ❌ ❌ Logo embedding ✅ ⚠️ Manual ❌ ❌ ⚠️ Canvas ❌ ❌ ✅ ✅ N/A ❌ Logo embedding Logo embedding Logo embedding ✅ ✅ ⚠️ Manual ⚠️ Manual ❌ ❌ ❌ ❌ ⚠️ Canvas ⚠️ Canvas ❌ ❌ ❌ ❌ ✅ ✅ ✅ ✅ N/A N/A ❌ ❌ Color control ✅ ✅ ❌ ❌ ✅ ✅ ✅ ✅ ✅ N/A ❌ Color control Color control Color control ✅ ✅ ✅ ✅ ❌ ❌ ❌ ❌ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ N/A N/A ❌ ❌ Module shapes ✅ Rounded ❌ ❌ ❌ ✅ Circle/Round ❌ ❌ ❌ ❌ N/A ❌ Module shapes Module shapes Module shapes ✅ Rounded ✅ Rounded ❌ ❌ ❌ ❌ ❌ ❌ ✅ Circle/Round ✅ Circle/Round ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ N/A N/A ❌ ❌ SVG output ❌ ✅ ❌ ✅ ❌ ✅ ✅ ❌ ❌ N/A ❌ SVG output SVG output SVG output ❌ ❌ ✅ ✅ ❌ ❌ ✅ ✅ ❌ ❌ ✅ ✅ ✅ ✅ ❌ ❌ ❌ ❌ N/A N/A ❌ ❌ PDF embedding ✅ ❌ ❌ ❌ ❌ ✅ ❌ ✅ ✅ N/A ❌ PDF embedding PDF embedding PDF embedding ✅ ✅ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ✅ ✅ ❌ ❌ ✅ ✅ ✅ ✅ N/A N/A ❌ ❌ Structured data ❌ ✅ WiFi/vCard ❌ ❌ ❌ ❌ ❌ ❌ ❌ N/A ❌ Structured data Structured data Structured data ❌ ❌ ✅ WiFi/vCard ✅ WiFi/vCard ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ N/A N/A ❌ ❌ ML-powered read ✅ N/A ❌ N/A N/A ❌ N/A ❌ ❌ ❌ N/A ML-powered read ML-powered read ML-powered read ✅ ✅ N/A N/A ❌ ❌ N/A N/A N/A N/A ❌ ❌ N/A N/A ❌ ❌ ❌ ❌ ❌ ❌ N/A N/A Async support ✅ ❌ ❌ ❌ ❌ ❌ N/A ❌ ❌ ✅ ❌ Async support Async support Async support ✅ ✅ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ N/A N/A ❌ ❌ ❌ ❌ ✅ ✅ ❌ ❌ NativeAOT ❌ ❌ ❌ ❌ ✅ ❌ N/A ❌ ❌ ❌ ❌ NativeAOT NativeAOT NativeAOT ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ✅ ✅ ❌ ❌ N/A 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). 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. System.Drawing.Common throws PlatformNotSupportedException 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 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 Library System.Drawing Dependency Cross-Platform Status Library Library Library System.Drawing Dependency System.Drawing Dependency System.Drawing Dependency Cross-Platform Status Cross-Platform Status Cross-Platform Status QRCoder Some renderers (use PngByteQRCode to avoid) ⚠️ Mixed — depends on renderer choice QRCoder QRCoder Some renderers (use PngByteQRCode to avoid) Some renderers (use PngByteQRCode to avoid) ⚠️ Mixed — depends on renderer choice ⚠️ Mixed — depends on renderer choice ZXing.Net Core is clean; bindings may depend on it ⚠️ Mixed — depends on binding package ZXing.Net ZXing.Net Core is clean; bindings may depend on it Core is clean; bindings may depend on it ⚠️ Mixed — depends on binding package ⚠️ Mixed — depends on binding package BarcodeLib Direct dependency ❌ Windows-focused BarcodeLib BarcodeLib Direct dependency Direct dependency ❌ Windows-focused ❌ Windows-focused Spire.Barcode Direct dependency ❌ Windows-focused Spire.Barcode Spire.Barcode Direct dependency Direct dependency ❌ Windows-focused ❌ Windows-focused IronQR No dependency (uses IronSoftware.Drawing) ✅ Cross-platform IronQR IronQR No dependency (uses IronSoftware.Drawing) No dependency (uses IronSoftware.Drawing) ✅ Cross-platform ✅ Cross-platform SkiaSharp.QrCode No dependency (uses SkiaSharp) ✅ Cross-platform SkiaSharp.QrCode SkiaSharp.QrCode No dependency (uses SkiaSharp) No dependency (uses SkiaSharp) ✅ Cross-platform ✅ Cross-platform Net.Codecrete.QrCodeGenerator No dependency ✅ Cross-platform Net.Codecrete.QrCodeGenerator Net.Codecrete.QrCodeGenerator No dependency No dependency ✅ Cross-platform ✅ Cross-platform Aspose.BarCode Conditional dependency ✅ Generally cross-platform Aspose.BarCode Aspose.BarCode Conditional dependency Conditional dependency ✅ Generally cross-platform ✅ Generally cross-platform Table 3: System.Drawing dependency status. Libraries marked ❌ will require workarounds or may not work reliably in Linux/Docker deployments. 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"] 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 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 Library License Cost Free Tier What You Get Library Library Library License License License Cost Cost Cost Free Tier Free Tier Free Tier What You Get What You Get What You Get QRCoder MIT Free Full Generation only, community support QRCoder QRCoder QRCoder MIT MIT Free Free Full Full Generation only, community support Generation only, community support ZXing.Net Apache 2.0 Free Full Generation + reading, community support ZXing.Net ZXing.Net ZXing.Net Apache 2.0 Apache 2.0 Free Free Full Full Generation + reading, community support Generation + reading, community support Net.Codecrete.QrCodeGenerator MIT Free Full Generation only, community support Net.Codecrete.QrCodeGenerator Net.Codecrete.QrCodeGenerator Net.Codecrete.QrCodeGenerator MIT MIT Free Free Full Full Generation only, community support Generation only, community support SkiaSharp.QrCode MIT Free Full Generation only, community support SkiaSharp.QrCode SkiaSharp.QrCode SkiaSharp.QrCode MIT MIT Free Free Full Full Generation only, community support Generation only, community support BarcodeLib Apache 2.0 Free Full Basic generation, community support BarcodeLib BarcodeLib BarcodeLib Apache 2.0 Apache 2.0 Free Free Full Full Basic generation, community support Basic generation, community support Syncfusion Barcode Commercial Paid (suite) Community License (< $1M revenue, ≤ 5 devs) UI control, generation only Syncfusion Barcode Syncfusion Barcode Syncfusion Barcode Commercial Commercial Paid (suite) Paid (suite) Community License (< $1M revenue, ≤ 5 devs) Community License (< $1M revenue, ≤ 5 devs) UI control, generation only UI control, generation only Spire.Barcode Commercial ~$599+ Free limited edition Generation + reading Spire.Barcode Spire.Barcode Spire.Barcode Commercial Commercial ~$599+ ~$599+ Free limited edition Free limited edition Generation + reading Generation + reading IronQR Commercial $749+ per dev 30-day trial Generation + ML reading, email/chat support IronQR IronQR IronQR Commercial Commercial $749+ per dev $749+ per dev 30-day trial 30-day trial Generation + ML reading, email/chat support Generation + ML reading, email/chat support IronBarcode Commercial $749+ per dev 30-day trial 50+ formats, generation + reading, support IronBarcode IronBarcode IronBarcode Commercial Commercial $749+ per dev $749+ per dev 30-day trial 30-day trial 50+ formats, generation + reading, support 50+ formats, generation + reading, support Aspose.BarCode Commercial $999+ per dev Eval (watermarked) 80+ formats, generation + reading, support Aspose.BarCode Aspose.BarCode Aspose.BarCode Commercial Commercial $999+ per dev $999+ per dev Eval (watermarked) Eval (watermarked) 80+ formats, generation + reading, support 80+ formats, generation + reading, support Dynamsoft Commercial $1,249+/year 30-day trial High-perf reading only, SDK support Dynamsoft Dynamsoft Dynamsoft Commercial Commercial $1,249+/year $1,249+/year 30-day trial 30-day trial High-perf reading only, SDK support 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. 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 ✅ ✅ 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 ✅ ✅ Library .NET 8 (LTS) .NET 9 .NET 10 .NET Framework 4.x .NET Standard 2.0 Library Library Library .NET 8 (LTS) .NET 8 (LTS) .NET 8 (LTS) .NET 9 .NET 9 .NET 9 .NET 10 .NET 10 .NET 10 .NET Framework 4.x .NET Framework 4.x .NET Framework 4.x .NET Standard 2.0 .NET Standard 2.0 .NET Standard 2.0 IronQR ✅ ✅ ✅ ✅ 4.6.2+ ✅ IronQR IronQR ✅ ✅ ✅ ✅ ✅ ✅ ✅ 4.6.2+ ✅ 4.6.2+ ✅ ✅ QRCoder ✅ ✅ ✅ ✅ 3.5+ ✅ QRCoder QRCoder ✅ ✅ ✅ ✅ ✅ ✅ ✅ 3.5+ ✅ 3.5+ ✅ ✅ ZXing.Net ✅ ✅ ✅ ✅ 2.0+ ✅ ZXing.Net ZXing.Net ✅ ✅ ✅ ✅ ✅ ✅ ✅ 2.0+ ✅ 2.0+ ✅ ✅ Net.Codecrete.QrCodeGenerator ✅ ✅ ✅ ✅ via Standard ✅ Net.Codecrete.QrCodeGenerator Net.Codecrete.QrCodeGenerator ✅ ✅ ✅ ✅ ✅ ✅ ✅ via Standard ✅ via Standard ✅ ✅ SkiaSharp.QrCode ✅ ✅ ✅ ❌ ✅ SkiaSharp.QrCode SkiaSharp.QrCode ✅ ✅ ✅ ✅ ✅ ✅ ❌ ❌ ✅ ✅ Aspose.BarCode ✅ ✅ ✅ ✅ ✅ Aspose.BarCode Aspose.BarCode ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Syncfusion Barcode ✅ ✅ ✅ ✅ ✅ Syncfusion Barcode Syncfusion Barcode ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ Spire.Barcode ✅ ✅ ⚠️ Verify ✅ ✅ Spire.Barcode Spire.Barcode ✅ ✅ ✅ ✅ ⚠️ Verify ⚠️ Verify ✅ ✅ ✅ ✅ IronBarcode ✅ ✅ ✅ ✅ 4.6.2+ ✅ IronBarcode IronBarcode ✅ ✅ ✅ ✅ ✅ ✅ ✅ 4.6.2+ ✅ 4.6.2+ ✅ ✅ Dynamsoft ✅ ✅ ⚠️ Verify ✅ ✅ Dynamsoft Dynamsoft ✅ ✅ ✅ ✅ ⚠️ Verify ⚠️ Verify ✅ ✅ ✅ ✅ BarcodeLib ✅ ✅ ⚠️ Verify ✅ ✅ BarcodeLib BarcodeLib ✅ ✅ ✅ ✅ ⚠️ Verify ⚠️ Verify ✅ ✅ ✅ ✅ Table 5: .NET version compatibility. ⚠️ Verify means the library likely works but we haven't confirmed explicit .NET 10 testing from the vendor. 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: type 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. ASP.NET Core Web APIs (generating QR codes as a service): 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. Blazor / MAUI mobile apps (scanning and generating): 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. WPF / WinForms desktop apps: Console tools / CI pipelines: Lightweight matters. Net.Codecrete.QrCodeGenerator or QRCoder with PngByteQRCode, minimal dependencies, fast startup, no native assets to manage. Console tools / CI pipelines: 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. Enterprise document workflows (invoices, compliance): 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 QRCoder to IronQR: 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 ZXing.Net to IronQR: 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. From System.Drawing to cross-platform alternatives: 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. General advice: 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. What is the best QR code library for C#? 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. How do I add a logo to a QR code in C#? 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. Can I read QR codes from PDF files in .NET? 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. Which library works best in Docker/Linux containers? 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. Is QRCoder still actively maintained? 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. What error correction level should I use? L M Q H 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. How do I generate QR codes for Micro QR or RMQR formats? ISO/IEC 23941:2022 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. Can I use multiple QR libraries in the same project? 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. What's the maximum data a QR code can hold? 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) Free generation only: QRCoder (maximum community support, payload generators) or Net.Codecrete.QrCodeGenerator (maximum portability, zero dependencies) Free generation only: Free generation + reading: ZXing.Net (battle-tested, broad format support) Free generation + reading: ZXing.Net Commercial generation + ML reading: IronQR (best accuracy on imperfect images, cross-platform) Commercial generation + ML reading: Enterprise multi-format: Aspose.BarCode (80+ formats, enterprise ecosystem) Enterprise multi-format: Maximum generation performance: SkiaSharp.QrCode (NativeAOT, zero-allocation architecture) Maximum generation performance: Industrial scanning: Dynamsoft Barcode Reader (purpose-built for high-throughput, real-time decoding) Industrial scanning: Already in a vendor ecosystem: Use what your suite provides (Syncfusion, Aspose, Iron Software, eIceBlue) Already in a vendor ecosystem: 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. official documentation 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.