Passer au contenu du pied de page
VIDéOS

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
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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
SHELL

Installer IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

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
SHELL

É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
$vbLabelText   $csharpLabel

É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"
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

La correspondance des niveaux est : ECCLevel.LLow, ECCLevel.MMedium, ECCLevel.QHigh, ECCLevel.HHighest.

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)
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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))
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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" .
SHELL
  • Documentez tous les types PayloadGenerator en 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

  1. Exécutez dotnet remove package QRCoder
  2. Exécutez dotnet remove package ZXing.Net s'il a été utilisé uniquement pour la lecture avec QRCoder
  3. Exécutez dotnet add package IronBarcode
  4. Ajoutez IronBarCode.License.LicenseKey = "YOUR-KEY"; au démarrage de l'application
  5. Remplacez toutes les importations using QRCoder; par using IronBarCode;
  6. Supprimez toutes les déclarations d'instance new QRCodeGenerator()BarcodeWriter est statique
  7. Remplacez tous les motifs de chaîne generator.CreateQrCode(data, ECCLevel.X) + renderer par des chaînes BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
  8. Remplacez les appels .GetGraphic(n) par .ToPngBinaryData() et ajoutez .ResizeTo(w, h) avant le terminal
  9. Remplacez les motifs de sauvegarde File.WriteAllBytes(path, bytes) par des méthodes terminales .SaveAsPng(path)
  10. Remplacez new SvgQRCode(data).GetGraphic(n) par .SaveAsImage(path) (passez une extension .svg)
  11. Remplacez PayloadGenerator.WiFi(...) et d'autres instanciations de helpers par des chaînes de format direct
  12. Mappez chaque valeur QRCodeGenerator.ECCLevel à son équivalent QRCodeWriter.QrErrorCorrectionLevel
  13. Remplacez tous les appels BarcodeReaderGeneric.Decode(bitmap) de ZXing.Net par BarcodeReader.Read(path)
  14. Pour l'intégration du logo, remplacez new QRCode(data).GetGraphic(n, ..., logoBitmap) par QRCodeWriter.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.

Veuillez noterLes marques NetBarcode, Codeur QR et ZXing.NET sont toutes des marques déposées de leurs propriétaires respectifs. Ce site n'est pas affilié, approuvé ou parrainé par NetBarcode, Codeur QR ou ZXing.NET. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.

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.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi