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

Dynamsoft Barcode Reader vs IronBarcode : Comparaison de la bibliothèque de codes-barres C#

Code-barres Infragistics vs IronBarcode: Lecteur WPF-Uniquement vs API Indépendante de la Plateforme

La lecture des codes-barres Infragistics fonctionne sous WPF. Pour y parvenir, il faut une instance BarcodeReader, un gestionnaire d'événements DecodeComplete, un TaskCompletionSource<string> pour faire le pont entre le rappel et le code asynchrone, un chargement BitmapImage à partir d'un URI, et un OU bit-à-bit de chaque famille Symbology que vous souhaitez prendre en charge — passé comme deuxième argument à Decode(). Omettez une famille — par exemple, laissez Symbology.QRCode hors des drapeaux — et tout code-barres QR dans vos images renvoie silencieusement rien. Sans exception. Aucun avertissement. Résultat vide.

C'est le côté WPF. Du côté WinForms, le package Infragistics.Win.UltraWinBarcode contient des contrôles de génération mais aucune classe de lecteur. Si vous devez lire des codes-barres dans un projet WinForms, le package de codes-barres Infragistics ne contient aucune fonction à appeler. Il en va de même pour tout contrôleur ASP.NET Core, outil console, fonction Azure, composant Serveur Blazor ou conteneur Docker. La prise en charge des codes-barres Infragistics existe dans les limites du framework d'interface utilisateur : WPFbénéficie de la génération et de la lecture pilotée par les événements ; WinFormsne génère que des formulaires ; Tout le reste ne reçoit rien.

Cette comparaison examine ce que cette séparation signifie en pratique, puis analyse comment Code-barres IronBarcode gère le même travail avec une seule API statique qui se comporte de manière identique pour tous les types de projets.

Comprendre la prise en charge des codes-barres Infragistics

Infragistics est l'un des fournisseurs de composants d'interface utilisateur .NET les plus établis. La Suite Infragistics Ultimate — l'abonnement incluant la gestion des codes-barres — propose des centaines de contrôles pour WinForms, WPF, ASP.NET, Blazor et applications mobiles. Pour les équipes utilisant déjà les grilles, graphiques ou planificateurs Infragistics, l'ajout de ces contrôles de codes-barres est tout à fait logique : elles paient déjà leur abonnement.

La prise en charge des codes-barres ne repose cependant pas sur une bibliothèque unifiée. Il s'agit de deux ensembles distincts dotés de capacités différentes qui ne se chevauchent que partiellement.

WinForms : UltraWinBarcode

Le package Infragistics.Win.UltraWinBarcode fournit la génération de code-barres dans les applications WinFormsvia la classe UltraWinBarcode. L'API est simple :

// Infragistics WinFormsgeneration
using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
// Infragistics WinFormsgeneration
using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
Imports Infragistics.Win.UltraWinBarcode

Dim barcode As New UltraWinBarcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.SaveTo(outputPath)
$vbLabelText   $csharpLabel

Vous définissez une symbologie, attribuez des données, appelez SaveTo(). Cela fonctionne pour les scénarios de génération uniquement dans WinForms. L'énumération Symbology couvre les formats courants : Code128, Code39, QR, EAN13, et d'autres.

Ce qui manque dans cette assemblée, c'est un lecteur. Il n'y a pas de classe UltraBarcodeReader. Il n'y a pas de méthode Scan(). Si vous essayez de lire une image de code-barres dans une application WinFormsen utilisant uniquement le package Infragistics.Win.UltraWinBarcode, il n'y a rien à appeler.

WPF : XamBarcode et BarcodeReader

