Accusoft BarcodeXpress vs IronBarcode : Comparaison de la bibliothèque de codes-barres C#
BarcodeLibvs Code-barres IronBarcode : Où s'arrête le générateur open source
BarcodeLib est une bibliothèque .NET open source de longue date que la plupart des développeurs découvrent éventuellement qu'elle ne peut que créer des codes-barres. Une partie d'entre eux découvre également le conflit de version de 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 construction commence à générer des avertissements NU1608. Cet article couvre les deux problèmes. 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. Elle est active depuis 2007 et prend en charge environ 30 variantes de symbologies 1D. La licence Apache 2.0 autorise son utilisation commerciale gratuite. Pour la génération pure de codes-barres linéaires - créant une image à partir d'une chaîne - elle fonctionne de manière fiable et a bien servi ce but au fil des 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, une chaîne de données et des dimensions en pixels. Le résultat est un SKImage (SkiaSharp) que vous encodez ensuite et enregistrez ou diffusez selon les besoins. Ce flux de travail est abordable, et pour les projets où l'exigence est strictement d'imprimer des images de codes-barres linéaires - étiquettes d'expédition, étiquettes d'inventaire, étiquettes de prix au 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
- API basée sur une instance : Chaque opération nécessite l'instanciation d'un objet
Barcodeet la configuration des propriétés d'étiquette et de police avant d'appelerEncode() - Retourne
SKImage: La sortie est un objet image SkiaSharp, qui nécessite une étapeSKEncodedImageFormatet un flux pour produire un fichier ou un tableau d'octets - Symbologies uniquement 1D: Prend en charge environ 30 formats linéaires, y compris Code128, EAN-13, UPC-A, et Code39; l'énumération
BarcodeStandard.Typesur la source actuelle 3.x ne contient aucun code QR, Data Matrix, PDF417, Aztec, ou autre entrée 2D - Dépendance SkiaSharp (v3.x) : La série 3.x a remplacé
System.Drawing.Commonpar SkiaSharp pour permettre la prise en charge 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 BarcodeLibnécessite de créer une instance, de configurer des propriétés, et d'appeler Encode() avec des dimensions :
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
Imports BarcodeStandard
Imports SkiaSharp
Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)
Using stream = File.OpenWrite("barcode.png")
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
Voici le flux de travail de génération complet. Le modèle d'affectation de propriétés est la conception : la configuration se fait sur l'instance avant l'appel Encode(), et la valeur de retour est un SKImage qui doit être encodé et écrit dans un flux.
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 se chaînent sur le 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 MemoryStream intermédiaire que BarcodeLibnécessite. 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 au sein d'un même package :
BarcodeWritergère la génération ;BarcodeReadergère 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()en utilisant des méthodes fluides - Sortie directe de tableau d'octets :
.ToPngBinaryData()retournebyte[]sans étapeMemoryStream - Prise en charge PDF des deux côtés :
BarcodeReader.Read()accepte nativement les fichiers PDF ; 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
- Réglage
ReadingSpeed:BarcodeReaderOptionspermet d'échanger la minutie du scan pour des performances à volume
Comparaison des fonctionnalités
| Fonction | BarcodeLib | Code-barres IronBarcode |
|---|---|---|
| génération de codes-barres | Oui (1D uniquement) | Oui (1D et 2D) |
| Lecture de codes-barres | Non | Oui |
| 2D symbologies (QR, Data Matrix, PDF417, Aztec) | Non | Oui |
| lecture de codes-barres PDF | Non | Oui |
| Dépendance SkiaSharp dans le graphique | 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 | Non | Oui (avec intégration de logo) |
| Matrice de données / PDF417 / Aztèque | Non | Oui |
| Couverture de symbologie 1D | ~30 variantes | 30+ variantes |
| API de génération chaînable fluide | Non | Oui |
Sortie byte[] directe |
Manuel (encodage de flux) | .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 (énumération ReadingSpeed) |
| 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 APIs de génération représentent différentes philosophies de conception : BarcodeLibutilise une configuration d'instance mutable tandis qu'IronBarcode utilise une chaîne fluide sur un point d'entrée statique.
Approche BarcodeLib
BarcodeLib nécessite de construire une instance et de définir des propriétés avant d'appeler Encode() avec des dimensions. La sortie est un SKImage :
using BarcodeStandard;
using SkiaSharp;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
using BarcodeStandard;
using SkiaSharp;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
Imports BarcodeStandard
Imports SkiaSharp
Public Function GenerateCode128(data As String) As Byte()
Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return ms.ToArray()
End Using
End Function
Le type de retour SKImage signifie que la sortie de tableau d'octets nécessite un appel d'encodage SKEncodedImageFormat et un MemoryStream. La propriété IncludeLabel est un interrupteur boolean — BarcodeLibrend 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)
.AddBarcodeValueTextBelowBarcode()
.ToPngBinaryData();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.ToPngBinaryData();
}
Imports IronBarCode
Public Function GenerateCode128(data As String) As Byte()
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.AddBarcodeValueTextBelowBarcode() _
.ToPngBinaryData()
End Function
.ToPngBinaryData() retourne directement le tableau d'octets — pas d'objet Image ou MemoryStream intermédiaire. .AddBarcodeValueTextBelowBarcode() rend la chaîne de données encodée comme étiquette 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(). 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 :
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png"); // does not exist
// b.Scan("barcode.png"); // does not exist
// b.ReadBarcode("barcode.png"); // does not exist
// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png"); // does not exist
// b.Scan("barcode.png"); // does not exist
// b.ReadBarcode("barcode.png"); // does not exist
// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
Imports BarcodeStandard
Imports SkiaSharp
Dim b = New Barcode()
' There is no Decode, Scan, or Read method on Barcode.
' b.Decode("barcode.png") ' does not exist
' b.Scan("barcode.png") ' does not exist
' b.ReadBarcode("barcode.png") ' does not exist
' The only public operation is generation:
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)
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 d'image, 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 d'ajuster les performances de scan pour les scénarios à haut volume. 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 comme backend graphique pour remplacer System.Drawing.Common, devenu exclusif à Fenêtresaprès .NET 6. BarcodeLib3.1.5 déclare SkiaSharp >= 2.88.8. Si un projet utilise déjà SkiaSharp via une autre dépendance — courant dans les projets MAUI utilisant SkiaSharp.Views.Maui et Microsoft.Maui.Graphics, qui tendent vers SkiaSharp 3.x — les versions résolues peuvent ne pas converger. Le résultat est au minimum un avertissement NU1608 et au pire un échec de liaison d'assembly lors de l'exécution :
warning NU1608: Detected package version outside of dependency constraint:
BarcodeLib 3.1.5 requires SkiaSharp (>= 2.88.8) but
version SkiaSharp 3.116.1 was resolved.
Forcer une résolution via des références de package explicites est une option, bien que cela ne garantisse pas la compatibilité à l'exécution :
<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 substituts explicites, la compatibilité dépend du fait que les appels d'API internes de BarcodeLibcorrespondent à ce que la version résolue de SkiaSharp expose. En tant que projet maintenu par la communauté, BarcodeLibn'a pas de contrat de support commercial attaché à son rythme de sortie.
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(BarcodeStandard.Type.Code128, "data", 300, 100) |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).ResizeTo(300, 100) |
b.IncludeLabel = true |
.AddBarcodeValueTextBelowBarcode() |
Retourne SKImage |
.SaveAsPng(path) / .ToPngBinaryData() |
BarcodeStandard.Type.Code128 |
BarcodeEncoding.Code128 |
BarcodeStandard.Type.Code39 |
BarcodeEncoding.Code39 |
BarcodeStandard.Type.Ean13 |
BarcodeEncoding.EAN13 |
BarcodeStandard.Type.UpcA |
BarcodeEncoding.UPCA |
| Non supporté (pas de 2D dans BarcodeLib) | BarcodeEncoding.QRCode (également QRCodeWriter) |
| API de lecture indisponible | BarcodeReader.Read(path) |
| SkiaSharp dans le graphique de dépendance | Pas de dépendance SkiaSharp |
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 investiguent, identifient le désaccord de version entre l'intervalle SkiaSharp attendu par BarcodeLibet la version requise par MAUI, ajoutent des remplacements explicites <PackageReference> pour forcer une résolution, et réussissent à valider la build. 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 nativement : BarcodeReader.Read("file.pdf") parcourt chaque page et renvoie tous les codes-barres détectés sans étape de rendu intermédiaire.
Option de code QR ou autre symbologie 2D apparaît
Les projets qui nécessitaient initialement uniquement des codes-barres linéaires évoluent souvent pour nécessiter une sortie en code QR, Data Matrix, PDF417, ou Aztec. BarcodeLibne génère aucune symbologie 2D dans sa série 3.x — l'énumération BarcodeStandard.Type ne contient aucun code QR ou autre entrée 2D — donc toute exigence 2D signifie ajouter une seconde bibliothèque ou remplacer BarcodeLibcomplètement. Les QRCodeWriter et BarcodeWriter d'IronBarcode couvrent le code QR (avec intégration de logo, contrôle de couleur, et réglage de correction d'erreurs), Data Matrix, PDF417, et Aztec via la même API fluide. Les équipes dont les exigences de symbologie passent en 2D trouvent que l'écart motive la décision de migration.
Considérations courantes en matière de migration
API d'instance vers API Fluent statique
Le code BarcodeLibutilise un modèle d'objet mutable : créez une instance Barcode, définissez des propriétés, appelez Encode(). Code-barres IronBarcode utilise un modèle fluide statique : appelez BarcodeWriter.CreateBarcode(), chaînez les méthodes de configuration, terminez par une méthode de sortie. Le code existant qui stocke une instance Barcode comme champ ou la transmet entre méthodes nécessitera une restructuration. 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)
.AddBarcodeValueTextBelowBarcode()
.SaveAsPng(outputPath);
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.SaveAsPng(outputPath);
' The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.AddBarcodeValueTextBelowBarcode() _
.SaveAsPng(outputPath)
SKImage à sortie directe
BarcodeLib 3.x retourne SKImage, qui nécessite SKEncodedImageFormat et un flux pour produire des octets. Tout code typé à SKImage ou passant par image.Encode(...).SaveTo(stream) nécessitera une mise à jour. La chaîne fluide d'IronBarcode se termine directement par le format de sortie souhaité — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — éliminant le besoin de l'objet image intermédiaire et de l'étape d'encodage en flux.
Type Enum à Enum BarcodeEncoding
BarcodeLib 3.x utilise l'énumération BarcodeStandard.Type avec des valeurs PascalCase telles que BarcodeStandard.Type.Code128. Code-barres IronBarcode utilise l'énumération BarcodeEncoding avec des valeurs telles que BarcodeEncoding.Code128. Les valeurs 1D se mappent directement : Code128 → Code128, Ean13 → EAN13, UpcA → UPCA, Code39 → Code39. Un grep pour BarcodeStandard.Type. à travers les fichiers .cs identifie toutes les occurrences nécessitant une mise à jour.
Nettoyage de référence SkiaSharp
Les projets ayant ajouté des entrées explicites <PackageReference Include="SkiaSharp"> uniquement pour résoudre les avertissements NU1608 de BarcodeLibpeuvent supprimer ces remplacements après le passage à IronBarcode. La commande dotnet list package --include-transitive confirme si SkiaSharp est toujours requis par d'autres packages 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 dans le code QR :
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")intègre un logo de marque au centre d'un code QR avec ajustement automatique de la correction d'erreurs - Extraction de code-barres 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 de code-barres multiples :
BarcodeReaderOptions.ExpectMultipleBarcodes = truedétecte et retourne tous les codes-barres présents dans une seule image - Configuration de la vitesse de lecture :
ReadingSpeed.Faster,ReadingSpeed.Balanced, etReadingSpeed.ExtremeDetailajustent le moteur de scan pour le débit par rapport à la précision - Génération de code QR stylisé : La couleur, le style du modèle de recherche et le niveau de correction d'erreurs sont configurables via des méthodes en chaîne sur
QRCodeWriter - Entrée Stream et Bitmap pour la lecture :
BarcodeReader.Read()accepte les chemins de fichiers, les flux,System.Drawing.Bitmap, etAnyBitmapentrées
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 approprié pour les projets avec des exigences stables, de génération linéaire uniquement sur Fenêtresou dans des environnements où le paysage des versions SkiaSharp est contrôlé. Son licence Apache 2.0, son coût nul et son API simple en font une solution pratique pour les systèmes d'étiquettes d'expédition, les générateurs de balises d'inventaire, et des applications similaires qui n'auront jamais besoin de numériser des codes-barres ou de produire des symbologies 2D.
IronBarcode devient le choix le plus pratique lorsque les exigences vont au-delà de la génération d'images linéaires : lorsque des capacités de lecture sont nécessaires, lorsque le projet est une application MAUI ou multiplateforme où des conflits de version SkiaSharp sont probables, lorsque le traitement des codes-barres PDF est sur la feuille de route, ou lorsque toute symbologie 2D (Code QR, Data Matrix, PDF417, Aztec) est requise. Le coût de licence commerciale représente la question de seuil - pour les équipes dont les exigences s'alignent avec ce que Code-barres IronBarcode ajoute par rapport à BarcodeLib, la solution à package unique et le support 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 Package Manager, 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().

