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

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

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 intégrer le rappel dans le code asynchrone, un chargement BitmapImage à partir d'un URI et un OU explicite par bit de chaque SymbologyType que vous souhaitez prendre en charge. Si vous oubliez un drapeau - disons SymbologyType.EAN8 -, tous les codes-barres EAN-8 de vos images ne renvoient rien. Sans exception. Aucun avertissement. Résultat vide.

Voilà pour le côté WPF. Du côté de WinForms, le paquet 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 permet de générer des codes-barres dans les applications WinFormsgrâce à 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 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é WPFcomprend à la fois un contrôle de génération (XamBarcode) et une classe de lecture séparée (BarcodeReader dans Infragistics.Controls.Barcodes, de l'assemblage Infragistics.WPF.BarcodeReader). Le lecteur est piloté par les événements et conçu autour du modèle de threading et d'imagerie WPF.

La lecture d'un BarCode dans WPFnécessite le câblage de l'événement DecodeComplete, le chargement d'images en tant qu'objets BitmapSource plutôt qu'en tant que chemins de fichiers, et la conversion du modèle de rappel en quelque chose d'attendu si votre code est asynchrone.

ASP.NET Core, Console, Docker : Rien

Il n'existe pas de paquet de codes-barres Infragistics qui cible net8.0 sans WPFou WinFormsUI assemblies. 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));

    // Must specify EVERY format — no auto-detection
    _reader.SymbologyTypes = SymbologyType.Code128 |
                             SymbologyType.Code39 |
                             SymbologyType.QR |
                             SymbologyType.EAN8 |
                             SymbologyType.EAN13 |
                             SymbologyType.UPCA |
                             SymbologyType.DataMatrix |
                             SymbologyType.Interleaved2of5;

    // Trigger decode — result comes via callback
    _reader.Decode(bitmap);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbologyValue ?? "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));

    // Must specify EVERY format — no auto-detection
    _reader.SymbologyTypes = SymbologyType.Code128 |
                             SymbologyType.Code39 |
                             SymbologyType.QR |
                             SymbologyType.EAN8 |
                             SymbologyType.EAN13 |
                             SymbologyType.UPCA |
                             SymbologyType.DataMatrix |
                             SymbologyType.Interleaved2of5;

    // Trigger decode — result comes via callback
    _reader.Decode(bitmap);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbologyValue ?? "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))

    ' Must specify EVERY format — no auto-detection
    _reader.SymbologyTypes = SymbologyType.Code128 Or
                             SymbologyType.Code39 Or
                             SymbologyType.QR Or
                             SymbologyType.EAN8 Or
                             SymbologyType.EAN13 Or
                             SymbologyType.UPCA Or
                             SymbologyType.DataMatrix Or
                             SymbologyType.Interleaved2of5

    ' Trigger decode — result comes via callback
    _reader.Decode(bitmap)

    Return Await _result.Task
End Function

Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
    _result?.TrySetResult(If(e.SymbologyValue, "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> assigné à un champ partagé - ce qui signifie que ce service n'est pas thread-safe tel qu'il est écrit. Des appels simultanés é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. Decode() déclenche l'événement de manière asynchrone. Le TaskCompletionSource est le lien entre le monde du callback et celui de l'async/await.
  6. Le rappel extrait e.SymbologyValue.
  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 devrez également 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. Ils constatent que Infragistics.Win.UltraWinBarcode n'offre 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.

Cette asymétrie crée une situation véritablement délicate pour les équipes menant des projets utilisant des frameworks mixtes. 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

La propriété SymbologyTypes du drapeau dans le lecteur WPFmérite sa propre section car son mode de défaillance est subtil et dangereux en production.

Lors de la configuration du lecteur, vous devez explicitement combiner par OU chaque format de code-barres que vous souhaitez prendre en charge :

// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
                         SymbologyType.Code39 |
                         SymbologyType.QR |
                         SymbologyType.EAN8 |
                         SymbologyType.EAN13 |
                         SymbologyType.UPCA |
                         SymbologyType.DataMatrix |
                         SymbologyType.Interleaved2of5;
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
                         SymbologyType.Code39 |
                         SymbologyType.QR |
                         SymbologyType.EAN8 |
                         SymbologyType.EAN13 |
                         SymbologyType.UPCA |
                         SymbologyType.DataMatrix |
                         SymbologyType.Interleaved2of5;
' Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 Or
                         SymbologyType.Code39 Or
                         SymbologyType.QR Or
                         SymbologyType.EAN8 Or
                         SymbologyType.EAN13 Or
                         SymbologyType.UPCA Or
                         SymbologyType.DataMatrix Or
                         SymbologyType.Interleaved2of5
$vbLabelText   $csharpLabel

Si une image de code-barres contient un code-barres EAN-8 et que SymbologyType.EAN8 n'est pas dans les drapeaux, e.SymbologyValue renvoie un résultat nul ou 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 ne prend pas en charge correctement toutes les images de ce format.
  • L'erreur affichée est identique à " l'image ne contient pas de code-barres " plutôt qu'à " format non configuré ".

Les équipes chargées de déboguer ce problème passent du temps à examiner la qualité de l'image avant de se rendre compte que le format n'a jamais figuré dans la liste des options.

IronBarcode n'a pas de propriété SymbologyTypes. Il détecte automatiquement plus de 50 formats 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
Fonctions Azure 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 IronBarcode
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 IronBarcode
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. Pas d'instance à gérer, pas d'événement à câbler, pas de TaskCompletionSource@ à relier à des modèles de rappel. Il accepte une chaîne de chemin de fichier, un tableau d'octets, un Stream, ou un tableau de ces éléments pour le traitement par lots.

Pour la génération, BarcodeWriter.CreateBarcode() renvoie un objet de code-barres que vous pouvez enregistrer au format PNG, JPEG, SVG, ou obtenir en tant que 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-KEY";
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-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. Étant donné que le lecteur utilise un gestionnaire d'événements partagé et que le champ _result est écrasé à chaque appel, la classe de service présentée ci-dessus ne peut pas traiter plusieurs images simultanément en toute sécurité. Vous devez séquencer les appels :

// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// are not thread-safe; concurrent calls would corrupt _result
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
// are not thread-safe; concurrent calls would corrupt _result
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

' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' are not thread-safe; concurrent calls would corrupt _result
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 cette traduction concurrente nécessite une infrastructure supplémentaire importante : un verrou, une file d'attente ou un sémaphore pour s'assurer que _result n'est pas écrasé alors qu'un décodage précédent est toujours 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 à l'abri des 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 passer 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
Fonctions Azure Non disponible Oui
Serveur Blazor Non disponible Oui
Détection automatique du format Non — il faut spécifier chaque indicateur SymbologyType Oui — tous les plus de 50 formats ont été 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 (indicateur SymbologyType manquant) 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 1 675 $ et plus par an (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 de 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.SymbologyTypes = SymbologyType.X \N-_reader.SymbologyTypes = SymbologyType.X \N SymbologieType.Y | ...` Détection automatique — aucune configuration requise
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap) BarcodeReader.Read(path)
e.SymbologyValue (en rappel) result.Value
e.Symbology (en rappel) result.Format
TaskCompletionSource<string> async wrapper Synchrone — aucun wrapper nécessaire
Dispose() - gestionnaire d'événements de détachement 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 sans problème avec UltraWinBarcode mais une nouvelle exigence arrive : scanner un code-barres à partir d'une image téléchargée ou valider une étiquette avant de l'imprimer. 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 IronBarcode et fonctionne dans une action de contrôleur de la même manière que 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'Infragistics WPFBarcodeReader 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 à l'abri des threads et prend en charge Parallel.ForEach ou son option intégrée MaxParallelThreads sans aucune infrastructure de concurrence.

Echecs silencieux de format en production. Une équipe découvre que les codes-barres d'un certain format échouent silencieusement depuis des semaines parce que les drapeaux SymbologyTypes n'incluaient pas ce format. 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 WPFBarcodeReader lit les codes-barres. Le logiciel WinFormsUltraWinBarcode les 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 Docker Linux. 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 gestionnaire de paquets, ou "dotnet add package IronBarCode" dans le CLI. Aucun installateur SDK ou fichier d'exécution supplémentaire n'est nécessaire.

Puis-je évaluer IronBarcode avant 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().

Jordi Bardia
Ingénieur logiciel
Jordi est le plus compétent en Python, C# et C++, et lorsqu'il ne met pas à profit ses compétences chez Iron Software, il programme des jeux. Partageant les responsabilités des tests de produit, du développement de produit et de la recherche, Jordi apporte une immense valeur à l'amé...
Lire la suite

Équipe de soutien Iron

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