Le côté WPFinclut à la fois un contrôle de génération (XamBarcode) et une classe de lecteur distincte (BarcodeReader dans Infragistics.Controls.Barcodes, de l'assembly Infragistics.WPF.BarcodeReader). Le lecteur est piloté par les événements et conçu autour du modèle de threading et d'imagerie WPF.

Lire un code-barres dans WPFnécessite de connecter l'événement DecodeComplete, de charger les images en tant qu'objets BitmapSource plutôt que par chemins de fichiers, et de convertir le schéma de rappel en quelque chose d'attendable si votre code est asynchrone.

ASP.NET Core, Console, Docker : Rien

Il n'existe aucun package de code-barres Infragistics qui cible net8.0 sans les assemblages d'interface utilisateur WPFou WinForms. Les projets ASP.NET Core, les outils de console, Azure Functions, Serveur Blazor et les conteneurs Docker Linux ne disposent pas de l'option de code-barres Infragistics. La bibliothèque est intégrée au framework d'interface utilisateur.

Modèle de lecture WPF

Voici à quoi ressemble concrètement la lecture d'un code-barres en WPFavec Infragistics :

// Infragistics WPFreading: event-driven, requires WPFassemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;

private BarcodeReader _reader;
private TaskCompletionSource<string> _result;

public InfragisticsBarcodeService()
{
    _reader = new BarcodeReader();
    _reader.DecodeComplete += OnDecodeComplete;
}

public async Task<string> ReadBarcodeAsync(string imagePath)
{
    _result = new TaskCompletionSource<string>();

    // Load as WPFBitmapSource — not a file path
    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    // Build the Symbology flags. The enum is [Flags];
    // EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
    // and Code 39 is exposed as Code39Ext. Use Symbology.All
    // to search every supported family.
    var symbologies = Symbology.Code128 |
                      Symbology.Code39Ext |
                      Symbology.QRCode |
                      Symbology.EanUpc |
                      Symbology.Interleaved2Of5;

    // Symbology is the second argument to Decode/DecodeAsync,
    // not a property on the reader. Result comes via callback.
    _reader.DecodeAsync(bitmap, symbologies);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbolFound ? e.Value : "No barcode found");
}

public void Dispose()
{
    if (_reader != null)
    {
        _reader.DecodeComplete -= OnDecodeComplete;
        _reader = null;
    }
}
// Infragistics WPFreading: event-driven, requires WPFassemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;

private BarcodeReader _reader;
private TaskCompletionSource<string> _result;

public InfragisticsBarcodeService()
{
    _reader = new BarcodeReader();
    _reader.DecodeComplete += OnDecodeComplete;
}

public async Task<string> ReadBarcodeAsync(string imagePath)
{
    _result = new TaskCompletionSource<string>();

    // Load as WPFBitmapSource — not a file path
    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    // Build the Symbology flags. The enum is [Flags];
    // EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
    // and Code 39 is exposed as Code39Ext. Use Symbology.All
    // to search every supported family.
    var symbologies = Symbology.Code128 |
                      Symbology.Code39Ext |
                      Symbology.QRCode |
                      Symbology.EanUpc |
                      Symbology.Interleaved2Of5;

    // Symbology is the second argument to Decode/DecodeAsync,
    // not a property on the reader. Result comes via callback.
    _reader.DecodeAsync(bitmap, symbologies);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbolFound ? e.Value : "No barcode found");
}

public void Dispose()
{
    if (_reader != null)
    {
        _reader.DecodeComplete -= OnDecodeComplete;
        _reader = null;
    }
}
Imports Infragistics.Controls.Barcodes
Imports System.Windows.Media.Imaging
Imports System.Threading.Tasks

Private _reader As BarcodeReader
Private _result As TaskCompletionSource(Of String)

Public Sub New()
    _reader = New BarcodeReader()
    AddHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
End Sub

Public Async Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
    _result = New TaskCompletionSource(Of String)()

    ' Load as WPFBitmapSource — not a file path
    Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))

    ' Build the Symbology flags. The enum is [Flags];
    ' EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
    ' and Code 39 is exposed as Code39Ext. Use Symbology.All
    ' to search every supported family.
    Dim symbologies = Symbology.Code128 Or
                      Symbology.Code39Ext Or
                      Symbology.QRCode Or
                      Symbology.EanUpc Or
                      Symbology.Interleaved2Of5

    ' Symbology is the second argument to Decode/DecodeAsync,
    ' not a property on the reader. Result comes via callback.
    _reader.DecodeAsync(bitmap, symbologies)

    Return Await _result.Task
End Function

Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
    _result?.TrySetResult(If(e.SymbolFound, e.Value, "No barcode found"))
End Sub

Public Sub Dispose()
    If _reader IsNot Nothing Then
        RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
        _reader = Nothing
    End If
End Sub
$vbLabelText   $csharpLabel

Il faut environ 35 lignes d'infrastructure pour lire un seul code-barres. Comptez ce qui se passe réellement :

  1. Une instance BarcodeReader est créée et maintenue en vie en tant que champ.
  2. Un gestionnaire d'événements est intégré dans le constructeur.
  3. Chaque appel à ReadBarcodeAsync crée un nouveau TaskCompletionSource<string> affecté à un champ partagé — ce qui signifie que ce service n'est pas sécurisé pour les threads tel qu'il est écrit. Les appels concurrents écraseraient _result.
  4. L'image doit être chargée en tant que BitmapImage à partir d'un Uri — pas une chaîne de chemin de fichier, pas un tableau d'octets, pas un flux.
  5. DecodeAsync() déclenche l'événement de manière asynchrone. Le TaskCompletionSource est le lien entre le monde des rappels et le monde async/await.
  6. Le rappel extrait e.Value lorsque e.SymbolFound est vrai.
  7. La méthode Dispose() doit détacher le gestionnaire d'événements pour éviter les fuites de mémoire.

