IRONSOFTWAREHOME
COMPARER À D'AUTRES COMPOSANTS

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

Curtis Chau
Curtis Chau
Updated: 19 mai 2026

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);

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;
    }
}
C#

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);

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 :

PlateformeGénération InfragisticsLecture d'InfragisticsGénération de Code-barres IronBarcodeLecture des Code-barres IronBarcode
WPFContrôle XamBarcodeLecteur de codes-barres (piloté par les événements)OuiOui
WinFormsCode-barres UltraWinPAS DISPONIBLEOuiOui
ASP.NET CorePAS DISPONIBLEPAS DISPONIBLEOuiOui
ConsolePAS DISPONIBLEPAS DISPONIBLEOuiOui
Serveur BlazorPAS DISPONIBLEPAS DISPONIBLEOuiOui
Docker / LinuxPAS DISPONIBLEPAS DISPONIBLEOuiOui
Azure FunctionsPAS DISPONIBLEPAS DISPONIBLEOuiOui

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";

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");

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

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

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);
}

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);
    }
});

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})");
}

Comparaison des fonctionnalités

FonctionCode-barres InfragisticsCode-barres IronBarcode
Lecture de codes-barres WinFormsNon disponibleOui
Lecture de codes-barres WPFOui (piloté par les événements)Oui (synchrone)
Prise en charge ASP.NET CoreNon disponibleOui
Service Console/WorkerNon disponibleOui
Docker / LinuxNon disponibleOui
Azure FunctionsNon disponibleOui
Serveur BlazorNon disponibleOui
Détection automatique du formatNon — doit passer des drapeaux de symbologie à Decode()Oui — formats détectés automatiquement
lecture de codes-barres PDFNon disponibleOui, c'est natif, sans package supplémentaire.
Lecture sécurisée pour les fils de discussionNon (gestionnaire d'événements partagé)Oui (API statique)
API événementielle requiseOui (WPF)Non
Chargement explicite d'image (BitmapSource)OuiNon — accepte le chemin de fichier, les octets et le flux
Lecture synchroneNon (doit passer par TaskCompletionSource)Oui
Traitement par lotsSéquentiel uniquement (non sécurisé en cas de concurrence)Parallélisation intégrée
Échecs de formatage silencieuxOui (famille de symbologie omise)Non
Dépendance de la Suite requiseOui — Abonnement Infragistics UltimateNon — package autonome
Option de licence perpétuelleNon — abonnement annuelOui
Coût approximatif de la licenceAbonnement annuel (Infragistics Ultimate)À partir de 749 $ perpétuel (Lite)

Référence de mappage d'API

Conversion de WinForms(UltraWinBarcode) en IronBarcode

Infragistics WinForms- UltraWinBarcodeCode-barres IronBarcode
new UltraWinBarcode()BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128BarcodeEncoding.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-barresCode-barres IronBarcode
new BarcodeReader()Classe statique — aucune instance nécessaire
_reader.DecodeComplete += OnDecodeCompletePas 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 asynchroneSynchrone — aucun wrapper nécessaire
Dispose() — détacher le gestionnaire d'événementsInutile — aucune instance ni événement
Projet WPFuniquementTout 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.

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 et créer des manuels bien structurés et visuellement attrayants.

...
Lire la suite

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise