Comment définir une région de recadrage de code-barres en C#
Passer de Code-barres net à IronBarcode
Ce guide décrit l'intégralité du processus de migration de Code-barres net vers IronBarcode , avec les étapes de suppression des packages, les mises à jour des espaces de noms, des exemples de traduction d'API et une liste de contrôle pour localiser chaque point d'appel avant le début de la migration. Le guide traite du scénario courant dans lequel un projet commence avec Code-barres net pour la génération de codes-barres 1D et nécessite plus tard des formats 2D, des capacités de lecture ou une clarification de l'obligation de licence SixLabors.ImageSharp — toutes desquelles sont en dehors du champ d'application de NetBarcode.
Pourquoi migrer depuis Code-barres net ?
Format de plafond : L'énumération Type de Code-barres net définit exactement 11 formats de codes-barres, tous linéaires. Aucune entrée n'est disponible pour les codes QR, DataMatrix, PDF417 ou Aztec. Lorsqu'un projet ajoute une exigence de code QR — pour les liens de livraison sans contact, les liens profonds mobiles ou une exigence DataMatrix pharmaceutique — Code-barres net ne peut pas y répondre. La seule solution prévue par la conception de la bibliothèque est de cesser de l'utiliser pour ce format et d'introduire un package séparé. Chaque besoin de format supplémentaire qui dépasse l'énumération à 11 entrées ajoute une autre bibliothèque à l'arbre de dépendances.
Absence d'API de lecture : Code-barres net génère des images de codes-barres et ne fournit aucune méthode pour les décoder. Un projet qui doit scanner les étiquettes de retour d'expédition, extraire les valeurs des codes-barres des factures des fournisseurs ou vérifier qu'un code-barres imprimé correspond à ses données sources doit ajouter une bibliothèque de lecture distincte. ZXing .NET est le choix le plus courant, introduisant une troisième surface d'API dans une base de code qui contient déjà Code-barres net et, généralement, une bibliothèque spécifique aux QR codes.
Licence commerciale ImageSharp : Code-barres net dépend de SixLabors.ImageSharp, qui utilise une licence commerciale scindée. Le niveau gratuit s'applique aux projets open source et aux entreprises dont le chiffre d'affaires annuel est inférieur à un seuil défini ; au-delà de ce seuil, une licence commerciale est requise. Cette condition est intégrée à la chaîne de dépendances transitives et n'est pas mise en évidence par NuGet lors de l'installation. Une entreprise de vente au détail ou de logistique traitant des codes-barres à grande échelle — précisément le cas d'utilisation ciblé par Code-barres net — peut fonctionner au-delà du seuil sans avoir évalué son obligation.
Accumulation de plusieurs bibliothèques : les projets qui utilisent QRCoder lorsque des codes QR sont nécessaires, puis ZXing .NET lorsque la lecture devient nécessaire, accumulent trois dépendances distinctes liées aux codes-barres. Chacune a son propre calendrier de publication, ses propres exigences en matière de version d'ImageSharp et sa propre API à maintenir. La consolidation dans une seule bibliothèque couvrant la génération, la lecture, les données 1D et 2D élimine le problème de la gestion des versions entre bibliothèques.
Le problème fondamental
Un projet qui débute avec le seul format Code-barres net et qui s'étend ensuite aux formats 2D aboutit à ce type d'importation fractionnée :
// Code-barres net for 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
// Code-barres net for 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
Imports NetBarcode
Imports QRCoder
Imports System.IO
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim png = New PngByteQRCode(qrData).GetGraphic(20)
File.WriteAllBytes("qr.png", png)
Après la migration vers IronBarcode, les deux mêmes résultats proviennent d'une seule importation :
using IronBarCode;
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
Comparaison des fonctionnalités Code-barres IronBarcode et de NetBarcode
| Fonction | Code-barres net | Code-barres IronBarcode |
|---|---|---|
| génération de codes-barres 1D | Oui | Oui |
| Génération de codes-barres 2D (QR, DataMatrix, PDF417, Aztec) | Non | Oui |
| Lecture de codes-barres à partir d'images | Non | Oui |
| Lecture de codes-barres à partir de documents PDF | Non | Oui |
| Nombre de formats 1D | 11 | 30+ |
| Nombre de formats 2D | 0 | 8+ |
| Symbologie totale | 11 | 50 ans et plus |
| GS1-128, GS1 DataBar | Non | Oui |
| Formats postaux | Non | Oui |
| Sortie SVG | Non | Oui |
| Traitement par lots | Manuel | Intégré |
| Dépendance d'ImageSharp | Oui (licence partagée) | Non |
| Soutien commercial | Communauté | Professional |
| Modèle de licence | MIT (+ conditions ImageSharp) | Commercial |
Démarrage rapide : Migration de Code-barres net vers IronBarcode
Étape 1 : Remplacer le package NuGet
Supprimez Code-barres net et sa dépendance transitive ImageSharp :
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
Notez que SixLabors.ImageSharp peut réapparaître dans la liste des packages restaurés si d'autres packages du projet s'y réfèrent également de manière transitive. Après la suppression, exécutez dotnet list package --include-transitive pour confirmer si ImageSharp reste et si sa condition de licence commerciale s'applique toujours au projet.
Étape 2 : Ajouter un IronBarcode
dotnet add package IronBarcode
dotnet add package IronBarcode
Le nom du package NuGet est IronBarcode; le namespace utilisé dans le code est IronBarCode (notez le C majuscule).
Étape 3 : Mise à jour des espaces de noms et initialisation de la licence
Remplacez les anciennes directives using dans tous les fichiers contenant des appels NetBarcode :
// Retirer these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;
// Add this:
using IronBarCode;
// Retirer these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;
// Add this:
using IronBarCode;
Imports IronBarCode
Ajoutez l'initialisation de la licence une seule fois au démarrage de l'application — dans Program.cs, Startup.cs, ou le point d'entrée du projet :
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 pour évaluation ; L'achat d'une licence supprime le filigrane d'essai des images de codes-barres générées.
Exemples de migration de code
Génération Code128
Le modèle d'utilisation le plus courant de Code-barres net se traduit directement en Code-barres IronBarcode moyennant un changement de constructeur en méthode statique et un renommage de méthode.
Approche NetBarcode :
using NetBarcode;
var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
using NetBarcode;
var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
Imports NetBarcode
Dim barcode As New Barcode("12345678901234", Type.Code128)
barcode.SaveImageFile("shipping-label.png")
Approche IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
Le constructeur new Barcode(data, Type.X) devient BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X). La méthode SaveImageFile() devient SaveAsPng(), SaveAsJpeg(), ou SaveAsWindowsBitmap() selon le format de sortie requis. Toutes les options de génération de codes-barres 1D disponibles sont documentées dans les guides pratiques Code-barres IronBarcode .
EAN-13
Les types de codes-barres des produits de détail sont directement mappés entre les bibliothèques grâce à un renommage constant et un renommage de méthode.
Approche NetBarcode :
using NetBarcode;
var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
using NetBarcode;
var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
Imports NetBarcode
Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product-ean.png")
Approche IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("product-ean.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("product-ean.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
.SaveAsPng("product-ean.png")
Les noms des constantes d'encodage correspondent à ceux des membres de l'énumération Type de Code-barres net lorsque des équivalents directs existent. Notez que UPC-A (Type.UPCA), UPC-E (Type.UPCE), ITF (Type.ITF), et MSI (Type.MSI) ne font pas partie de l'énumération Type de Code-barres net — si ces formats sont nécessaires, Code-barres IronBarcode les prend en charge nativement via BarcodeEncoding.UPCA, BarcodeEncoding.UPCE, BarcodeEncoding.ITF et BarcodeEncoding.MSI.
GetImage() vers ToPngBinaryData()
La méthode GetImage() de Code-barres net retourne SixLabors.ImageSharp.Image<Rgba32>, ce qui nécessite des importations explicites d'ImageSharp dans le code appelant et lie la logique en aval à l'API ImageSharp. Code-barres IronBarcode expose des méthodes de sortie binaire et de flux directement sur l'objet GeneratedBarcode, éliminant ainsi totalement la dépendance à ImageSharp du code appelant.
Approche NetBarcode :
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO
Dim barcode As New Barcode("12345", Type.Code128)
Dim image As Image(Of Rgba32) = barcode.GetImage()
Using stream As New MemoryStream()
image.SaveAsPng(stream)
Dim bytes As Byte() = stream.ToArray()
End Using
Approche IronBarcode :
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);
// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();
// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);
// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();
// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode
Dim barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
' Retrieve bytes directly — no ImageSharp type in calling code
Dim bytes As Byte() = barcode.ToPngBinaryData()
' Or write to a stream directly
Using stream As New MemoryStream()
barcode.SaveAsPng(stream)
End Using
Le code qui effectuait d'autres manipulations ImageSharp sur le résultat Image<Rgba32> — redimensionnement, composition, conversion de format — devra évaluer ces opérations individuellement, car Code-barres IronBarcode n'expose pas d'objet ImageSharp.
Remplacement simultané de Code-barres net et QRCoder
Les projets utilisant Code-barres net en parallèle de QRCoder peuvent remplacer les deux simultanément. La génération 2D d'IronBarcode utilise la même méthode BarcodeWriter.CreateBarcode que sa génération 1D ; seule la constante BarcodeEncoding diffère. Consultez le guide de génération de codes-barres 2D pour connaître les options d'encodage et de configuration.
Approche Code-barres net et QRCoder :
using NetBarcode;
using QRCoder;
// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
using NetBarcode;
using QRCoder;
// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
Imports NetBarcode
Imports QRCoder
' 1D with NetBarcode
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")
' QR with QRCoder
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20))
Approche IronBarcode :
using IronBarCode;
// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
.SaveAsPng("pharma-label.png");
using IronBarCode;
// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
.SaveAsPng("pharma-label.png");
Imports IronBarCode
' 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
' QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
' Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
.SaveAsPng("pharma-label.png")
Ajout de la capacité de lecture
Si le projet utilisait également ZXing .NET pour la lecture, cette dépendance peut être supprimée en même temps que NetBarcode. IronBarcode's BarcodeReader gère les images et les documents PDF avec détection de format automatique.
Approche ZXing .NET :
using ZXing;
using ZXing.Common;
using ZXing.Rendering;
var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };
// Bitmap loading and format-specific handling required before decode call
using ZXing;
using ZXing.Common;
using ZXing.Rendering;
var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };
// Bitmap loading and format-specific handling required before decode call
Imports ZXing
Imports ZXing.Common
Imports ZXing.Rendering
Dim reader = New BarcodeReaderGeneric()
reader.Options = New DecodingOptions With {.TryHarder = True}
' Bitmap loading and format-specific handling required before decode call
Approche IronBarcode :
using IronBarCode;
// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
Console.WriteLine($"{r.Format}: {r.Value}");
}
// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
using IronBarCode;
// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
Console.WriteLine($"{r.Format}: {r.Value}");
}
// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
Imports IronBarCode
' Read from an image file — automatic format detection
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
Console.WriteLine($"{r.Format}: {r.Value}")
Next
' Read from a PDF document — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each r In pdfResults
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}")
Next
La documentation complète relative aux options de lecture est disponible dans le guide de lecture des codes-barres à partir d'images , et couvre le réglage de la vitesse, la détection de plusieurs codes-barres et les paramètres de correction d'image.
Référence de correspondance entre l'API Code-barres net et IronBarcode
| Code-barres net | Code-barres IronBarcode | Notes |
|---|---|---|
new Barcode(data, Type.Code128) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
Constructeur → méthode statique |
new Barcode(data, Type.EAN13) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) |
Mappage direct |
new Barcode(data, Type.Code39) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) |
Mappage direct |
new Barcode(data, Type.EAN8) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) |
Mappage direct |
new Barcode(data, Type.Codabar) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) |
Mappage direct |
new Barcode(data, Type.Code93) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) |
Mappage direct |
barcode.SaveImageFile("x.png") |
.SaveAsPng("x.png") |
renommer la méthode |
barcode.SaveImageFile("x.jpg") |
.SaveAsJpeg("x.jpg") |
renommer la méthode |
barcode.GetImage() → Image<Rgba32> |
.ToPngBinaryData() ou .SaveAsPng() |
Aucun type ImageSharp exposé |
Pas de Type.QRCode |
BarcodeEncoding.QRCode |
Nouvelle capacité |
Pas de Type.DataMatrix |
BarcodeEncoding.DataMatrix |
Nouvelle capacité |
Pas de Type.PDF417 |
BarcodeEncoding.PDF417 |
Nouvelle capacité |
Pas de Type.Aztec |
BarcodeEncoding.Aztec |
Nouvelle capacité |
| API de lecture indisponible | BarcodeReader.Read(path) |
Nouvelle capacité |
using NetBarcode; |
using IronBarCode; |
remplacement d'espace de noms |
using SixLabors.ImageSharp; |
Retirer | Plus nécessaire |
using SixLabors.ImageSharp.PixelFormats; |
Retirer | Plus nécessaire |
using SixLabors.Fonts; |
Retirer | Plus nécessaire |
La liste complète des constantes d'encodage se trouve dans le guide des formats de codes-barres pris en charge .
Problèmes de migration courants et solutions
Problème 1 : Une dépendance transitive ImageSharp persiste après la suppression du paquet
Problème : Après avoir exécuté dotnet remove package NetBarcode, dotnet restore montre que SixLabors.ImageSharp est toujours présent dans l'arborescence des dépendances car un autre package du projet y fait référence.
Solution : Exécutez dotnet list package --include-transitive pour identifier quel package attire encore ImageSharp. Si c'est seulement NetBarcode, supprimer la référence explicite du package et restaurer devrait le supprimer. Si un autre package est responsable, la dépendance ImageSharp de ce package et sa condition de licence commerciale restent sous le même angle indépendamment de la suppression de NetBarcode.
dotnet list package --include-transitive | grep -i imagesharp
dotnet list package --include-transitive | grep -i imagesharp
Numéro 2 : Image Le type ne peut pas être résolu après la suppression
Problème : Après avoir supprimé le package SixLabors.ImageSharp, toute variable déclarée comme Image<Rgba32> ou paramètre typé comme SixLabors.ImageSharp.Image<Rgba32> produit une erreur de compilation car le type n'est plus disponible.
Solution : Remplacez chaque utilisation par la méthode de sortie Code-barres IronBarcode appropriée. Si la variable était utilisée pour obtenir des octets, remplacez-la par .ToPngBinaryData(). Si elle était écrite dans un flux, remplacez-la par .SaveAsPng(stream). Si elle était enregistrée dans un fichier, remplacez-la par .SaveAsPng(path).
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);
// After — no external image type required
barcode.SaveAsPng(stream);
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);
// After — no external image type required
barcode.SaveAsPng(stream);
' Before — requires SixLabors.ImageSharp reference
Dim img As Image(Of Rgba32) = barcode.GetImage()
img.SaveAsPng(stream)
' After — no external image type required
barcode.SaveAsPng(stream)
Problème 3 : v1.8 Contexte de changement majeur
Problème : Les bases de code qui ont été écrites contre Code-barres net avant v1.8 peuvent avoir des appels GetImage() qui ont stocké le résultat sans typage explicite, se fiant au type de retour interne pré-v1.8. Ces appels peuvent déjà être interrompus après une mise à jour de NetBarcode, indépendamment de la migration Code-barres IronBarcode .
Solution : Utilisez la migration vers Code-barres IronBarcode comme une opportunité de résoudre toute rupture préexistante de la v1.8 en même temps. Tous les sites d'appel GetImage() devraient être localisés par une recherche à l'échelle du projet et remplacés par la méthode de sortie appropriée d'IronBarcode pendant la passe de migration. Les commandes grep de la liste de contrôle de migration ci-dessous permettent d'identifier ces emplacements.
Liste de contrôle de migration NetBarcode
Pré-migration
Avant toute modification, veuillez vérifier l'ensemble de l'utilisation de NetBarcode :
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
- Identifiez tous les fichiers qui nécessitent une modification de la directive using.
- Notez tous les sites d'appel
GetImage()et comment l'objetImage<Rgba32>retourné est utilisé en aval - Vérifiez si QRCoder ou ZXing .NET sont présents et peuvent être supprimés en une seule passe.
- Exécutez
dotnet list package --include-transitivepour documenter l'état actuel de la dépendance ImageSharp avant la suppression - Obtenez une clé de licence Code-barres IronBarcode (une clé d'essai gratuite est disponible sans achat).
Mise à jour du code
- Exécutez
dotnet remove package NetBarcode - Exécutez
dotnet remove package SixLabors.ImageSharps'il n'est pas utilisé par d'autres paquets - Exécutez
dotnet add package IronBarcode - Ajoutez
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";au démarrage de l'application - Remplacez
using NetBarcode;parusing IronBarCode;dans chaque fichier concerné - Supprimez
using SixLabors.ImageSharp;,using SixLabors.ImageSharp.PixelFormats;etusing SixLabors.Fonts;de tous les fichiers - Traduisez chaque appel
new Barcode(data, Type.X)enBarcodeWriter.CreateBarcode(data, BarcodeEncoding.X)en utilisant le tableau de correspondance de l'API - Remplacez
SaveImageFile()parSaveAsPng()ou la méthode spécifique au format appropriée - Remplacez les appels
GetImage()parToPngBinaryData(),SaveAsPng()ouSaveAsPng(stream)selon le cas - Si vous retirez QRCoder : remplacez les chaînes
QRCodeGenerator+PngByteQRCodeparBarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) - Si vous retirez ZXing.Net : remplacez la configuration du lecteur par
BarcodeReader.Read(path)
Test de post-migration
- Compilez le projet et vérifiez qu'il n'y a aucune erreur de compilation.
- Exécuter les tests unitaires existants sur la sortie de code-barres générée
- Vérifier visuellement les images des codes-barres pour s'assurer de la symbologie correcte et du contenu lisible
- Vérifiez si le format de code QR a été ajouté lors de la migration.
- Tester la fonctionnalité de lecture si la lecture de codes-barres a été ajoutée
- Exécutez
dotnet list package --include-transitivepour confirmer qu'ImageSharp n'est plus présent s'il a été supprimé - Vérifiez que l'initialisation de la clé de licence s'exécute avant la première opération de lecture de code-barres.
Principaux avantages de la migration vers IronBarcode
Couverture de format unifiée : Après migration, les codes QR, DataMatrix, PDF417, Aztec et tous les autres formats 2D sont disponibles via le même appel d'API utilisé pour Code128 et EAN-13. Aucune seconde bibliothèque n'est nécessaire lorsque les exigences de format s'élargissent, et la constante BarcodeEncoding est la seule chose qui change entre les types de format.
Lecture intégrée : BarcodeReader.Read() gère les fichiers image et les documents PDF avec détection automatique du format. Les projets qui nécessitaient auparavant ZXing .NET pour la lecture peuvent désormais supprimer cette dépendance et se consolider dans une seule bibliothèque de codes-barres, réduisant ainsi la surface d'API que les développeurs du projet doivent apprendre.
Aucune obligation ImageSharp : Code-barres IronBarcode ne dépend pas de SixLabors.ImageSharp. Après la migration, la condition de licence commerciale répartie intégrée dans les dépendances transitoires de Code-barres net ne s'applique plus au projet. Les revues de conformité des licences deviennent plus simples car les obligations de la bibliothèque de codes-barres sont indiquées directement et ne dépendent pas du seuil de revenu d'une bibliothèque de traitement d'images tierce.
API publique stable : Code-barres IronBarcode n'expose pas de types tiers dans son interface API publique. Le type de retour GeneratedBarcode de BarcodeWriter.CreateBarcode est le type propre à IronBarcode, ce qui signifie que les futures mises à jour du rendu interne d'IronBarcode ne produiront pas de changements de rupture dans le code appelant comme le changement de type v1.8 GetImage() de Code-barres net l'a fait.
Une seule dépendance à maintenir : le remplacement de NetBarcode, QRCoder et ZXing .NET par Code-barres IronBarcode réduit de trois cycles de mise à niveau, de trois ensembles de notes de version et de trois conflits de versions potentiels à un seul. À mesure que les versions de .NET évoluent et que les mises à jour des dépendances deviennent nécessaires, le travail de maintenance s'adapte à une seule bibliothèque au lieu de trois.
Questions Fréquemment Posées
Pourquoi devrais-je migrer de NetBarcode à 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 à l'API NetBarcode 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 NetBarcode 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 conserver NetBarcode 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 à NetBarcode ?
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 NetBarcode ?
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 NetBarcode 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.