Tout ce raisonnement n'a rien à voir avec les codes-barres. Il s'agit de l'infrastructure nécessaire pour fonctionner autour de la conception axée sur les événements. Dans le code de production, vous auriez également besoin de gérer le cas où _result.Task ne se termine jamais — un délai d'attente, un jeton d'annulation, ou une protection contre l'événement qui ne se déclenche jamais.

Le fossé WinForms

L'écart avec WinFormsest plus brutal qu'il n'y paraît au premier abord. Les équipes qui développent des applications WinFormsarrivent souvent sur la page des codes-barres d'Infragistics en s'attendant à une expérience symétrique : la génération et la lecture sur les deux frameworks d'interface utilisateur. Ce qu'ils découvrent c'est que Infragistics.Win.UltraWinBarcode ne fournit aucune capacité de lecture.

Il ne s'agit pas d'un oubli dans la documentation. L'assembly de code-barres WinFormsa été conçu comme un contrôle de génération. Si vous devez scanner des codes-barres dans une application WinForms(par exemple, lire un code-barres à partir d'un fichier image téléchargé par un utilisateur ou décoder un code-barres à partir d'un flux vidéo de caméra), vous ne pouvez pas le faire avec les outils de codes-barres d'Infragistics. Il faudrait alors faire appel à une bibliothèque entièrement distincte, ce qui affaiblirait la justification de l'utilisation d'Infragistics pour la génération.

L'asymétrie crée un écart de couverture pour les équipes exécutant des projets à cadre mixte. Une équipe disposant à la fois d'un client de bureau WPFet d'un client de bureau WinFormsne peut pas utiliser Infragistics pour la lecture des codes-barres dans le projet WinForms, même si elle utilise Infragistics partout ailleurs.

Spécification de la symbologie : un mode de défaillance silencieux

L'argument de drapeaux Symbology pour Decode() dans le lecteur WPFmérite sa propre section car son mode d'échec est silencieux : un drapeau manquant renvoie un résultat vide sans erreur.

Lorsque vous appelez dans le lecteur, vous ouez ensemble chaque famille de codes-barres que vous souhaitez rechercher. Les familles prises en charge sont QR, EAN/UPC (EanUpc), Code 39 (Code39Ext), Code 128, MaxiCode, et Interleaved 2 of 5 — DataMatrix n'est pas du tout dans l'énumération, donc le lecteur WPFne peut pas le décoder. Symbology.All couvre tout dans l'énumération :

// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
                  Symbology.Code39Ext |
                  Symbology.QRCode |
                  Symbology.EanUpc |
                  Symbology.Interleaved2Of5;

_reader.DecodeAsync(bitmap, symbologies);
// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
                  Symbology.Code39Ext |
                  Symbology.QRCode |
                  Symbology.EanUpc |
                  Symbology.Interleaved2Of5;

_reader.DecodeAsync(bitmap, symbologies);
' Build flags explicitly, or use Symbology.All to search every family
Dim symbologies = Symbology.Code128 Or
                  Symbology.Code39Ext Or
                  Symbology.QRCode Or
                  Symbology.EanUpc Or
                  Symbology.Interleaved2Of5

_reader.DecodeAsync(bitmap, symbologies)
$vbLabelText   $csharpLabel

Si une image de code-barres contient un QR code et que Symbology.QRCode ne figure pas dans les drapeaux, e.SymbolFound revient faux et e.Value est vide. L'événement de décodage se déclenche toujours. Aucune exception n'est levée. L'appelant reçoit le message " Code-barres introuvable " et n'a aucune indication quant à savoir si l'image était illisible ou simplement non configurée.

