Wie man Async und Multithread in Barcodes mit C# verwendet
Migrieren von QR-Code zu IronBarcode
Dieser Leitfaden richtet sich an Entwicklungsteams, deren Projekte mit QR-Code begonnen haben und mittlerweile über die QR-Code-Generierung hinausgehende Funktionen erfordern. QR-Code ist eine gut gepflegte, qualitativ hochwertige Bibliothek für ihren vorgesehenen Anwendungsbereich, und eine Migration spiegelt nicht ihre Qualität wider. Es handelt sich um eine Antwort auf Anforderungen – Formaterweiterung, Barcode-Lesung, PDF-Integration –, die nicht dem entsprechen, wofür QR-Code ursprünglich konzipiert wurde. Dieser Leitfaden beschreibt den kompletten technischen Weg von QR-Code zu IronBarcode: Paketaustausch, Namensraumänderungen, Codeübersetzung für jedes gängige Muster, eine Zuordnung der API-Äquivalenzen und Lösungen für die Probleme, die während des Übergangs auftreten.
Warum von QR-Code migrieren?
Formatanforderungen jenseits von QR: QR-Code generiert ausschließlich QR-Codes. Projekte, die sich auf das Erfordernis von Code 128 Labels für die Logistik, EAN-13 Codes für die Produktidentifikation im Einzelhandel, DataMatrixfür die pharmazeutische Serialisierung oder PDF417für die Konformität von Regierungsdokumenten ausweiten, müssen für jedes zusätzliche Format eine separate Bibliothek einführen. Mit der zunehmenden Anzahl der benötigten Formate steigt auch die Anzahl der unabhängigen Pakete, APIs und Wartungsverpflichtungen.
Anforderungen an das Barcode-Lesen: QR-Code verfügt über keine Barcode-Lese-API – es handelt sich von Grund auf um eine reine Generierungsbibliothek. Jede Anwendung, die QR-Codes aus eingehenden Bildern dekodieren, Barcodes auf gescannten Dokumenten überprüfen oder Versandetiketten verarbeiten muss, muss neben QR-Code eine dedizierte Lesebibliothek hinzufügen. Diese zweite Bibliothek bringt ihre eigene API-Oberfläche, ihren eigenen Aktualisierungszyklus und ihre eigenen Kompatibilitätsprobleme bei jedem .NET Upgrade mit sich.
Multi-Bibliotheks-Wartung: Das realistische Akkumulationsmuster für ein QRCoder-basiertes Projekt verläuft von QR-Code zur QR-Code-Generierung über eine 1D-Barcode-Bibliothek für Versandetiketten bis hin zu einer Lesebibliothek zum Dekodieren. Die Verwaltung von drei oder vier unabhängigen Paketen bedeutet, separate Versionshinweise zu verfolgen, Versionskonflikte zu lösen, wenn eines der Pakete aktualisiert wird, und die Vertrautheit mit mehreren APIs innerhalb eines Entwicklungsteams aufrechtzuerhalten. Der Wartungsaufwand summiert sich im Laufe der Zeit auf eine Weise, die in der anfänglichen Integrationsschätzung nicht erkennbar ist.
PDF-Unterstützung: Das Einbetten von Barcodes in PDF-Dokumente oder das Extrahieren von Barcodes aus eingehenden PDF-Dateien fällt nicht in den Funktionsumfang von QRCoder. Dokumentenverarbeitungsprozesse – Rechnungsbearbeitung, Etikettenerstellung aus PDF-Vorlagen, Compliance-Berichterstattung – stoßen früh an diese Grenze. Es muss eine dedizierte PDF-Bibliothek zusammen mit QR-Code hinzugefügt werden, oder die Architektur muss die Barcode-Generierung und die PDF-Generierung über separate Subsysteme leiten.
Das grundsätzliche Problem
QRCoder löst das Problem der QR-Generierung auf effiziente Weise. Sobald eine Anforderung die QR-Kriterien überschreitet, muss die Codebasis zusätzliche Pakete einbinden, um jede Lücke zu füllen:
// QR-Code handles QR generation well — but no further
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));
// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
// QR-Code handles QR generation well — but no further
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));
// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrCodeData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10))
' Now the shipping team asks for Code 128 — add NetBarcode
' Now the warehouse needs to scan barcodes — add ZXing.Net
' Now a report needs a barcode in a PDF — add a PDF library
' Each addition: new namespace, new API, new maintenance cycle
IronBarcode vereint Generierung, Lesen und PDF-Integration unter einer einzigen API:
// IronBarcode — one library covers all of the above
using IronBarCode;
// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
// IronBarcode — one library covers all of the above
using IronBarCode;
// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
Imports IronBarCode
' Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
' Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
' Read a barcode from an image — built in
Dim results = BarcodeReader.Read("incoming.png")
IronBarcode vs. QRCoder: Funktionsvergleich
| Feature | QR-Code | IronBarcode |
|---|---|---|
| QR-Code-Generierung | Ja – ausgezeichnet. | Ja |
| Mikro-QR | Ja | Nein |
| Code 128 / Code 39 | Nein | Ja |
| EAN-13 / UPC-A | Nein | Ja |
| DataMatrix | Nein | Ja |
| PDF417 | Nein | Ja |
| aztekisch | Nein | Ja |
| Gesamtformate | 1 | 50+ |
| Barcode-Lesung | Nein | Ja – automatische Erkennung |
| PDF-Barcode-Extraktion | Nein | Ja |
| PDF-Barcode-Stempeln | Nein | Ja |
| Logoeinbettung | Ja | Ja |
| Farbanpassung | Ja | Ja |
| SVG-Ausgabe | Ja | Ja |
| PayloadGenerator-Helfer | Ja | Nein – manuelle Saitenkonstruktion |
| Keine externen Abhängigkeiten | Ja | In sich geschlossen |
| Lizenz | MIT — uneingeschränkt | Kommerziell — Lite-Lizenz deckt einen einzelnen Entwickler ab |
Schnellstart: Migration von QR-Code zu IronBarcode
Schritt 1: Ersetzen des NuGet-Pakets
QRCoder aus dem Projekt entfernen:
dotnet remove package QRCoder
dotnet remove package QRCoder
IronBarcode installieren:
dotnet add package IronBarcode
dotnet add package IronBarcode
Falls im Projekt ZXing .NET zusammen mit QR-Code zum Einlesen von Barcodes verwendet wurde, kann dieses Paket ebenfalls in diesem Stadium entfernt werden:
dotnet remove package ZXing.Net
dotnet remove package ZXing.Net
Schritt 2: Namespaces aktualisieren
Ersetzen Sie den Import des QRCoder-Namensraums durch den IronBarcode Namensraum:
// Before (QRCoder)
using QRCoder;
// After (IronBarcode)
using IronBarCode;
// Before (QRCoder)
using QRCoder;
// After (IronBarcode)
using IronBarCode;
' Before (QRCoder)
Imports QRCoder
' After (IronBarcode)
Imports IronBarCode
Schritt 3: Lizenz initialisieren
Lizenzinitialisierung beim Anwendungsstart hinzufügen — Program.cs, Startup.cs oder ein statischer Konstruktor:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Ein kostenloser Testschlüssel ist ohne Registrierung erhältlich. Für den Einsatz in Produktionsumgebungen ist eine erworbene Lizenz erforderlich.
Beispiele für die Code-Migration
Grundlegende QR-Code-Generierung
Das häufigste QRCoder-Muster erfordert drei Objekte: eine QRCodeGenerator-Instanz, ein QRCodeData-Zwischenobjekt und eine Renderer-Klasse wie PngByteQRCode. In IronBarcode wird diese Kette durch einen einzigen statischen Aufruf ersetzt.
QRCoder-Ansatz:
using QRCoder;
public class BarcodeService
{
private readonly QRCodeGenerator _generator = new QRCodeGenerator();
public byte[] GenerateQR(string content)
{
var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
return qrCode.GetGraphic(10); // 10px per module
}
}
using QRCoder;
public class BarcodeService
{
private readonly QRCodeGenerator _generator = new QRCodeGenerator();
public byte[] GenerateQR(string content)
{
var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
return qrCode.GetGraphic(10); // 10px per module
}
}
Imports QRCoder
Public Class BarcodeService
Private ReadOnly _generator As New QRCodeGenerator()
Public Function GenerateQR(content As String) As Byte()
Dim qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrCodeData)
Return qrCode.GetGraphic(10) ' 10px per module
End Function
End Class
IronBarcode -Ansatz:
using IronBarCode;
public class BarcodeService
{
public byte[] GenerateQR(string content)
{
return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
.ResizeTo(200, 200)
.ToPngBinaryData();
}
}
using IronBarCode;
public class BarcodeService
{
public byte[] GenerateQR(string content)
{
return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
.ResizeTo(200, 200)
.ToPngBinaryData();
}
}
Imports IronBarCode
Public Class BarcodeService
Public Function GenerateQR(content As String) As Byte()
Return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode) _
.ResizeTo(200, 200) _
.ToPngBinaryData()
End Function
End Class
BarcodeWriter ist eine statische Klasse — keine Instanz wird benötigt und es gibt kein Zwischenobjekt. Die ResizeTo(width, height)-Methode ersetzt die Pixel-pro-Modul-Ganzzahl, die QR-Code in GetGraphic akzeptiert. Wo QR-Code die Ausgabe durch die Anzahl der Module bestimmt (z.B. GetGraphic(10) für ein 10px pro Modul Bild), nimmt IronBarcode absolute Pixelmaße.
QR-Codes in Datei speichern
QRCoder trennt die Bytes im Arbeitsspeicher von der Dateiausgabe erst im letzten Schritt – die Rendererkette bleibt dabei gleich. IronBarcode verwendet auf derselben Kette unterschiedliche Terminalmethoden.
QRCoder-Ansatz:
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim pngBytes = New PngByteQRCode(qrCodeData).GetGraphic(10)
File.WriteAllBytes("output.png", pngBytes)
IronBarcode -Ansatz:
using IronBarCode;
// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("output.png");
// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.ToPngBinaryData();
using IronBarCode;
// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("output.png");
// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.ToPngBinaryData();
Imports IronBarCode
' Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.SaveAsPng("output.png")
' Or obtain bytes for in-memory use
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.ToPngBinaryData()
Die SaveAsPng-Methode ist ein Terminal, das direkt auf die Festplatte schreibt. ToPngBinaryData gibt ein byte[] zurück für Streaming, HTTP-Antworten oder Datenbankspeicherung.
SVG-Ausgabe
QRCoder-Ansatz:
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim svgContent As String = New SvgQRCode(qrCodeData).GetGraphic(10)
File.WriteAllText("output.svg", svgContent)
IronBarcode -Ansatz:
using IronBarCode;
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsImage("output.svg");
using IronBarCode;
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsImage("output.svg");
Imports IronBarCode
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsImage("output.svg")
Die SvgQRCode-Rendererklasse und ihr GetGraphic-Aufruf lassen sich zu einer einzigen SaveAsImage-Terminalmethode zusammenfassen (eine .svg-Erweiterung erzeugt SVG-Ausgabe).
Zuordnung der Fehlerkorrekturstufen
QRCoder erfordert eine explizite ECC-Auswahl bei jedem CreateQrCode-Aufruf mit dem QRCodeGenerator.ECCLevel-Enum. IronBarcode wendet einen sinnvollen Standardwert an, wenn BarcodeWriter.CreateBarcode verwendet wird, und bietet explizite Kontrolle über QRCodeWriter.QrErrorCorrectionLevel.
QRCoder-Ansatz:
using QRCoder;
var generator = new QRCodeGenerator();
// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
using QRCoder;
var generator = new QRCodeGenerator();
// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
Imports QRCoder
Dim generator As New QRCodeGenerator()
' Medium — suitable for most generation without logos
Dim dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
' High — required when a logo will occlude part of the code
Dim dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
IronBarcode -Ansatz:
using IronBarCode;
// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("default-ecc.png");
// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
using IronBarCode;
// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("default-ecc.png");
// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
Imports IronBarCode
' Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("default-ecc.png")
' Explicit level via QRCodeWriter
Dim qr = QRCodeWriter.CreateQrCode( _
"https://example.com", _
500, _
QRCodeWriter.QrErrorCorrectionLevel.Highest _
)
qr.SaveAsPng("high-ecc.png")
Die Zuordnung der Ebenen ist: ECCLevel.L → Low, ECCLevel.M → Medium, ECCLevel.Q → High, ECCLevel.H → Highest.
Logoeinbettung
Beide Bibliotheken unterstützen das Einbetten von Logos in QR-Codes. QR-Code leitet dies über die QRCode-Rendererklasse (nicht PngByteQRCode) mit System.Drawing.Bitmap-Parametern. IronBarcode bietet QRCodeWriter.CreateQrCodeWithLogo() als dedizierte Fabrikmethode, die Dateipfade für sowohl URL als auch Logo akzeptiert. Der Leitfaden zur Anpassung des QR-Code-Stils umfasst Optionen für Logogröße, Positionierung und Farbkombinationen.
QRCoder-Ansatz:
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;
var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;
var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
Imports QRCoder
Imports System.Drawing
Imports System.Drawing.Imaging
Dim generator As New QRCodeGenerator()
' ECCLevel.H is required — the logo occludes part of the code
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
Dim qrCode As New QRCode(qrCodeData)
Dim logoBitmap As New Bitmap("logo.png")
Dim qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap)
qrBitmap.Save("qr-logo.png", ImageFormat.Png)
IronBarcode -Ansatz:
using IronBarCode;
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
.SaveAsPng("qr-logo.png");
using IronBarCode;
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
.SaveAsPng("qr-logo.png");
Imports IronBarCode
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500) _
.SaveAsPng("qr-logo.png")
Die System.Drawing.Bitmap-Abhängigkeit wird entfernt — CreateQrCodeWithLogo akzeptiert Dateipfad-Strings für sowohl den Inhalt als auch das Logobild. Fehlerkorrektur wird automatisch auf das für die Logo-Einbettung erforderliche Niveau eingestellt; keine explizite ECC-Konfiguration erforderlich.
PayloadGenerator.WiFi-Migration
QRCoder's PayloadGenerator.WiFi formatiert den Standard-WiFi-QR-Payload-String. Das Ausgabeformat ist ein öffentlicher Standard (WIFI:T:{auth};S:{ssid};P:{password};;), der durch die QR-Code-Spezifikation definiert ist. Bei der Migration können diese Zeichenketten direkt erstellt werden.
QRCoder-Ansatz:
using QRCoder;
var wifi = new PayloadGenerator.WiFi(
ssid: "OfficeNetwork",
password: "SecurePass123",
authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
using QRCoder;
var wifi = new PayloadGenerator.WiFi(
ssid: "OfficeNetwork",
password: "SecurePass123",
authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
Imports QRCoder
Dim wifi = New PayloadGenerator.WiFi(
ssid:="OfficeNetwork",
password:="SecurePass123",
authenticationMode:=PayloadGenerator.WiFi.Authentication.WPA
)
' wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
Dim generator = New QRCodeGenerator()
Dim qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrData)
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10))
IronBarcode -Ansatz:
using IronBarCode;
// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("wifi.png");
using IronBarCode;
// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("wifi.png");
Imports IronBarCode
' Construct the standard WiFi QR string directly
Dim wifiPayload As String = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;"
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.SaveAsPng("wifi.png")
Für Teams mit vielen PayloadGenerator-Typen im Einsatz (vCard, CalendarEvent, Geo, SMS), ist der Ansatz der gleiche: Identifizieren Sie die formatierte Zeichenkette, die jeder Generator mit seiner .ToString()-Ausgabe produziert, und konstruieren Sie diese Zeichenkette direkt oder durch eine kleine statische Hilfsmethode.
QR-Code API zu IronBarcode Mapping-Referenz
| QR-Code | IronBarcode | Notizen |
|---|---|---|
new QRCodeGenerator() |
Statische Klasse – keine Instanz | BarcodeWriter erfordert keine Instanziierung |
qrGenerator.CreateQrCode(data, ECCLevel.M) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) |
Direkter Ersatz |
new PngByteQRCode(qrCodeData) |
Nicht erforderlich | Rendering ist Teil der Fluent-Kette |
qrCode.GetGraphic(20) gibt byte[] zurück |
.ToPngBinaryData() |
Größe über .ResizeTo(w, h) |
File.WriteAllBytes(path, bytes)-Muster |
.SaveAsPng(path) |
Terminalmethode auf GeneratedBarcode |
new SvgQRCode(qrCodeData).GetGraphic(10) |
.SaveAsImage(path) |
Passieren Sie eine .svg-Erweiterung für SVG-Ausgabe |
new QRCode(qrCodeData).GetGraphic(...) |
QRCodeWriter.CreateQrCode(data, size, level) |
Wird zur Logo- und Farbanpassung verwendet |
QRCodeGenerator.ECCLevel.L |
QRCodeWriter.QrErrorCorrectionLevel.Low |
|
QRCodeGenerator.ECCLevel.M |
QRCodeWriter.QrErrorCorrectionLevel.Medium |
Standardwert, wenn nicht anders angegeben |
QRCodeGenerator.ECCLevel.Q |
QRCodeWriter.QrErrorCorrectionLevel.High |
|
QRCodeGenerator.ECCLevel.H |
QRCodeWriter.QrErrorCorrectionLevel.Highest |
Erforderlich für die Logoeinbettung |
PayloadGenerator.WiFi(...).ToString() |
"WIFI:T:WPA;S:{ssid};P:{pass};;" |
Erstellen Sie direkt eine Standardzeichenkette. |
PayloadGenerator.ContactData(...).ToString() |
"BEGIN:VCARD\n..." |
vCard ist ein öffentlicher Standard |
| Keine Lese-API | BarcodeReader.Read(path) |
Neue Funktion – keine separate Bibliothek mehr nötig |
| Nur QR-Format | 50+ Formate über BarcodeEncoding.* |
Neue Fähigkeit |
Gängige Migrationsprobleme und Lösungen
Problem 1: Änderung des PayloadGenerator-Zeichenfolgenformats
QRCoder: PayloadGenerator.WiFi, PayloadGenerator.ContactData und andere Helfer erzeugen automatisch formatierte Zeichenketten. Der Code übergibt die .ToString()-Ausgabe des Helferobjekts an CreateQrCode.
Lösung: Identifizieren Sie die Zeichenkette, die jeder PayloadGenerator-Typ produziert — ihr Format ist in der QR-Code-Spezifikation dokumentiert und einfach zu reproduzieren. Für WiFi: WIFI:T:WPA;S:{ssid};P:{password};;. Für vCard: Standard BEGIN:VCARD / END:VCARD-Blöcke. Schreiben Sie statische Hilfsmethoden, wenn viele Aufrufstellen denselben Payload-Typ verwenden:
public static string WifiPayload(string ssid, string password, string auth = "WPA")
=> $"WIFI:T:{auth};S:{ssid};P:{password};;";
public static string WifiPayload(string ssid, string password, string auth = "WPA")
=> $"WIFI:T:{auth};S:{ssid};P:{password};;";
Public Shared Function WifiPayload(ssid As String, password As String, Optional auth As String = "WPA") As String
Return $"WIFI:T:{auth};S:{ssid};P:{password};;"
End Function
Problem 2: ECCLevel-Enum-Zuordnung
QRCoder: QRCodeGenerator.ECCLevel ist ein verschachteltes Enum mit Werten L, M, Q, H. Es ist ein erforderlicher Parameter bei jedem CreateQrCode-Aufruf.
Lösung: Ordnen Sie jeden Wert seinem QRCodeWriter.QrErrorCorrectionLevel-Äquivalent zu, wenn Sie den QRCodeWriter-Weg verwenden. Wenn BarcodeWriter.CreateBarcode verwendet wird, wird das ECC-Level automatisch auf Medium gesetzt und erfordert keinen Parameter. Aktualisieren Sie jeden Anrufstandort:
// QR-Code ECCLevel.H → IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
// QR-Code ECCLevel.M → IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
// QR-Code ECCLevel.H → IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
// QR-Code ECCLevel.M → IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
' QR-Code ECCLevel.H → IronBarcode QrErrorCorrectionLevel.Highest
Dim qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
' QR-Code ECCLevel.M → IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
Problem 3: Entfernung der Renderer-Klasse
QRCoder: Jedes Ausgabeformat erfordert eine eigene Instanzierung der Rendererklasse — PngByteQRCode, SvgQRCode, AsciiQRCode, Base64QRCode, QRCode. Diese Klassen akzeptieren QRCodeData und legen GetGraphic mit unterschiedlichen Rückgabetypen offen.
Lösung: Entfernen Sie alle Instanziierungen der Renderer-Klasse. IronBarcode integriert die Formatausgabe in die Terminalmethoden der Fluent-Kette. Ersetzen Sie new PngByteQRCode(data).GetGraphic(n) durch .ToPngBinaryData() nach .ResizeTo(). Ersetzen Sie new SvgQRCode(data).GetGraphic(n) durch .SaveAsImage(path) (mit einer .svg-Erweiterung). Das QRCodeData-Zwischenobjekt verschwindet ebenfalls — es wird in IronBarcode nicht benötigt.
Ausgabe 4: Entfernung von PngByteQRCode und modulbasierte Größenanpassung
QRCoder: PngByteQRCode.GetGraphic(int pixelsPerModule) bestimmt die Ausgabe durch die Anzahl der Pixel pro QR-Modul. Die resultierenden Bildabmessungen hängen von der Anzahl der Module ab, die mit der Inhaltslänge und dem ECC-Level variiert.
Lösung: Ersetzen Sie die modulbasierte Größenanpassung durch ResizeTo(int width, int height) für absolute Pixelmaße. Wenn Ihr Code die erwartete Ausgabegröße dynamisch anhand der Modulanzahl berechnet hat, wechseln Sie zu einer festen Zielgröße, die Ihren Ausgabeanforderungen entspricht:
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);
// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
.ResizeTo(400, 400)
.ToPngBinaryData();
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);
// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
.ResizeTo(400, 400)
.ToPngBinaryData();
Imports System
' Before: GetGraphic(20) — output size varies with content
Dim bytes = New PngByteQRCode(qrData).GetGraphic(20)
' After: fixed 400×400 regardless of content
Dim bytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
.ResizeTo(400, 400) _
.ToPngBinaryData()
QRCoder-Migrations-Checkliste
Vor der Migration anfallende Aufgaben
Prüfen Sie den Quellcode auf alle QRCoder-Verwendungen, bevor Sie Änderungen vornehmen:
# Find all QR-Code namespace imports
grep -r "using QRCoder" --include="*.cs" .
# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .
# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .
# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .
# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
# Find all QR-Code namespace imports
grep -r "using QRCoder" --include="*.cs" .
# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .
# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .
# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .
# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
- Dokumentieren Sie alle
PayloadGenerator-Typen im Einsatz und notieren Sie deren Zeichenkette-Ausgabeformate - Notieren Sie alle verwendeten ECC-Level-Werte und deren Aufrufstellen.
- Identifizieren Sie jeglichen ZXing .NET -Lesecode, der zum Dekodieren mit QR-Code gekoppelt war – dieser kann gleichzeitig ersetzt werden
- Besorgen Sie sich einen IronBarcode -Lizenzschlüssel (Testschlüssel sind ohne Registrierung erhältlich)
Aufgaben der Code-Aktualisierung
- Führen Sie
dotnet remove package QRCoderaus - Führen Sie
dotnet remove package ZXing.Netaus, wenn es nur zum Lesen zusammen mit QR-Code verwendet wurde - Führen Sie
dotnet add package IronBarcodeaus - Fügen Sie
IronBarCode.License.LicenseKey = "YOUR-KEY";zum Anwendungsstart hinzu - Ersetzen Sie alle
using QRCoder;-Importe durchusing IronBarCode; - Entfernen Sie alle
new QRCodeGenerator()-Instanzerklärungen —BarcodeWriterist statisch - Ersetzen Sie alle
generator.CreateQrCode(data, ECCLevel.X)+ Renderer-Chaining-Muster durchBarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)-Chaining - Ersetzen Sie
.GetGraphic(n)-Aufrufe durch.ToPngBinaryData()und fügen Sie.ResizeTo(w, h)vor dem Terminal hinzu - Ersetzen Sie
File.WriteAllBytes(path, bytes)-Speichermuster durch.SaveAsPng(path)-Terminalmethoden - Ersetzen Sie
new SvgQRCode(data).GetGraphic(n)durch.SaveAsImage(path)(mit einer.svg-Erweiterung) - Ersetzen Sie
PayloadGenerator.WiFi(...)und andere Helferinstanzen durch direkte Formatzeichenketten - Ordnen Sie jeden
QRCodeGenerator.ECCLevel-Wert seinemQRCodeWriter.QrErrorCorrectionLevel-Äquivalent zu - Ersetzen Sie alle ZXing.Net
BarcodeReaderGeneric.Decode(bitmap)-Aufrufe durchBarcodeReader.Read(path) - Für die Logoeinbettung ersetzen Sie
new QRCode(data).GetGraphic(n, ..., logoBitmap)durchQRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)
Post-Migrationstests
- Scannen Sie alle generierten QR-Codes mit mindestens zwei unabhängigen QR-Code-Scanner-Anwendungen, um die Lesbarkeit zu überprüfen.
- Verifizieren Sie, dass Logos eingebaute QR-Codes korrekt gescannt werden — bestätigen Sie, dass das Fehlerkorrektur-Level
Highestist - Vergleichen Sie die visuelle Ausgabe der generierten Codes mit Beispielen aus der Zeit vor der Migration, bei denen eine einheitliche Darstellung erforderlich ist.
- Testen Sie alle
PayloadGenerator-Ersetzungen — bestätigen Sie, dass WiFi-, vCard- und andere Payload-Zeichenketten auf Zielgeräten korrekt dekodiert werden - Falls ZXing.Net ebenfalls entfernt wurde, verifizieren Sie, dass alle Strichcode-Lesewege durch
BarcodeReader.Readfunktionieren - Führen Sie die Anwendung in einer sauberen Umgebung aus, um sicherzustellen, dass keine verbleibenden QRCoder- oder ZXing .NET -Referenzen Bindungsfehler verursachen.
- Überprüfen Sie, ob der IronBarcode -Lizenzschlüssel in Produktions- und Testumgebungen korrekt geladen wurde.
Wichtigste Vorteile der Migration zu IronBarcode
Einzelne API für alle Barcode-Operationen: Nach der Migration verwendet jede Barcode-Aufgabe — Generierung, Lesen, PDF-Stempeln — dasselbe IronBarCode-Namensraum und dieselben Einstiegspunkte. Entwickler, die dem Projekt beitreten, lernen nur eine API anstatt drei. Die Codeüberprüfung im gesamten Barcode-Subsystem wird einheitlich. Die Dokumentensuche ist zentralisiert.
Strichcode-Lesen ohne zweite Bibliothek: BarcodeReader.Read behandelt Bilddateien, PDF-Seiten, Streams und im Speicher befindliche Bitmaps mit automatischer Format-Erkennung. Die Lesefunktion, für die bisher ZXing .NET – mit seinen Formatvorgaben und Überlegungen zur Thread-Sicherheit – erforderlich war, ist nun sofort durch einen einzigen Methodenaufruf verfügbar. Der Leitfaden zum Lesen von Barcodes aus Bildern umfasst die Erkennung mehrerer Barcodes, die Bildvorverarbeitung und das Scannen von PDF-Seiten.
Format-Erweiterung ohne neue Abhängigkeiten: Das Hinzufügen von Code 128, EAN-13, DataMatrix, PDF417oder einem anderen unterstützten Format nach der Migration erfordert nur einen anderen BarcodeEncoding-Parameterwert. Es müssen keine neuen Pakete installiert, keine neuen APIs erlernt und keine Versionskompatibilitätsprobleme behoben werden. Die neuen Formatvorgaben lassen sich durch eine einzige Änderung in einer Zeile anstatt durch eine neue Bibliotheksintegration realisieren.
Vereinfachte QR-Code-Anpassung: Logoeinbettung, Farbänderungen und Kontrolle der Ruhezone sind als benannte Methoden auf dem QRCodeWriter-Ergebnis verfügbar. Die System.Drawing.Bitmap-Abhängigkeit, die QR-Code für die Logoeinbettung erfordert, wird durch einen einfachen Dateipfad-String ersetzt. Der Leitfaden zur Anpassung des QR-Code-Stils dokumentiert alle verfügbaren Anpassungsoptionen.
Integrierte PDF-Integration: Barcodes können aus eingehenden PDF-Dokumenten gelesen und in bestehende PDF-Dateien eingefügt werden, ohne dass eine PDF-Bibliothek hinzugefügt werden muss. Dokumentenverarbeitungs-Workflows, die bisher eine separate PDF-Abhängigkeit erforderten, verfügen nun über eine integrierte Barcode- und PDF-Funktionalität.
Reduzierter langfristiger Wartungsaufwand: Durch den Wechsel von drei oder vier unabhängigen Paketen zu einem einzigen Paket entfällt der kumulative Aufwand, mehrere Releasezyklen zu verfolgen, Versionskonflikte zwischen Bibliotheken zu lösen und mehrere Testsuiten bei neuen .NET Versionen zu aktualisieren. Die Wartungskosten des Barcode-Subsystems reduzieren sich auf eine einzige Abhängigkeit von einem einzelnen Paket.
Häufig gestellte Fragen
Warum sollte ich von QRCoder.NET zu IronBarcode migrieren?
Zu den häufigsten Gründen gehören die Vereinfachung der Lizenzierung (Beseitigung der Komplexität von SDK und Laufzeitschlüsseln), die Beseitigung von Durchsatzbeschränkungen, die Verbesserung der nativen PDF-Unterstützung, die Verbesserung der Docker/CI/CD-Bereitstellung und die Verringerung von API-Boilerplate im Produktionscode.
Wie kann ich QRCoder-API-Aufrufe durch IronBarcode ersetzen?
Ersetzen Sie Instanzerstellung und Lizenzierung durch IronBarCode.License.LicenseKey = "key". Ersetzen Sie die Leseaufrufe durch BarcodeReader.Read(path) und die Schreibaufrufe durch BarcodeWriter.CreateBarcode(data, encoding). Statische Methoden erfordern keine Instanzverwaltung.
Wie viel Code ändert sich bei der Migration von QRCoder.NET zu IronBarcode?
Die meisten Migrationen führen zu weniger Codezeilen. Lizenzierungs-Boilerplate, Instanzkonstruktoren und explizite Formatkonfiguration werden entfernt. Zentrale Lese-/Schreibvorgänge werden auf kürzere IronBarcode-Äquivalente mit saubereren Ergebnisobjekten abgebildet.
Muss ich während der Migration sowohl QRCoder.NET als auch IronBarcode installiert lassen?
Nein. Die meisten Migrationen sind direkte Ersetzungen und keine Paralleloperationen. Migrieren Sie eine Serviceklasse nach der anderen, ersetzen Sie die NuGet-Referenz und aktualisieren Sie die Instanzierungs- und API-Aufrufmuster, bevor Sie zur nächsten Klasse übergehen.
Wie lautet der NuGet-Paketname für IronBarcode?
Das Paket ist 'IronBarCode' (mit großem B und C). Installieren Sie es mit 'Install-Package IronBarCode' oder 'dotnet add package IronBarCode'. Die using-Anweisung im Code lautet 'using IronBarCode;'.
Wie vereinfacht IronBarcode die Docker-Bereitstellung im Vergleich zu QRCoder.NET?
IronBarcode ist ein NuGet-Paket, für das keine externen SDK-Dateien oder Lizenzkonfigurationen erforderlich sind. In Docker setzen Sie die Umgebungsvariable IRONBARCODE_LICENSE_KEY und das Paket übernimmt die Lizenzvalidierung beim Start.
Erkennt IronBarcode nach der Migration von QRCoder automatisch alle Barcode-Formate?
Ja, IronBarcode erkennt automatisch die Symbologie aller unterstützten Formate. Eine explizite Aufzählung von BarcodeTypes ist nicht erforderlich. Wenn das Format bereits bekannt ist und die Leistung eine Rolle spielt, ermöglicht BarcodeReaderOptions die Einschränkung des Suchraums als eine Optimierung.
Kann IronBarcode Barcodes aus PDFs ohne eine separate Bibliothek lesen?
Ja, BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien nativ. Die Ergebnisse enthalten PageNumber, Format, Value und Confidence für jeden gefundenen Barcode. Es ist kein externer PDF-Rendering-Schritt erforderlich.
Wie handhabt IronBarcode die parallele Verarbeitung von Barcodes?
Die statischen Methoden von IronBarcode sind zustandslos und thread-sicher. Verwenden Sie Parallel.ForEach direkt über Dateilisten ohne Instanzmanagement pro Thread. BarcodeReaderOptions.MaxParallelThreads steuert das interne Thread-Budget.
Welche Ergebniseigenschaften ändern sich bei der Migration von QRCoder.NET zu IronBarcode?
Übliche Umbenennungen: BarcodeValue wird zu Value, BarcodeType wird zu Format. IronBarcode-Ergebnisse fügen auch Confidence und PageNumber hinzu. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt die Umbenennungen im bestehenden Ergebnisverarbeitungscode.
Wie kann ich die IronBarcode-Lizenzierung in einer CI/CD-Pipeline einrichten?
Speichern Sie IRONBARCODE_LICENSE_KEY als Pipeline-Geheimnis und weisen Sie IronBarCode.License.LicenseKey im Startup-Code der Anwendung zu. Ein Geheimnis deckt alle Umgebungen ab, einschließlich Entwicklung, Test, Staging und Produktion.
Unterstützt IronBarcode die Generierung von QR-Codes mit benutzerdefiniertem Styling?
Ja. QRCodeWriter.CreateQrCode() unterstützt benutzerdefinierte Farben über ChangeBarCodeColor(), das Einbetten von Logos über AddBrandLogo(), konfigurierbare Fehlerkorrekturstufen und mehrere Ausgabeformate einschließlich PNG, JPG, PDF und Stream.

