Comment utiliser Async et Multithread dans les codes-barres utilisant C#
Migration de Codeur QR vers IronBarcode
Ce guide est destiné aux équipes de développement dont les projets ont débuté avec Codeur QR et ont évolué pour nécessiter des fonctionnalités allant au-delà de la simple génération de codes QR. Codeur QR est une bibliothèque de haute qualité et bien maintenue pour son usage prévu, et la migration n'est pas un reflet de sa qualité. Il s'agit d'une réponse à des exigences — extension de format, lecture de codes-barres, intégration PDF — qui ne relèvent pas des fonctionnalités pour lesquelles Codeur QR a été conçu. Ce guide couvre l'intégralité du parcours technique de Codeur QR à IronBarcode: remplacement des packages, modifications des espaces de noms, traduction du code pour chaque modèle courant, correspondance des API et solutions aux problèmes rencontrés lors de la transition.
Pourquoi migrer depuis Codeur QR ?
Exigences de format autres que les QR codes : Codeur QR génère exclusivement des codes QR. Les projets qui s'étendent pour nécessiter des étiquettes Code 128 pour la logistique, des codes EAN-13 pour l'identification des produits de détail, Matrice de données pour la sérialisation pharmaceutique, ou PDF417pour la conformité des documents gouvernementaux doivent introduire une bibliothèque séparée pour chaque format supplémentaire. À mesure que le nombre de formats requis augmente, le nombre de packages indépendants, d'API et d'obligations de maintenance augmente également.
Exigences de lecture des codes-barres : Codeur QR ne possède pas d'API de lecture des codes-barres ; il s'agit d'une bibliothèque de génération uniquement, de par sa conception. Toute application qui doit décoder les codes QR à partir d'images entrantes, vérifier les codes-barres sur des documents numérisés ou traiter des étiquettes d'expédition doit ajouter une bibliothèque de lecture dédiée en plus de QRCoder. Cette seconde bibliothèque apporte sa propre interface API, son propre cycle de mise à jour et ses propres problèmes de compatibilité à chaque mise à niveau de .NET .
Maintenance de plusieurs bibliothèques : Le schéma d'accumulation réaliste pour un projet basé sur Codeur QR va de Codeur QR pour la génération de QR codes à une bibliothèque de codes-barres 1D pour les étiquettes d'expédition, puis à une bibliothèque de lecture pour le décodage. Gérer trois ou quatre packages indépendants implique de suivre des notes de version distinctes, de résoudre les conflits de versions lors de la mise à jour de l'un d'entre eux et de maintenir une bonne connaissance de plusieurs API au sein d'une équipe de développement. Les coûts de maintenance s'accumulent au fil du temps d'une manière qui n'est pas visible dans l'estimation d'intégration initiale.
Prise en charge des fichiers PDF : L'intégration de codes-barres dans des documents PDF ou l'extraction de codes-barres à partir de fichiers PDF entrants ne font pas partie des fonctionnalités de QRCoder. Les processus de traitement de documents — gestion des factures, génération d'étiquettes à partir de modèles PDF, rapports de conformité — se heurtent très tôt à cette limite. Une bibliothèque PDF dédiée doit être ajoutée en plus de QRCoder, ou l'architecture doit acheminer la génération de codes-barres et la génération de PDF via des sous-systèmes distincts.
Le problème fondamental
QRCoder résout efficacement le problème de la génération de QR codes. Dès qu'une exigence dépasse le cadre du QR code, le code source doit commencer à intégrer des packages supplémentaires pour combler chaque manque :
// Codeur QR 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
// Codeur QR 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 centralise la génération, la lecture et l'intégration PDF sous une seule API :
// Code-barres 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");
// Code-barres 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")
Comparaison des fonctionnalités Code-barres IronBarcode et de QRCoder
| Fonction | Codeur QR | Code-barres IronBarcode |
|---|---|---|
| Génération de code QR | Oui, excellent | Oui |
| Micro QR | Oui | Non |
| Code 128 / Code 39 | Non | Oui |
| EAN-13 / UPC-A | Non | Oui |
| Matrice de données | Non | Oui |
| PDF417 | Non | Oui |
| Aztèque | Non | Oui |
| Formats totaux | 1 | 50 ans et plus |
| Lecture de codes-barres | Non | Oui — détection automatique |
| Extraction de codes-barres PDF | Non | Oui |
| Estampillage de codes-barres PDF | Non | Oui |
| Intégration du logo | Oui | Oui |
| Personnalisation des couleurs | Oui | Oui |
| Sortie SVG | Oui | Oui |
| Assistants PayloadGenerator | Oui | Non — construction manuelle des cordes |
| Aucune dépendance externe | Oui | Autonome |
| Licence | MIT — sans restriction | Commercial — le niveau Lite couvre un seul développeur |
Démarrage rapide : Migration de Codeur QR vers IronBarcode
Étape 1 : Remplacer le package NuGet
Supprimer Codeur QR du projet :
dotnet remove package QRCoder
dotnet remove package QRCoder
Installer IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Si le projet utilisait ZXing .NET en parallèle de Codeur QR pour la lecture des codes-barres, ce package peut également être supprimé à ce stade :
dotnet remove package ZXing.Net
dotnet remove package ZXing.Net
Étape 2 : Mise à jour des espaces de noms
Remplacez l'importation de l'espace de noms Codeur QR par l'espace de noms IronBarcode :
// Before (QRCoder)
using QRCoder;
// After (IronBarcode)
using IronBarCode;
// Before (QRCoder)
using QRCoder;
// After (IronBarcode)
using IronBarCode;
' Before (QRCoder)
Imports QRCoder
' After (IronBarcode)
Imports IronBarCode
Étape 3 : initialisation de la licence
Ajoutez l'initialisation de la licence au démarrage de l'application — Program.cs, Startup.cs, ou un constructeur statique :
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Une clé d'essai gratuite est disponible sans inscription. Les déploiements en production nécessitent l'achat d'une licence.
Exemples de migration de code
Génération de code QR de base
Le motif Codeur QR le plus courant nécessite trois objets : une instance de QRCodeGenerator, un objet intermédiaire QRCodeData et une classe de rendu telle que PngByteQRCode. Dans IronBarcode, un simple appel statique remplace cette chaîne.
Approche par codeur QR :
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
Approche IronBarcode :
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 est une classe statique — aucune instance n'est requise, et il n'y a pas d'objet de données intermédiaire. La méthode ResizeTo(width, height) remplace l'entier pixel-par-module que Codeur QR accepte dans GetGraphic. Là où Codeur QR dimensionne la sortie par le nombre de modules (par exemple, GetGraphic(10) pour une image de 10px par module), Code-barres IronBarcode prend des dimensions de pixels absolues.
Enregistrement des codes QR dans un fichier
QRCoder ne sépare les octets en mémoire de la sortie fichier qu'à l'étape du terminal — la chaîne de rendu est la même. Code-barres IronBarcode utilise différentes méthodes de terminal sur la même chaîne.
Approche par codeur QR :
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)
Approche IronBarcode :
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()
La méthode SaveAsPng est un terminal qui écrit directement sur le disque. ToPngBinaryData renvoie un byte[] pour le streaming, les réponses HTTP ou le stockage dans une base de données.
Sortie SVG
Approche par codeur QR :
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)
Approche IronBarcode :
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")
La classe de rendu SvgQRCode et son appel GetGraphic se réduisent en une seule méthode terminale SaveAsImage (passage d'une extension .svg produit une sortie SVG).
Cartographie des niveaux de correction d'erreur
QRCoder nécessite une sélection ECC explicite à chaque appel CreateQrCode en utilisant l'énum QRCodeGenerator.ECCLevel. Code-barres IronBarcode applique une valeur par défaut raisonnable lors de l'utilisation de BarcodeWriter.CreateBarcode, et expose un contrôle explicite via QRCodeWriter.QrErrorCorrectionLevel.
Approche par codeur QR :
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)
Approche IronBarcode :
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")
La correspondance des niveaux est : ECCLevel.L → Low, ECCLevel.M → Medium, ECCLevel.Q → High, ECCLevel.H → Highest.
Intégration du logo
Les deux bibliothèques prennent en charge l'intégration de logos dans les codes QR. Codeur QR redirige ceci à travers la classe de rendu QRCode (pas PngByteQRCode) avec des paramètres System.Drawing.Bitmap. Code-barres IronBarcode fournit QRCodeWriter.CreateQrCodeWithLogo() en tant que méthode de fabrication dédiée acceptant les chemins de fichier pour l'URL et le logo. Le guide de personnalisation du style de code QR couvre les options de taille, de positionnement et de combinaison de couleurs du logo.
Approche par codeur QR :
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)
Approche IronBarcode :
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")
La dépendance System.Drawing.Bitmap est supprimée — CreateQrCodeWithLogo accepte des chaînes de chemins de fichier pour le contenu et l'image du logo. La correction d'erreur est automatiquement définie au niveau requis pour l'incorporation de logo ; aucune configuration ECC explicite n'est nécessaire.
Générateur de charge utile. Migration WiFi
Le PayloadGenerator.WiFi de Codeur QR formate la chaîne de charge utile standard QR WiFi. Le format de sortie est une norme publique (WIFI:T:{auth};S:{ssid};P:{password};;) définie par la spécification du code QR. Lors de la migration, ces chaînes de caractères peuvent être construites directement.
Approche par codeur QR :
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))
Approche IronBarcode :
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")
Pour les équipes avec de nombreux types PayloadGenerator en utilisation (vCard, CalendarEvent, Geo, SMS), l'approche est la même : identifiez la chaîne formatée que chaque générateur produit avec sa sortie .ToString(), puis construisez cette chaîne directement ou à travers une petite méthode d'assistance statique.
Référence de correspondance entre l'API Codeur QR et IronBarcode
| Codeur QR | Code-barres IronBarcode | Notes |
|---|---|---|
new QRCodeGenerator() |
Classe statique — aucune instance | BarcodeWriter ne nécessite pas d'instanciation |
qrGenerator.CreateQrCode(data, ECCLevel.M) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) |
remplacement direct |
new PngByteQRCode(qrCodeData) |
Pas nécessaire | Le rendu fait partie de la chaîne fluide |
qrCode.GetGraphic(20) renvoyant byte[] |
.ToPngBinaryData() |
Taille via .ResizeTo(w, h) |
Motif File.WriteAllBytes(path, bytes) |
.SaveAsPng(path) |
Méthode terminale sur GeneratedBarcode |
new SvgQRCode(qrCodeData).GetGraphic(10) |
.SaveAsImage(path) |
Passez une extension .svg pour la sortie SVG |
new QRCode(qrCodeData).GetGraphic(...) |
QRCodeWriter.CreateQrCode(data, size, level) |
Utilisé pour la personnalisation du logo et des couleurs |
QRCodeGenerator.ECCLevel.L |
QRCodeWriter.QrErrorCorrectionLevel.Low |
|
QRCodeGenerator.ECCLevel.M |
QRCodeWriter.QrErrorCorrectionLevel.Medium |
Valeur par défaut si non spécifiée |
QRCodeGenerator.ECCLevel.Q |
QRCodeWriter.QrErrorCorrectionLevel.High |
|
QRCodeGenerator.ECCLevel.H |
QRCodeWriter.QrErrorCorrectionLevel.Highest |
Nécessaire pour l'intégration du logo |
PayloadGenerator.WiFi(...).ToString() |
"WIFI:T:WPA;S:{ssid};P:{pass};;" |
Construisez directement une chaîne standard |
PayloadGenerator.ContactData(...).ToString() |
"BEGIN:VCARD\n..." |
vCard est une norme publique |
| API de lecture indisponible | BarcodeReader.Read(path) |
Nouvelle fonctionnalité : pas de bibliothèque séparée |
| Format QR uniquement | 50+ formats via BarcodeEncoding.* |
Nouvelle capacité |
Problèmes de migration courants et solutions
Problème 1 : Modification du format de chaîne de PayloadGenerator
QRCoder : PayloadGenerator.WiFi, PayloadGenerator.ContactData, et d'autres aides produisent automatiquement des chaînes formatées. Le code passe la sortie .ToString() de l'objet helper à CreateQrCode.
Solution : Identifiez la chaîne que chaque type PayloadGenerator produit — son format est documenté dans la spécification du code QR et est simple à reproduire. Pour le WiFi : WIFI:T:WPA;S:{ssid};P:{password};;. Pour vCard : blocs BEGIN:VCARD / END:VCARD standards. Créez des méthodes d'assistance statiques si plusieurs sites d'appel utilisent le même type de charge utile :
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
Problème 2 : Mappage des énumérations ECCLevel
QRCoder : QRCodeGenerator.ECCLevel est une énumération imbriquée avec les valeurs L, M, Q, H. C'est un paramètre requis pour chaque appel CreateQrCode.
Solution : Mappez chaque valeur à son équivalent QRCodeWriter.QrErrorCorrectionLevel lorsque vous utilisez le chemin QRCodeWriter. Lors de l'utilisation de BarcodeWriter.CreateBarcode, le niveau ECC par défaut est Medium automatiquement et ne nécessite pas de paramètre. Mettre à jour chaque site d'appel :
// Codeur QR ECCLevel.H → Code-barres IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
// Codeur QR ECCLevel.M → Code-barres IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
// Codeur QR ECCLevel.H → Code-barres IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
// Codeur QR ECCLevel.M → Code-barres IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
' Codeur QR ECCLevel.H → Code-barres IronBarcode QrErrorCorrectionLevel.Highest
Dim qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
' Codeur QR ECCLevel.M → Code-barres IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
Problème 3 : Suppression de la classe Renderer
QRCoder : Chaque format de sortie nécessite sa propre instanciation de classe de rendu — PngByteQRCode, SvgQRCode, AsciiQRCode, Base64QRCode, QRCode. Ces classes acceptent QRCodeData et exposent GetGraphic avec différents types de retour.
Solution : Supprimez toutes les instanciations de la classe de rendu. Code-barres IronBarcode intègre la sortie de format dans les méthodes terminales de la chaîne fluide. Remplacez new PngByteQRCode(data).GetGraphic(n) par .ToPngBinaryData() après .ResizeTo(). Remplacez new SvgQRCode(data).GetGraphic(n) par .SaveAsImage(path) (en passant une extension .svg). L'objet intermédiaire QRCodeData disparaît également — il n'est pas nécessaire dans IronBarcode.
Problème n° 4 : Suppression des codes QR PNG et dimensionnement par modules
QRCoder : PngByteQRCode.GetGraphic(int pixelsPerModule) dimensionne la sortie par le nombre de pixels par module QR. Les dimensions de l'image résultante dépendent du nombre de modules, qui varie en fonction de la longueur du contenu et du niveau ECC.
Solution : Remplacez le dimensionnement basé sur les modules par ResizeTo(int width, int height) pour obtenir des dimensions de pixels absolues. Si votre code calculait dynamiquement la taille de sortie attendue à partir du nombre de modules, passez à une taille cible fixe qui réponde à vos besoins de sortie :
// 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()
Liste de contrôle de migration du codeur QR
Tâches préalables à la migration
Avant d'apporter des modifications, vérifiez le code source pour toute utilisation de QRCoder :
# Find all Codeur QR 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 Codeur QR 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" .
- Documentez tous les types
PayloadGeneratoren usage et notez leurs formats de sortie de chaîne. - Notez toutes les valeurs de niveau ECC utilisées et leurs sites d'appel
- Identifiez tout code de lecture ZXing .NET associé à Codeur QR pour le décodage ; celui-ci peut être remplacé simultanément.
- Obtenez une clé de licence Code-barres IronBarcode (des clés d'essai sont disponibles sans inscription)
Tâches de mise à jour du code
- Exécutez
dotnet remove package QRCoder - Exécutez
dotnet remove package ZXing.Nets'il a été utilisé uniquement pour la lecture avec QRCoder - Exécutez
dotnet add package IronBarcode - Ajoutez
IronBarCode.License.LicenseKey = "YOUR-KEY";au démarrage de l'application - Remplacez toutes les importations
using QRCoder;parusing IronBarCode; - Supprimez toutes les déclarations d'instance
new QRCodeGenerator()—BarcodeWriterest statique - Remplacez tous les motifs de chaîne
generator.CreateQrCode(data, ECCLevel.X)+ renderer par des chaînesBarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) - Remplacez les appels
.GetGraphic(n)par.ToPngBinaryData()et ajoutez.ResizeTo(w, h)avant le terminal - Remplacez les motifs de sauvegarde
File.WriteAllBytes(path, bytes)par des méthodes terminales.SaveAsPng(path) - Remplacez
new SvgQRCode(data).GetGraphic(n)par.SaveAsImage(path)(passez une extension.svg) - Remplacez
PayloadGenerator.WiFi(...)et d'autres instanciations de helpers par des chaînes de format direct - Mappez chaque valeur
QRCodeGenerator.ECCLevelà son équivalentQRCodeWriter.QrErrorCorrectionLevel - Remplacez tous les appels
BarcodeReaderGeneric.Decode(bitmap)de ZXing.Net parBarcodeReader.Read(path) - Pour l'intégration du logo, remplacez
new QRCode(data).GetGraphic(n, ..., logoBitmap)parQRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)
Test de post-migration
- Scannez tous les codes QR générés avec au moins deux applications de lecture de codes QR indépendantes pour vérifier leur lisibilité.
- Vérifiez que les codes QR avec logo intégré se scannent correctement — confirmez que le niveau de correction des erreurs est
Highest - Comparer le rendu visuel des codes générés avec des exemples antérieurs à la migration lorsque la cohérence de l'apparence est requise.
- Testez tous les remplacements
PayloadGenerator— confirmez que les chaînes de charge WiFi, vCard, et autres se déchiffrent correctement sur les appareils cibles - Si ZXing.Net a également été supprimé, vérifiez que tous les chemins de lecture des codes-barres fonctionnent via
BarcodeReader.Read - Exécutez l'application dans un environnement propre pour confirmer qu'aucune référence résiduelle à Codeur QR ou ZXing .NET ne provoque d'échecs de liaison.
- Vérifier que la clé de licence Code-barres IronBarcode est correctement chargée dans les environnements de production et de préproduction.
Principaux avantages de la migration vers IronBarcode
Une seule API pour toutes les opérations de code-barres : Après la migration, chaque tâche de code-barres — génération, lecture, estampillage PDF — utilise le même espace de noms IronBarCode et les mêmes points d'entrée. Les développeurs qui rejoignent le projet apprennent une seule API au lieu de trois. La vérification du code dans l'ensemble du sous-système de codes-barres devient cohérente. La recherche de documentation est centralisée.
Lecture de code-barres sans deuxième bibliothèque : BarcodeReader.Read gère les fichiers image, les pages PDF, les flux et les bitmaps en mémoire avec détection automatique du format. La fonctionnalité de lecture qui nécessitait auparavant ZXing .NET — avec ses exigences de spécification de format et ses considérations de sécurité des threads — est désormais disponible immédiatement via un simple appel de méthode. Le guide de lecture des codes-barres à partir d'images couvre la détection de plusieurs codes-barres, le prétraitement des images et la numérisation des pages PDF.
Expansion de format sans nouvelles dépendances : Ajouter Code 128, EAN-13, DataMatrix, PDF417, ou tout autre format pris en charge après la migration ne nécessite qu'une valeur de paramètre BarcodeEncoding différente. Aucun nouveau paquet à installer, aucune nouvelle API à apprendre, et aucun problème de compatibilité de versions à gérer. Les nouvelles exigences de format se traduisent par une simple modification d'une ligne plutôt que par une nouvelle intégration de bibliothèque.
Personnalisation simplifiée de code QR : L'intégration de logos, les modifications de couleur et le contrôle de la zone silencieuse sont disponibles en tant que méthodes nommées sur le résultat QRCodeWriter. La dépendance System.Drawing.Bitmap que Codeur QR nécessite pour l'intégration de logos est remplacée par une simple chaîne de chemin de fichier. Le guide de personnalisation du style de code QR répertorie toutes les options de personnalisation disponibles.
Intégration PDF intégrée : les codes-barres peuvent être lus à partir de documents PDF entrants et intégrés aux fichiers PDF existants sans ajout de bibliothèque PDF. Les flux de traitement de documents qui nécessitaient une dépendance PDF distincte intègrent désormais les fonctionnalités des codes-barres et des PDF.
Réduction des coûts de maintenance à long terme : le passage de trois ou quatre packages indépendants à un seul élimine les coûts cumulatifs liés au suivi de plusieurs cycles de publication, à la résolution des conflits de versions entre bibliothèques et à la mise à jour de plusieurs suites de tests lors des évolutions des versions .NET . Le coût de maintenance du sous-système de codes-barres se réduit à une seule dépendance logicielle.
Questions Fréquemment Posées
Pourquoi devrais-je migrer de QRCoder.NET vers IronBarcode ?
Les raisons les plus courantes sont la simplification des licences (suppression de la complexité du SDK + de la clé d'exécution), l'élimination des limites de débit, la prise en charge native des PDF, l'amélioration du déploiement Docker/CI/CD et la réduction de l'API boilerplate dans le code de production.
Comment remplacer les appels API de QRCoder par IronBarcode ?
Remplacer la création d'instance et le modèle de licence par IronBarCode.License.LicenseKey = "key". Remplacer les appels au lecteur par BarcodeReader.Read(path) et les appels à l'écrivain par BarcodeWriter.CreateBarcode(data, encoding). Les méthodes statiques ne nécessitent aucune gestion d'instance.
Quelle quantité de code change lors de la migration de QRCoder.NET vers IronBarcode ?
La plupart des migrations permettent de réduire le nombre de lignes de code. Les modèles de licence, les constructeurs d'instances et la configuration explicite des formats sont supprimés. Les principales opérations de lecture/écriture sont converties en équivalents plus courts d'IronBarcode avec des objets de résultat plus propres.
Dois-je garder QRCoder.NET et IronBarcode installés pendant la migration ?
Non. La plupart des migrations sont des remplacements directs plutôt que des opérations parallèles. Migrez une classe de service à la fois, remplacez la référence NuGet et mettez à jour les modèles d'instanciation et d'appel d'API avant de passer à la classe suivante.
Quel est le nom du package NuGet pour IronBarcode ?
Le paquet est "IronBarcode" (avec un B et un C majuscules). Installez-le avec "Install-Package IronBarCode" ou "dotnet add package IronBarCode". La directive using dans le code est "using IronBarCode ;".
Comment IronBarcode simplifie-t-il le déploiement de Docker par rapport à QRCoder.NET ?
IronBarcode est un package NuGet sans fichiers SDK externes ni configuration de licence montée. Dans Docker, définissez la variable d'environnement IRONBARCODE_LICENSE_KEY et le paquetage gère la validation de la licence au démarrage.
IronBarcode détecte-t-il automatiquement tous les formats de codes-barres après avoir migré depuis QRCoder ?
Oui. IronBarcode détecte automatiquement la symbologie dans tous les formats pris en charge. L'énumération explicite des BarcodeTypes n'est pas nécessaire. Si le format est déjà connu et que la performance est importante, BarcodeReaderOptions permet de restreindre l'espace de recherche en tant qu'optimisation.
IronBarcode peut-il lire des codes-barres à partir de PDF sans bibliothèque séparée ?
Oui, BarcodeReader.Read("document.pdf") traite les fichiers PDF de manière native. Les résultats incluent le numéro de page, le format, la valeur et la confiance pour chaque code-barres trouvé. Aucune étape de rendu PDF externe n'est requise.
Comment IronBarcode gère-t-il le traitement parallèle des codes-barres ?
Les méthodes statiques d'IronBarcode sont sans état et à l'abri des threads. Utilisez Parallel.ForEach directement sur les listes de fichiers sans gestion d'instance par thread. BarcodeReaderOptions.MaxParallelThreads contrôle le budget interne des threads.
Quelles propriétés de résultat changent lors de la migration de QRCoder.NET vers IronBarcode ?
Renommages courants : BarcodeValue devient Value, BarcodeType devient Format. Les résultats d'IronBarcode ajoutent également Confidence et PageNumber. Une recherche et un remplacement à l'échelle de la solution gèrent les renommages dans le code existant de traitement des résultats.
Comment configurer l'octroi de licences IronBarcode dans un pipeline CI/CD ?
Stockez IRONBARCODE_LICENSE_KEY en tant que secret de pipeline et attribuez IronBarCode.License.LicenseKey dans le code de démarrage de l'application. Un seul secret couvre tous les environnements, y compris le développement, les tests, la mise en scène et la production.
IronBarcode prend-il en charge la génération de codes QR avec un style personnalisé ?
Oui. QRCodeWriter.CreateQrCode() prend en charge les couleurs personnalisées via ChangeBarCodeColor(), l'intégration de logos via AddBrandLogo(), les niveaux de correction d'erreur configurables et plusieurs formats de sortie, notamment PNG, JPG, PDF et stream.