Concrètement, cela signifie :

  • La configuration initiale fonctionne correctement pour les formats testés par le développeur.
  • Un nouveau format de code-barres entre dans le système (un fournisseur change le type d'étiquette, une nouvelle gamme de produits utilise une symbologie différente).
  • Le lecteur échoue silencieusement pour toutes les images avec cette famille.
  • L'erreur affichée est identique à " l'image ne contient pas de code-barres " plutôt qu'à " format non configuré ".

Les équipes qui déboguent cela passent du temps à examiner la qualité de l'image avant de réaliser que la famille n'a jamais été dans la liste des drapeaux. DataMatrix est un cas plus net : il n'y a pas de drapeau à ajouter, car le lecteur WPFne le prend pas en charge du tout.

IronBarcode ne requiert pas d'argument de format. Il détecte automatiquement chaque format pris en charge à chaque lecture. Il n'y a pas de drapeau à oublier.

La matrice de la plateforme

L'écart de capacités entre les plateformes est la manière la plus claire de comprendre la contrainte architecturale :

Plateforme Génération Infragistics Lecture d'Infragistics Génération de Code-barres IronBarcode Lecture des Code-barres IronBarcode
WPF Contrôle XamBarcode Lecteur de codes-barres (piloté par les événements) Oui Oui
WinForms Code-barres UltraWin PAS DISPONIBLE Oui Oui
ASP.NET Core PAS DISPONIBLE PAS DISPONIBLE Oui Oui
Console PAS DISPONIBLE PAS DISPONIBLE Oui Oui
Serveur Blazor PAS DISPONIBLE PAS DISPONIBLE Oui Oui
Docker / Linux PAS DISPONIBLE PAS DISPONIBLE Oui Oui
Azure Functions PAS DISPONIBLE PAS DISPONIBLE Oui Oui

Ce tableau illustre pourquoi les équipes qui utilisent des applications autres que les applications de bureau WPFpures jugent la prise en charge des codes-barres d'Infragistics insuffisante. Dès qu'un projet s'étend sur WinFormset ASP.NET Core— ou WPFet un service de traitement en arrière-plan — la bibliothèque de codes-barres Infragistics ne couvre qu'une partie du code source.

Comprendre IronBarcode

IronBarcode est une bibliothèque de codes-barres dédiée à .NET , sans dépendance à WinForms, WPFou à tout autre framework d'interface utilisateur. Le même package NuGet , le même espace de noms et la même API fonctionnent dans n'importe quel projet .NET : WinForms, WPF, ASP.NET Core, console, Blazor Server, Docker, Azure Functions, AWS Lambda.

// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package BarCode
using IronBarCode;

// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package BarCode
using IronBarCode;

// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
Imports IronBarCode

' Read — 2 lines, any platform
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
$vbLabelText   $csharpLabel

BarcodeReader.Read() est une méthode statique. Aucune instance à gérer, aucun événement à connecter, aucun TaskCompletionSource pour faire le pont des schémas de rappel. Il accepte une chaîne de chemin de fichier, un tableau d'octets, un Stream, ou un tableau de l'un de ceux-ci pour le traitement par lots.

Pour la génération, BarcodeWriter.CreateBarcode() renvoie un objet code-barres que vous pouvez enregistrer en PNG, JPEG, SVG, ou obtenir sous forme de données binaires :

using IronBarCode;

// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .SaveAsPng("qr.png");
using IronBarCode;

// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .SaveAsPng("qr.png");
Imports IronBarCode

' Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
             .ResizeTo(400, 100) _
             .SaveAsPng("barcode.png")

' Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

L'initialisation de la licence a lieu au démarrage de l'application, une seule fois :

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Comparaison côte à côte : Traitement par lots

Le traitement par lots révèle une autre limitation structurelle du lecteur WPFd'Infragistics. Parce que le lecteur utilise un gestionnaire d'événements partagé et que le champ _result est écrasé à chaque appel, la classe de service montrée ci-dessus ne peut pas traiter en toute sécurité plusieurs images en même temps. Vous devez séquencer les appels :

// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// field mean concurrent calls would overwrite _result before the previous decode completes
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    // Each call must await before starting the next
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// field mean concurrent calls would overwrite _result before the previous decode completes
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    // Each call must await before starting the next
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}
Imports System.Collections.Generic
Imports System.Threading.Tasks

' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' field mean concurrent calls would overwrite _result before the previous decode completes
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()

For Each file In imageFiles
    ' Each call must await before starting the next
    Dim value As String = Await service.ReadBarcodeAsync(file)
    results.Add(value)
Next
$vbLabelText   $csharpLabel

Rendre cela concurrent nécessite une infrastructure supplémentaire significative : un verrou, une file d'attente, ou un sémaphore pour garantir que _result n'est pas écrasé pendant qu'un décodage précédent est encore en cours. Il s'agit d'un problème de concurrence non trivial pour ce qui devrait être une simple opération d'E/S.

