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)
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
Il faut environ 35 lignes d'infrastructure pour lire un seul code-barres. Comptez ce qui se passe réellement :
- Une instance
BarcodeReaderest créée et maintenue en vie en tant que champ. - Un gestionnaire d'événements est intégré dans le constructeur.
- Chaque appel à
ReadBarcodeAsynccrée un nouveauTaskCompletionSource<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. - L'image doit être chargée en tant que
BitmapImageà partir d'unUri— pas une chaîne de chemin de fichier, pas un tableau d'octets, pas un flux. DecodeAsync()déclenche l'événement de manière asynchrone. LeTaskCompletionSourceest le lien entre le monde des rappels et le monde async/await.- Le rappel extrait
e.Valuelorsquee.SymbolFoundest vrai. - 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)
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")
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")
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"
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
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)
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
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().

