BarcodeLib vs IronBarcode : Comparaison de la bibliothèque de codes-barres C#
BarcodeLib a été téléchargé plus de 12 millions de fois. La plupart de ces développeurs finissent par découvrir qu'il ne peut créer que des codes-barres. Une part importante d'entre eux découvre également le conflit SkiaSharp — généralement au pire moment possible, lorsqu'ils viennent d'ajouter BarcodeLibà un projet MAUI ou Blazor qui dépend déjà de SkiaSharp, et que la compilation commence à générer des avertissements NU1608 qu'ils ne s'attendaient pas à devoir déboguer cet après-midi-là. Cet article aborde les deux questions avec honnêteté. BarcodeLibest une bibliothèque légitime avec un cas d'utilisation clair. Comprendre où cela s'arrête est la question pratique.
Comprendre BarcodeLib
BarcodeLib est une bibliothèque open source de génération d'images de codes-barres pour .NET, maintenue sur GitHub par Brad Barnhill. Il est actif depuis 2007 et prend en charge plus de 25 symbologies de codes-barres. La licence Apache 2.0 autorise son utilisation commerciale gratuite. Pour la génération pure de codes-barres — la création d'une image à partir d'une chaîne de caractères — il fonctionne de manière fiable et a parfaitement rempli cette fonction pendant de nombreuses années d'utilisation active.
L'API est basée sur des instances. Vous créez un objet Barcode, définissez des propriétés et appelez Encode() avec une constante de type et une chaîne de données. Le résultat est un System.Drawing.Image que vous pouvez sauvegarder ou diffuser selon vos besoins. Ce flux de travail est clair et accessible, et pour les projets où l'exigence se limite à l'impression d'images de codes-barres (étiquettes d'expédition, étiquettes d'inventaire, étiquettes de prix de détail), il est suffisant.
Principales caractéristiques architecturales de BarcodeLib :
- Portée de génération uniquement : la bibliothèque ne possède aucune API de lecture ou de décodage d'aucune sorte ; sa surface publique entière est orientée vers la production d'images à partir de chaînes de données
- <Chaque opération nécessite l'instanciation d'un objet
Barcodeet la définition des propriétés de largeur, de hauteur et d'étiquette avant d'appelerEncode() - Returns
System.Drawing.Image: La sortie est un objet image GDI+, qui nécessite une étape intermédiaireMemoryStreampour produire un tableau d'octets pour les réponses HTTP ou le stockage dans une base de données - Génération 1D et QR uniquement : prend en charge plus de 25 symbologies, dont Code128, EAN-13, UPC-A, Code39 et QR Code, mais ne prend pas en charge la lecture 2D.
- Dépendance de SkiaSharp (v3.x): La série 3.x a remplacé
System.Drawing.Commonpar SkiaSharp pour permettre un support multiplateforme ; Cela introduit un risque de conflit de versions lorsque d'autres packages du projet dépendent également de SkiaSharp. - Gratuit, aucune clé de licence requise : la licence Apache 2.0 couvre l'utilisation commerciale sans clé d'exécution ni activation nécessaire.
Modèle de génération de base de BarcodeLib
Le flux de travail standard de génération de BarcodeLibnécessite la création d'une instance, la configuration des propriétés et l'appel à Encode() :
// BarcodeLib
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");
img.Save("barcode.png", ImageFormat.Png);
// BarcodeLib
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");
img.Save("barcode.png", ImageFormat.Png);
Imports BarcodeLib
Imports System.Drawing
Imports System.Drawing.Imaging
Dim b As New Barcode()
b.IncludeLabel = True
b.Width = 300
b.Height = 100
Dim img As Image = b.Encode(TYPE.CODE128, "PRODUCT-12345")
img.Save("barcode.png", ImageFormat.Png)
Voici le flux de travail de génération complet. Le modèle de définition des propriétés est la conception : toute la configuration se fait sur l'instance avant l'appel Encode(), et la valeur de retour est une System.Drawing.Image qui doit être sauvegardée séparément ou convertie en octets.
Comprendre IronBarcode
IronBarcode est une bibliothèque commerciale .NET de codes-barres qui couvre à la fois la génération et la lecture dans un seul package. Il s'installe via NuGet, fonctionne sur .NET Framework 4.6.2 à .NET 9 et est compatible avec Windows, Linux, macOS, Docker, Azure et AWS Lambda. La bibliothèque est développée et maintenue par Iron Software selon un modèle de support commercial.
L'API de génération est statique et fluide — aucune instance à créer, aucune propriété à définir avant l'appel principal. Les options de configuration s'enchaînent au résultat de BarcodeWriter.CreateBarcode() ou QRCodeWriter.CreateQrCode(). Les méthodes de sortie à la fin de la chaîne - .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() - éliminent le modèle intermédiaire MemoryStream que BarcodeLibexige. La lecture fait partie intégrante du même package, sans bibliothèque séparée ni intégration ZXing .NET à maintenir.
Caractéristiques principales d' IronBarcode:
- Génération et lecture en un seul paquet :
BarcodeWriter@ génération de poignées ;BarcodeReadermanipule la lecture ; Les deux sont inclus dans la même installation NuGet. - API fluide statique : aucune instanciation requise ; chaînes de configuration après
CreateBarcode()à l'aide de méthodes fluides - Sortie directe d'un tableau d'octets:
.ToPngBinaryData()renvoiebyte[]sans étapeMemoryStream - Support PDF aux deux extrémités:
BarcodeReader.Read()@ accepte les fichiers PDF en mode natif ; Les résultats de la génération peuvent être intégrés dans des fichiers PDF. - Aucune dépendance à SkiaSharp : indépendant du graphique de versions de SkiaSharp, éliminant les conflits NU1608 dans MAUI et d'autres projets
- Licence commerciale avec SLA : Prix : 749 $ à 5 999 $ perpétuelle ; inclut un support commercial et une cadence de mise à jour garantie
- @@CODE-25578--@@ tuning:
BarcodeReaderOptionspermet de troquer la minutie de l'analyse contre la performance au niveau du volume
Comparaison des fonctionnalités
| Fonction | BarcodeLib | Code-barres IronBarcode |
|---|---|---|
| génération de codes-barres | Oui | Oui |
| Lecture de codes-barres | Non | Oui |
| lecture de codes-barres PDF | Non | Oui |
| Conflit de dépendance SkiaSharp | Oui (v3.x) | Non |
| API chaînable fluide | Non | Oui |
| Licence | Apache 2.0 (gratuit) | 749 $ – 5 999 $ perpétuel |
Comparaison détaillée des fonctionnalités
| Fonction | BarcodeLib | Code-barres IronBarcode |
|---|---|---|
| Génération | ||
| Génération Code128 | Oui | Oui |
| Génération EAN-13 / UPC-A | Oui | Oui |
| génération de code QR | Oui (basique) | Oui (version avancée, avec intégration du logo) |
| Plus de 25 symbologies | Oui | Oui |
| API de génération chaînable fluide | Non | Oui |
Sortie directe byte[] |
Manuel (MemoryStream) |
.ToPngBinaryData() |
| Génération de PDF | Non | Oui |
| En lisant | ||
| Lecture du code-barres à partir de l'image | Non | Oui (BarcodeReader.Read()) |
| Lecture de code-barres à partir d'un PDF | Non | Oui (natif, sans bibliothèque supplémentaire) |
| Détection de plusieurs codes-barres | Non | Oui (ExpectMultipleBarcodes) |
| Réglage de la vitesse de lecture | N/A | Oui (ReadingSpeed enum) |
| Plateforme | ||
| Fenêtres | Oui | Oui |
| Linux / macOS | Partiellement (dépendant de SkiaSharp) | Complet |
| Docker / conteneur | Configuration requise | Oui |
| Compatibilité du projet MAUI | Risque de conflit (NU1608) | Aucun conflit |
| .NET Framework 4.6.2+ | Oui | Oui |
| .NET 6-9 | Oui (SkiaSharp 3.x requis) | Oui |
| Licence | ||
| Logiciel libre / gratuit | Oui (Apache 2.0) | Non |
| Support commercial / SLA | Non | Oui |
| Clé de licence requise | Non | Oui |
| Tarifs | Gratuit | 749 $ – 5 999 $ perpétuel |
API de génération de codes-barres
Les API de génération représentent des philosophies de conception différentes : BarcodeLibutilise une configuration d'instance mutable tandis Code-barres IronBarcode utilise une chaîne fluide immuable.
Approche BarcodeLib
BarcodeLib nécessite la construction d'une instance et la définition de propriétés avant d'appeler Encode(). Le résultat est un objet System.Drawing.Image :
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, data);
using var ms = new MemoryStream();
img.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, data);
using var ms = new MemoryStream();
img.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
Imports BarcodeLib
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Public Function GenerateCode128(data As String) As Byte()
Dim b As New Barcode()
b.IncludeLabel = True
b.Width = 300
b.Height = 100
Dim img As Image = b.Encode(TYPE.CODE128, data)
Using ms As New MemoryStream()
img.Save(ms, ImageFormat.Png)
Return ms.ToArray()
End Using
End Function
Le type de retour System.Drawing.Image signifie que la sortie d'un tableau d'octets nécessite un intermédiaire MemoryStream. La propriété IncludeLabel est une bascule booléenne - BarcodeLibrend automatiquement la chaîne de données encodée comme l'étiquette visible sous les barres.
Approche IronBarcode
La génération de codes-barres par Code-barres IronBarcode est entièrement statique. Les chaînes de configuration après CreateBarcode(), et les méthodes de sortie terminent la chaîne directement :
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.ToPngBinaryData();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.ToPngBinaryData();
}
Imports IronBarCode
Public Function GenerateCode128(data As String) As Byte()
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.AddAnnotationTextBelowBarcode(data) _
.ToPngBinaryData()
End Function
.ToPngBinaryData() renvoie directement le tableau d'octets - pas d'objet Image ou MemoryStream intermédiaire. .AddAnnotationTextBelowBarcode() prend la chaîne de l'étiquette de manière explicite, ce qui permet de contrôler le texte qui apparaît sous les barres. Pour les scénarios de génération avancés, consultez la documentation sur la génération de codes-barres IronBarcode .
Capacité de lecture des codes-barres
La lecture constitue la principale frontière fonctionnelle entre ces deux bibliothèques. BarcodeLibne possède aucune capacité de lecture ; Code-barres IronBarcode intègre un moteur de lecture complet dans le même package.
Approche BarcodeLib
BarcodeLib ne possède pas d'API de lecture. Il n'y a pas de méthode Decode(), Scan(), ou ReadBarcode(). Cette absence n'est pas due à une différence de version — la lecture n'a jamais fait partie de la conception de la bibliothèque. Toute tentative d'appel à une méthode de décodage entraîne une erreur de compilation :
// BarcodeLib— reading does not exist
using BarcodeLib;
var b = new Barcode();
// This will not compile — there is no Decode or Read method
// var value = b.Decode("barcode.png"); // CS1061: no definition
// var value = b.Scan("barcode.png"); // CS1061: no definition
// var value = b.ReadBarcode("barcode.png"); // CS1061: no definition
// The only thing you can do is generate:
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345"); // this works
// BarcodeLib— reading does not exist
using BarcodeLib;
var b = new Barcode();
// This will not compile — there is no Decode or Read method
// var value = b.Decode("barcode.png"); // CS1061: no definition
// var value = b.Scan("barcode.png"); // CS1061: no definition
// var value = b.ReadBarcode("barcode.png"); // CS1061: no definition
// The only thing you can do is generate:
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345"); // this works
Imports BarcodeLib
Dim b As New Barcode()
' This will not compile — there is no Decode or Read method
' Dim value = b.Decode("barcode.png") ' CS1061: no definition
' Dim value = b.Scan("barcode.png") ' CS1061: no definition
' Dim value = b.ReadBarcode("barcode.png") ' CS1061: no definition
' The only thing you can do is generate:
Dim img As Image = b.Encode(TYPE.CODE128, "PRODUCT-12345") ' this works
Les équipes qui ont besoin à la fois de la génération et de la lecture en parallèle de BarcodeLibdoivent ajouter une deuxième bibliothèque — généralement ZXing .NET — ce qui introduit sa propre charge de gestion des dépendances et une deuxième surface d'API à maintenir.
Approche IronBarcode
BarcodeReader.Read() accepte les fichiers images, les fichiers PDF, les flux et les objets System.Drawing.Bitmap. La lecture d'un fichier PDF ne nécessite aucune bibliothèque supplémentaire :
using IronBarCode;
// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value); // "PRODUCT-12345"
// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;
// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value); // "PRODUCT-12345"
// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode
' Read from an image
Dim results = BarcodeReader.Read("barcode.png")
Console.WriteLine(results.First().Value) ' "PRODUCT-12345"
' Read all barcodes from a PDF — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
' Tune reading for speed vs. thoroughness
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-scan.png", options)
L'énumération ReadingSpeed permet de régler les performances de balayage pour les scénarios à volume élevé. Pour obtenir des conseils sur la configuration de lecture, consultez la documentation de lecture IronBarcode .
Conflit de dépendance SkiaSharp
La dépendance SkiaSharp introduite dans BarcodeLib3.x crée un type de conflit qui n'existe pas dans IronBarcode.
Approche BarcodeLib
À partir de BarcodeLib3.x, la bibliothèque a introduit SkiaSharp en tant que backend graphique pour remplacer System.Drawing.Common, qui est devenu exclusivement Fenêtresaprès .NET 6. BarcodeLibse connecte à une gamme spécifique de versions de SkiaSharp. Si un projet utilise déjà SkiaSharp par le biais d'une autre dépendance - ce qui est courant dans les projets MAUI utilisant SkiaSharp.Views.Maui et Microsoft.Maui.Graphics - la version résolue peut se situer en dehors de la plage attendue de BarcodeLib. Le résultat est au minimum un avertissement NU1608 et au pire un échec de liaison d'assembly lors de l'exécution :
Avertissement NU1608 : Version du paquet détectée en dehors des contraintes de dépendance :
BarcodeLib 3.1.5 nécessite SkiaSharp (>= 2.88.7 && < 2.89.0) mais
Le problème lié à la version SkiaSharp 3.116.1 a été résolu.
Forcer la résolution par le biais de références explicites aux paquets ajoute de la complexité sans garantie :
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
Même avec des substitutions explicites, la compatibilité dépend de la correspondance entre les appels d'API internes de BarcodeLibet ceux exposés par la version épinglée. Il n'existe aucun contrat d'assistance garantissant une résolution du problème dans les délais impartis au projet.
Approche IronBarcode
IronBarcode ne partage pas le graphe de dépendances SkiaSharp avec le code de l'application. Il n'y a pas de négociation de version à gérer, pas de NU1608 à diagnostiquer et aucun risque de liaison d'assemblage à l'exécution lié à la résolution de version de SkiaSharp. Les projets MAUI, les projets Blazor et toute autre application dépendant de SkiaSharp peuvent installer Code-barres IronBarcode sans aucun conflit de version. Pour les modèles d'intégration spécifiques à MAUI, consultez la documentation Code-barres IronBarcode MAUI .
Référence de mappage d'API
| BarcodeLib | Code-barres IronBarcode |
|---|---|
new Barcode() |
API statique — aucune instance requise |
b.Encode(TYPE.CODE128, "data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
b.IncludeLabel = true |
.AddAnnotationTextBelowBarcode("text") |
b.Largeur = 300; b. Hauteur = 100 |
.ResizeTo(300, 100) |
Retours System.Drawing.Image |
.SaveAsPng(path) / .ToPngBinaryData() |
TYPE.CODE128 |
BarcodeEncoding.Code128 |
TYPE.CODE39 |
BarcodeEncoding.Code39 |
TYPE.EAN13 |
BarcodeEncoding.EAN13 |
TYPE.UPCA |
BarcodeEncoding.UPCA |
TYPE.QR_Code |
BarcodeEncoding.QRCode (également QRCodeWriter) |
| API de lecture indisponible | BarcodeReader.Read(path) |
| Conflit de versions de SkiaSharp dans MAUI | Aucune dépendance conflictuelle |
Quand les équipes envisagent de passer de BarcodeLibà IronBarcode
Exigence de lecture
Un système qui génère des étiquettes d'expédition depuis des mois se voit confier une nouvelle exigence : l'application doit également traiter les étiquettes retournées par les fournisseurs. L'intégration de l'entrepôt doit analyser les codes-barres figurant sur les manifestes d'expédition entrants. Un système de gestion documentaire doit indexer les codes-barres présents sur les fichiers PDF numérisés. BarcodeLibne répond à aucune de ces exigences : l'API de lecture n'existe pas. L'équipe évalue la possibilité d'ajouter ZXing .NET en plus de BarcodeLib, en tenant compte de la charge de maintenance que représenterait une double bibliothèque et des deux graphes de dépendances distincts, et conclut que la solution la plus simple consiste à utiliser une bibliothèque qui gère à la fois la génération et la lecture via une seule installation NuGet .
Conflit SkiaSharp dans un projet MAUI
Une équipe ajoute BarcodeLibà une application MAUI existante et rencontre immédiatement des avertissements NU1608 lors de la restauration. Ils enquêtent, identifient le décalage de version entre la gamme SkiaSharp attendue de BarcodeLibet la version requise par MAUI, ajoutent des dérogations explicites <PackageReference> pour forcer une résolution, et réussissent à faire passer la compilation. Ils rencontrent alors un plantage lors de l'exécution sur l'appareil lorsque les binaires natifs de SkiaSharp chargent la mauvaise version. La correction nécessite une analyse plus approfondie du journal de liaison de l'assemblage. Passer à Code-barres IronBarcode élimine le conflit à la source, non pas en trouvant une version compatible de SkiaSharp, mais en supprimant complètement la dépendance partagée.
Traitement des codes-barres PDF requis
Les applications qui génèrent des documents PDF avec des codes-barres intégrés (factures, bons de commande, manifestes d'expédition) doivent parfois relire ces codes-barres lors du traitement en aval. BarcodeLibgénère des images de codes-barres mais ne prend pas en charge le format PDF à aucune des deux extrémités. La lecture des codes-barres à partir d'un PDF avec BarcodeLibnécessite d'abord de convertir le PDF en images à l'aide d'une bibliothèque PDF distincte, puis de transmettre ces images à une bibliothèque de lecture distincte. Code-barres IronBarcode gère la chaîne complète de manière native : BarcodeReader.Read("file.pdf") traverse chaque page et renvoie tous les codes-barres détectés sans étape de rendu intermédiaire.
Les fonctionnalités des codes QR dépassent celles de la génération de base.
Les projets qui nécessitaient initialement uniquement la génération de codes QR basiques évoluent souvent vers le besoin d'intégrer un logo, de personnaliser les couleurs ou de configurer le niveau de correction d'erreurs. BarcodeLibsupporte les codes QR à travers TYPE.QR_Codemais ne fournit pas d'options au-delà des propriétés standard Width, Height, et IncludeLabel. Le QRCodeWriter d'IronBarcode expose l'intégration de logos, le contrôle des couleurs et le réglage de la correction des erreurs par le biais de méthodes enchaînées. Les équipes dont les besoins en matière de codes QR dépassent les capacités de l'implémentation de base de BarcodeLibconstatent que ce manque de fonctionnalités est le principal facteur déterminant leur décision de migration.
Considérations courantes en matière de migration
API d'instance vers API Fluent statique
Le code de BarcodeLibutilise un modèle d'objet mutable : créer une instance Barcode, définir les propriétés, appeler Encode(). Code-barres IronBarcode utilise un modèle statique fluide : appeler BarcodeWriter.CreateBarcode(), enchaîner les méthodes de configuration, terminer par une méthode de sortie. Le code existant qui stocke une instance Barcode en tant que champ ou qui la transmet entre les méthodes devra être restructuré. La modification typique consiste à remplacer le bloc de définition de propriété par une chaîne de méthodes :
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.SaveAsPng(outputPath);
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.SaveAsPng(outputPath);
System.Drawing.Image vers la sortie directe
BarcodeLib renvoie System.Drawing.Image, qui nécessite MemoryStream pour produire des octets. Tout code tapé à Image ou System.Drawing.Image devra être mis à jour. La chaîne fluide d'IronBarcode se termine directement par le format de sortie souhaité - .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() - en supprimant le besoin de l'objet image intermédiaire et de l'étape MemoryStream.
TYPE Enum vers BarcodeEncoding Enum
BarcodeLib utilise la classe TYPE avec des constantes en majuscules telles que TYPE.CODE128. Code-barres IronBarcode utilise l'enum BarcodeEncoding avec des valeurs PascalCase telles que BarcodeEncoding.Code128. Les valeurs correspondent directement. Une recherche de TYPE\. dans les fichiers .cs identifie toutes les occurrences nécessitant une mise à jour, et une recherche et un remplacement systématiques couvrent les formats courants : CODE128 → Code128, EAN13 → EAN13, @@--CODE-25657--@ → UPCA, QR_Code → QRCode.
Nettoyage de référence SkiaSharp
Les projets qui ont ajouté des entrées <PackageReference Include="SkiaSharp"> explicites uniquement pour résoudre les avertissements NU1608 de BarcodeLibpeuvent supprimer ces dérogations après avoir basculé vers IronBarcode. La commande dotnet list package --include-transitive confirme si SkiaSharp est toujours requis par d'autres paquets dans le projet avant de le supprimer.
Fonctionnalités supplémentaires IronBarcode
Au-delà de la génération directe et de la comparaison de lecture, Code-barres IronBarcode inclut des fonctionnalités que BarcodeLibne propose pas :
- Intégration de logo de code QR:
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")intègre le logo d'une marque au centre d'un code QR avec ajustement automatique de la correction des erreurs - Extraction de codes-barres de PDF:
BarcodeReader.Read("file.pdf")lit les codes-barres de chaque page d'un document PDF sans bibliothèque de rendu PDF séparée - Détection multi-codes-barres:
BarcodeReaderOptions.ExpectMultipleBarcodes = truedétecte et renvoie tous les codes-barres présents dans une seule image - Configuration de la vitesse de lecture:
ReadingSpeed.Faster,ReadingSpeed.Balanced, etReadingSpeed.ExtremeDetailrèglent le moteur de balayage en fonction du débit par rapport à la précision - Génération de codes QR stylisés: La couleur, le style du motif de recherche et le niveau de correction des erreurs sont configurables par le biais de méthodes enchaînées sur
QRCodeWriter - Entrée de flux et de bitmap pour la lecture:
BarcodeReader.Read()accepte les chemins de fichiers, les flux,System.Drawing.Bitmap, et les entréesAnyBitmap
Compatibilité .NET et préparation à l'avenir
IronBarcode prend en charge .NET Framework 4.6.2 à .NET 9 et maintient un rythme de publication régulier aligné sur le calendrier de publication de Microsoft .NET . Avec l'adoption croissante de .NET 10 jusqu'en 2026, le développement actif d'IronBarcode garantit la compatibilité ascendante sans nécessiter de modifications du projet. La bibliothèque fonctionne sans modification sous Windows, Linux, macOS, Docker, Azure et AWS Lambda. BarcodeLibbénéficie également d'un développement communautaire actif, bien que sa prise en charge multiplateforme dans la série 3.x dépende de la compatibilité de la version de SkiaSharp abordée dans les sections de comparaison ci-dessus. Pour les projets ciblant les versions modernes de .NET sur Linux ou dans des conteneurs, l'architecture multiplateforme sans dépendance d'IronBarcode évite la négociation de version introduite par le backend SkiaSharp de BarcodeLib.
Conclusion
BarcodeLib et Code-barres IronBarcode représentent différentes solutions pour la gestion des codes-barres en .NET. BarcodeLibest une bibliothèque gratuite, spécialisée dans la génération de codes, qui a rempli sa fonction de manière fiable pendant près de deux décennies. Code-barres IronBarcode est une bibliothèque commerciale qui couvre à la fois la génération et la lecture, avec une API statique fluide et sans dépendance à SkiaSharp. La différence ne réside pas dans la qualité au sein d'un périmètre commun, mais dans le périmètre lui-même.
BarcodeLib reste un choix tout à fait approprié pour les projets ayant des exigences stables et limitées à la génération sous Fenêtresou dans des environnements où le paysage des versions de SkiaSharp est contrôlé. Sa licence Apache 2.0, son coût nul et son API simple en font une solution pratique pour les systèmes d'étiquetage d'expédition, les générateurs d'étiquettes d'inventaire et les applications similaires qui n'auront jamais besoin de scanner de codes-barres. Les 12 millions de téléchargements témoignent du fait qu'une grande partie des développeurs .NET ont précisément ce cas d'utilisation.
IronBarcode devient le choix le plus pratique lorsque les exigences vont au-delà de la simple génération d'images : lorsque la capacité de lecture est nécessaire, lorsque le projet est une application MAUI ou multiplateforme où des conflits de versions de SkiaSharp sont probables, lorsque le traitement des codes-barres PDF est prévu, ou lorsque des fonctionnalités de code QR au-delà de la génération de base sont requises. Le coût de la licence commerciale représente la question fondamentale : pour les équipes dont les besoins correspondent à ce Code-barres IronBarcode apporte par rapport à BarcodeLib, la solution tout-en-un et le SLA commercial constituent l'échange de valeur.
Le constat honnête est que la plupart des équipes ne commencent pas avec Code-barres IronBarcode dès le départ. Ils commencent par BarcodeLibcar c'est gratuit et suffisant. Ils migrent vers Code-barres IronBarcode lorsque leurs besoins dépassent les capacités de génération limitée de BarcodeLib. La migration est bien documentée et les modifications de l'interface API sont prévisibles. Comprendre où s'arrête BarcodeLib— et plus précisément qu'il s'arrête à la génération — est l'information pratique nécessaire pour prendre la bonne décision en matière de timing.
Questions Fréquemment Posées
Qu'est-ce que BarcodeLib ?
BarcodeLib est une bibliothèque de codes-barres .NET permettant de générer et de lire des codes-barres dans des applications C#. C'est l'une des nombreuses alternatives que les développeurs évaluent lorsqu'ils choisissent une solution de code-barres pour les projets .NET.
Quelles sont les principales différences entre BarcodeLib et IronBarcode ?
IronBarcode utilise une API statique, sans état, ne nécessitant aucune gestion d'instance, alors que BarcodeLib nécessite généralement la création et la configuration d'une instance avant utilisation. IronBarcode offre également une prise en charge native du format PDF, une détection automatique du format et une licence à clé unique pour tous les environnements.
IronBarcode est-il plus facile à licencier que BarcodeLib ?
IronBarcode utilise une clé de licence unique couvrant à la fois les déploiements de développement et de production. Cela simplifie les pipelines CI/CD et les configurations Docker par rapport aux systèmes de licence qui séparent les clés SDK des clés d'exécution.
IronBarcode prend-il en charge tous les formats de codes-barres que BarcodeLib prend en charge ?
IronBarcode prend en charge plus de 30 symbologies de codes-barres, notamment QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1, et bien d'autres encore. L'auto-détection du format signifie qu'aucune énumération explicite du format n'est nécessaire.
IronBarcode prend-il en charge la lecture de codes-barres PDF en mode natif ?
Oui. IronBarcode lit les codes-barres directement à partir de fichiers PDF en utilisant BarcodeReader.Read("document.pdf") sans nécessiter de bibliothèque de rendu PDF séparée. Les résultats par page comprennent le numéro de page, le format du code-barres, la valeur et le score de confiance.
Comment IronBarcode gère-t-il le traitement par lots par rapport à BarcodeLib ?
Les méthodes statiques d'IronBarcode sont sans état et naturellement à l'abri des threads, ce qui permet d'utiliser directement Parallel.ForEach sans gestion d'instance par thread. Il n'y a pas de plafond de débit, quel que soit le niveau de prix.
Quelles versions de .NET sont prises en charge par IronBarcode ?
IronBarcode prend en charge .NET Framework 4.6.2+, .NET Core 3.1 et .NET 5, 6, 7, 8 et 9 dans un seul package NuGet. Les plates-formes visées sont Windows x64/x86, Linux x64 et macOS x64/ARM.
Comment installer IronBarcode for .NET dans un projet .NET ?
Installez IronBarcode via NuGet : exécutez "Install-Package IronBarCode" dans la console du gestionnaire de paquets, ou "dotnet add package IronBarCode" dans le CLI. Aucun installateur SDK ou fichier d'exécution supplémentaire n'est nécessaire.
Puis-je évaluer IronBarcode avant l'achat, contrairement à BarcodeLib ?
Oui. Le mode d'essai d'IronBarcode renvoie des valeurs de code-barres décodées complètes - seules les images de sortie générées reçoivent un filigrane. Vous pouvez comparer la précision de lecture sur vos propres documents avant de vous engager dans un achat.
Quelle est la différence de prix entre BarcodeLib et IronBarcode ?
IronBarcode est proposé à partir de 749 dollars pour une licence perpétuelle pour un seul développeur couvrant le développement et la production. Les détails des prix et les options de volume sont disponibles sur la page de licence d'IronBarcode. Il n'est pas nécessaire de disposer d'une licence d'exécution distincte.
Est-il simple de migrer de BarcodeLib à IronBarcode ?
La migration de BarcodeLib vers IronBarcode implique principalement le remplacement des appels d'API basés sur les instances par les méthodes statiques d'IronBarcode, la suppression du boilerplate de licence et la mise à jour des noms de propriétés des résultats. La plupart des migrations impliquent une réduction du code plutôt qu'un ajout.
IronBarcode génère-t-il des codes QR avec des logos ?
Oui. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") incorpore une image de marque dans un code QR de manière native avec une correction d'erreur configurable. Les codes QR colorés sont également pris en charge via ChangeBarCodeColor().