Le BarcodeReader.Read() statique d'IronBarcode est sécurisé pour les threads. Elle peut être appelée simultanément depuis plusieurs threads sans aucune synchronisation supplémentaire. Pour les charges de travail par lots, vous pouvez utiliser Parallel.ForEach directement :

using IronBarCode;

// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var barcodeResults = BarcodeReader.Read(file);
    foreach (var result in barcodeResults)
    {
        results.Add(result.Value);
    }
});
using IronBarCode;

// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var barcodeResults = BarcodeReader.Read(file);
    foreach (var result in barcodeResults)
    {
        results.Add(result.Value);
    }
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

' IronBarcode: parallel batch with thread-safe static API
Dim results As New ConcurrentBag(Of String)()

Parallel.ForEach(imageFiles, Sub(file)
    Dim barcodeResults = BarcodeReader.Read(file)
    For Each result In barcodeResults
        results.Add(result.Value)
    Next
End Sub)
$vbLabelText   $csharpLabel

Vous pouvez également transmettre plusieurs fichiers en un seul appel et configurer le parallélisme via BarcodeReaderOptions :

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read(imageFiles, options)
For Each result In results
    Console.WriteLine($"{result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

Comparaison des fonctionnalités

Fonction Code-barres Infragistics Code-barres IronBarcode
Lecture de codes-barres WinForms Non disponible Oui
Lecture de codes-barres WPF Oui (piloté par les événements) Oui (synchrone)
Prise en charge ASP.NET Core Non disponible Oui
Service Console/Worker Non disponible Oui
Docker / Linux Non disponible Oui
Azure Functions Non disponible Oui
Serveur Blazor Non disponible Oui
Détection automatique du format Non — doit passer des drapeaux de symbologie à Decode() Oui — formats détectés automatiquement
lecture de codes-barres PDF Non disponible Oui, c'est natif, sans package supplémentaire.
Lecture sécurisée pour les fils de discussion Non (gestionnaire d'événements partagé) Oui (API statique)
API événementielle requise Oui (WPF) Non
Chargement explicite d'image (BitmapSource) Oui Non — accepte le chemin de fichier, les octets et le flux
Lecture synchrone Non (doit passer par TaskCompletionSource) Oui
Traitement par lots Séquentiel uniquement (non sécurisé en cas de concurrence) Parallélisation intégrée
Échecs de formatage silencieux Oui (famille de symbologie omise) Non
Dépendance de la Suite requise Oui — Abonnement Infragistics Ultimate Non — package autonome
Option de licence perpétuelle Non — abonnement annuel Oui
Coût approximatif de la licence Abonnement annuel (Infragistics Ultimate) À partir de 749 $ perpétuel (Lite)

Référence de mappage d'API

Conversion de WinForms(UltraWinBarcode) en IronBarcode

Infragistics WinForms- UltraWinBarcode Code-barres IronBarcode
new UltraWinBarcode() BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128 BarcodeEncoding.Code128 (paramètre pour CreateBarcode)
barcode.Data = "ITEM-12345" Premier argument de CreateBarcode()
barcode.SaveTo(outputPath) .SaveAsPng(outputPath)
Aucune API de lecture n'est disponible. BarcodeReader.Read(imagePath)

WPF(BarcodeReader) vers IronBarcode

Infragistics WPF— Lecteur de codes-barres Code-barres IronBarcode
new BarcodeReader() Classe statique — aucune instance nécessaire
_reader.DecodeComplete += OnDecodeComplete Pas nécessaire
_reader.DecodeAsync(bitmap, Symbology.X |Symbology.Y) Détection automatique — aucune configuration requise
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap, ...) BarcodeReader.Read(path)
e.Value (dans ReaderDecodeArgs) result.Value
e.Symbology (dans ReaderDecodeArgs) result.Format
TaskCompletionSource<string> emballage asynchrone Synchrone — aucun wrapper nécessaire
Dispose() — détacher le gestionnaire d'événements Inutile — aucune instance ni événement
Projet WPFuniquement Tout type de projet .NET

Quand les équipes changent

Plusieurs situations spécifiques incitent régulièrement les équipes à se détourner du support des codes-barres Infragistics.

Lecture requise dans WinForms. C'est le scénario le plus courant. Une application WinFormsgénère des codes-barres parfaitement avec UltraWinBarcode mais une nouvelle exigence arrive : scanner un code-barres à partir d'une image téléchargée ou valider une étiquette avant impression. Il n'existe pas d'API de lecture Infragistics pour WinForms. L'équipe utilise soit une deuxième bibliothèque, soit remplace le code de génération par un système qui fait les deux.

Nouvelle API web ASP.NET Core. Une application de bureau avec génération de codes-barres Infragistics est désormais disponible. Le point de terminaison doit accepter les téléchargements d'images et renvoyer les valeurs des codes-barres, ou générer des images de codes-barres à la demande. Aucune de ces solutions n'est possible avec les packages de codes-barres Infragistics dans un projet ASP.NET Core. Code-barres IronBarcode s'installe avec dotnet add package BarCode et fonctionne dans une action du contrôleur de la même manière qu'il fonctionne dans une méthode de console.

Déploiement Docker. Une application WPFest conteneurisée ou sa logique de lecture de codes-barres est extraite dans un microservice. Les assemblys WPFne s'exécutent pas dans les conteneurs Docker Linux. L'BarcodeReader WPFInfragistics les accompagne. Code-barres IronBarcode cible nativement Linux x64.

Performances du traitement par lots. Un flux de travail traite des centaines, voire des milliers, d'images de codes-barres. Le lecteur Infragistics, piloté par les événements, les traite séquentiellement. Le lecteur statique d'IronBarcode est sécurisé pour les threads et prend en charge Parallel.ForEach ou son option MaxParallelThreads intégrée sans aucune infrastructure de concurrence.

Échecs de format silencieux en production. Une équipe découvre que les codes-barres d'une certaine famille échouent silencieusement depuis des semaines parce que les drapeaux Symbology passés à Decode() n'incluaient pas cette famille. Le passage à la détection automatique élimine totalement le mode de défaillance.

Réduction du périmètre de l'abonnement Infragistics. Certaines équipes paient le prix de l'abonnement Infragistics Ultimate précisément parce que les contrôles de codes-barres en font partie. Lorsque l'exigence de codes-barres est la seule raison de l'abonnement, il est judicieux d'évaluer l'existence d'une bibliothèque de codes-barres dédiée, à un coût bien moindre.

Conclusion

Le problème principal lié à la prise en charge des codes-barres par Infragistics est d'ordre architectural plutôt que lié aux capacités. Le BarcodeReader WPFlit bien les codes-barres. Le UltraWinBarcode WinFormsles génère. Dans le contexte précis pour lequel chaque composant a été conçu, ils fonctionnent. Le problème, c'est que ces deux contextes ne couvrent pas les besoins réels de la plupart des équipes .NET .

Dans une application .NET moderne, la fonctionnalité de code-barres est rarement intégrée à un seul framework d'interface utilisateur. Il apparaît dans un client WinFormset une API Web. Il s'exécute dans un conteneur Docker et sur un poste de travail. Il doit analyser des images téléchargées sur un point de terminaison ASP.NET et imprimer des étiquettes à partir d'un outil en ligne de commande. Rien de tout cela ne fonctionne avec les packages de codes-barres Infragistics, et le modèle événementiel du lecteur WPFavec ses indicateurs de symbologie requis ajoute une complexité considérable, même dans le seul contexte où il fonctionne.

IronBarcode résout le même problème — la lecture et la génération de codes-barres — grâce à une API statique qui se compile et s'exécute de manière identique dans tous les types de projets .NET . L'appel BarcodeReader.Read() que vous écrivez dans une classe de service WPFest le même appel que vous écrivez dans un contrôleur ASP.NET Coreet le même appel que vous écrivez dans un conteneur Linux Docker. Pas d'événements, pas de drapeaux, pas de TaskCompletionSource. La logique du code-barres tient sur deux lignes au lieu de trente-cinq, et ces deux lignes fonctionnent partout.

Questions Fréquemment Posées

Qu'est-ce que le BarCode Infragistics ?

Infragistics BarCode 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 Infragistics Barcode et IronBarcode ?

IronBarcode utilise une API statique, sans état, ne nécessitant aucune gestion d'instance, alors qu'Infragistics Barcode requiert 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 qu'Infragistics Barcode ?

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 pris en charge par Infragistics Barcode ?

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 à Infragistics Barcode ?

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 de l'acheter, contrairement à Infragistics ?

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 Infragistics BarCode 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 d'Infragistics BarCode vers IronBarcode ?

La migration d'Infragistics Barcode vers IronBarcode implique principalement le remplacement des appels API basés sur les instances par les méthodes statiques d'IronBarcode, la suppression des modèles de licence et la mise à jour des noms des 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