Passer au contenu du pied de page
COMPARER à D'AUTRES COMPOSANTS

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 Barcode et la configuration des propriétés d'étiquette et de police avant d'appeler Encode()
  • Retourne SKImage : La sortie est un objet image SkiaSharp, qui nécessite une étape SKEncodedImageFormat et 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.Type sur 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.Common par 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
$vbLabelText   $csharpLabel

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 : BarcodeWriter gère la génération ; BarcodeReader gè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() retourne byte[] sans étape MemoryStream
  • 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 : BarcodeReaderOptions permet 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
$vbLabelText   $csharpLabel

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

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

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

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>
XML

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

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 : Code128Code128, Ean13EAN13, UpcAUPCA, Code39Code39. 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 :

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().

Curtis Chau
Rédacteur technique

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

Lire la suite

Équipe de soutien Iron

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