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)
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
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>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. - 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. Decode()déclenche l'événement de manière asynchrone. LeTaskCompletionSourceest le lien entre le monde du callback et celui de l'async/await.- Le rappel extrait
e.SymbologyValue. - 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
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")
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")
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"
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
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)
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
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().

