Accusoft BarcodeXpress vs IronBarcode : Comparaison de la bibliothèque de codes-barres C#
Lorsque vous évaluez une bibliothèque de codes-barres via sa version d'essai, vous vous attendez à vérifier si elle fonctionne réellement avec vos images avant de procéder à un achat. Accusoft BarcodeXpressne vous offre pas cette option. En mode d'évaluation, les valeurs des codes-barres décodés sont partiellement masquées — " 1234567890 " apparaît comme " 1234...XXX ". Vous pouvez vérifier que la bibliothèque trouve un code-barres, mais vous ne pouvez pas vérifier qu'elle le lit correctement. Il s'agit d'une situation où l'on s'engage avant même de vérifier, et cela constitue un point de friction important avant même d'avoir examiné les prix.
Comprendre Accusoft BarcodeXpress
Accusoft conçoit depuis des décennies des logiciels d'imagerie documentaire pour les environnements Enterprise . BarcodeXpress fait partie d'une gamme de produits plus large qui comprend PrizmDoc, ImageGear et Accusoft Imaging. Les équipes utilisant déjà ces produits retrouvent une interface API familière et peuvent s'appuyer sur leur compte Accusoft existant. Pour une utilisation autonome des codes-barres, ce contexte présente moins d'intérêt.
Le kit de développement logiciel (SDK) principal est disponible sous forme de package NuGet pour .NET Core. L'API est basée sur les instances - vous créez un objet BarcodeXpress, configurez la propriété Licensing, puis utilisez les objets enfants reader et writer pour les opérations réelles. Le système de licences à double clé distingue BarcodeXpress de la plupart des alternatives.
Principales caractéristiques architecturales de BarcodeXpress :
- Instance-based API: Chaque opération nécessite une
BarcodeXpressinstance ; les méthodes statiques de commodité ne font pas partie de la conception - Licence à deux niveaux: La licence SDK (
SolutionName+SolutionKey) et la licence d'exécution (UnlockRuntime) sont des systèmes distincts qui nécessitent des achats séparés - Masquage du mode d'évaluation : en mode d'évaluation, les valeurs décodées sont délibérément dégradées — " 1234567890 " est renvoyé comme " 1234...XXX " — rendant impossible tout test de précision avant achat.
- Spécification du format du manuel: Le lecteur a besoin d'une configuration explicite
BarcodeTypespour énumérer les symbologies à rechercher ; les formats non spécifiés ne sont pas détectés - Plafond standard de 40 pages par minute : L'édition standard limite le traitement à 40 pages par minute, une limite que la plupart des équipes rencontrent après le déploiement plutôt qu'avant.
- Prise en charge native des fichiers PDF : les fichiers PDF doivent être pré-convertis en images à l'aide d'une bibliothèque externe avant de pouvoir être traités par le lecteur.
- Minimum de cinq licences d'exécution : même un déploiement sur un seul serveur nécessite l'achat d'au moins cinq licences d'exécution.
Explication du système à deux clés
BarcodeXpress divise le système de licences en deux couches conceptuellement distinctes :
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
Imports Accusoft.BarcodeXpressSdk
Dim barcodeXpress As New BarcodeXpress()
' Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"))
La paire SolutionName et SolutionKey active le SDK lui-même. L'appel UnlockRuntime, qui prend sa propre clé et sa propre clé de solution comme arguments distincts, active les capacités de déploiement de la production. Les deux doivent être présents et valides pour qu'un déploiement en production renvoie des valeurs de code-barres complètes et non masquées.
Lors de l'examen du code, ce modèle donne lieu à une question prévisible : "Pourquoi appelons-nous UnlockRuntime avec deux clés différentes ?" La réponse - Accusoft traite les licences SDK et les licences de déploiement comme des produits distincts avec une facturation distincte - n'est pas toujours évidente à partir de l'API elle-même. Les équipes chargées de la maintenance de ce code six mois après sa configuration initiale doivent souvent se référer à la documentation pour comprendre à quoi correspond chaque clé.
La propriété IsRuntimeUnlocked vous permet de vérifier si la couche d'exécution est active :
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
// In this state, barcode values are partially obscured
// "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active");
}
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
// In this state, barcode values are partially obscured
// "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active");
}
If Not barcodeXpress.Licensing.IsRuntimeUnlocked Then
' In this state, barcode values are partially obscured
' "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active")
End If
Ce contrôle est la mesure de sécurité ajoutée par les équipes lorsqu'elles constatent que la sortie en mode évaluation renvoie silencieusement des données partielles au lieu de lever une exception ou d'échouer clairement.
Comprendre IronBarcode
IronBarcode est une bibliothèque de codes-barres .NET autonome, sans aucune dépendance externe autre que son package NuGet . Il gère à la fois la génération et la lecture via des méthodes de fabrique statiques, ce qui signifie qu'il n'y a pas de cycle de vie d'instance à gérer et pas d'appels de constructeur dispersés dans le code de l'application.
Le modèle de licence à clé unique signifie que ce que vous testez en mode d'essai est ce qui est exécuté en production ; la seule différence est un filigrane sur les images de codes-barres générées pendant la période d'essai. Les valeurs décodées sont toujours complètes, ce qui vous permet de vérifier la précision de lecture sur vos documents avant de décider d'acheter.
Caractéristiques principales d' IronBarcode:
- Conception d'API statique:
BarcodeReader.Read()etBarcodeWriter.CreateBarcode()sont des méthodes statiques sans état - aucune gestion d'instance n'est requise - Clé de licence unique : une seule clé couvre à la fois le développement et le déploiement en production ; il n'y a pas de couche de licence d'exécution distincte
- Valeurs d'essai complètes : le mode d'essai renvoie des valeurs décodées complètes ; Le filigrane s'applique uniquement aux images de sortie générées, et non aux résultats de lecture.
- Détection automatique du format : Code-barres IronBarcode détecte automatiquement la symbologie dans tous les formats pris en charge ; aucune
BarcodeTypesénumération n'est nécessaire - Support PDF natif:
BarcodeReader.Read("document.pdf")@ traite les fichiers PDF directement sans étape de rendu séparée - Aucun plafond de débit : la vitesse de traitement est uniquement limitée par la capacité du matériel et du réseau, et non par un plafond imposé par logiciel.
- Conception thread-safe : les méthodes statiques sans état peuvent être appelées simultanément par un nombre quelconque de threads sans isolation d'instance.
Comparaison des fonctionnalités
| Fonction | Accusoft BarcodeXpress | Code-barres IronBarcode |
|---|---|---|
| Modèle de licence | Licence SDK + licence d'exécution distincte | Clé perpétuelle unique |
| Comportement du mode d'évaluation | Valeurs du code-barres partiellement masquées (" 1234...XXX ") | Valeurs complètes renvoyées, filigrane uniquement sur le résultat généré |
| Limite de débit (standard) | 40 pages par minute | Aucune limite de débit |
| Prise en charge des fichiers PDF | Nécessite une bibliothèque PDF externe pour l'extraction d'images | Natif - BarcodeReader.Read("doc.pdf") |
| Style API | Configuration détaillée basée sur les instances | Méthodes de fabrique statiques, API fluide |
| Sécurité des threads | Instance par thread requise | Méthodes statiques sans état — naturellement thread-safe |
| point d'entrée en matière de prix | 1 960 $ + SDK + 2 500 $ + environnement d'exécution (min. 5) | 749 $ perpétuel (Lite, 1 développeur) |
Comparaison détaillée des fonctionnalités
| Fonction | Accusoft BarcodeXpress | Code-barres IronBarcode |
|---|---|---|
| Licence | ||
| Modèle de licence | Clé SDK + clé d'exécution | Clé perpétuelle unique |
| Licences d'exécution minimales | 5 (même pour 1 serveur) | Concept de licence sans exécution |
| Mode d'évaluation | Valeurs masquées sous la forme " 1234...XXX " | Valeurs complètes, filigrane uniquement sur les images de sortie |
| Licence perpétuelle | Non standard — contactez le service commercial | Oui, tous les niveaux |
| renouvellement annuel | Nécessaire pour le support | En option |
| En lisant | ||
| Détection automatique du format | Manuel — doit préciser les types de codes-barres | Automatique pour tous les formats pris en charge |
| Lecture de PDF | Nécessite une bibliothèque PDF externe | Natif |
| Plusieurs codes-barres par image | Oui, avec la configuration BarcodeTypes |
Oui, avec l'option ExpectMultipleBarcodes |
| Propriétés du résultat | BarcodeValue, BarcodeType |
Value, Format, Confidence, PageNumber |
| Limite de débit | 40 PPM (Édition standard) | Aucune limite à aucun niveau |
| Génération | ||
| Génération du code 128 | Oui, via writer.BarcodeType |
Oui, via BarcodeWriter.CreateBarcode() |
| génération de code QR | Oui | Oui, via QRCodeWriter.CreateQrCode() |
| Code QR avec logo | Superposition d'image manuelle requise | AddBrandLogo("logo.png") construit en |
| Formats de sortie | enregistrement du fichier | PNG, JPG, PDF, données binaires, flux |
| Plateforme et déploiement | ||
| .NET Framework | Kit de développement logiciel (SDK) hérité séparé | .NET Framework4.6.2+ |
| .NET Core / .NET 5+ | Oui (kit de développement logiciel .NET Core ) | .NET Core 3.1+, .NET 5/6/7/8/9 |
| Linux/Docker | Oui | Oui — Windows x64/x86, Linux x64, macOS x64/ARM |
| Configuration de la licence Docker | fichier de licence ou serveur de licences | Variable d'environnement |
| Intégration CI/CD | Les clés SDK et d'exécution sont toutes deux requises. | Un secret |
| Traitement par lots | ||
| Sécurité du fil | Instance par thread requise | Sans état — Parallel.ForEach coffre-fort |
| Lot parallèle | Nécessite une gestion d'instance par thread | Prise en charge de Direct Parallel.ForEach |
Architecture des licences
La différence de complexité des licences entre BarcodeXpress et Code-barres IronBarcode est surtout visible lors de l'écriture du code d'initialisation qui sera exécuté en production.
Approche BarcodeXpress
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress();
// Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp";
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime(
"RuntimeKey-XXXXXX",
Convert.ToInt64("98765432109876"));
// Guard against partial-value mode
if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
{
throw new InvalidOperationException(
"Runtime license not active — barcode values will be obscured");
}
}
}
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress();
// Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp";
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime(
"RuntimeKey-XXXXXX",
Convert.ToInt64("98765432109876"));
// Guard against partial-value mode
if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
{
throw new InvalidOperationException(
"Runtime license not active — barcode values will be obscured");
}
}
}
Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
_barcodeXpress = New BarcodeXpress()
' Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp"
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime("RuntimeKey-XXXXXX", Convert.ToInt64("98765432109876"))
' Guard against partial-value mode
If Not _barcodeXpress.Licensing.IsRuntimeUnlocked Then
Throw New InvalidOperationException("Runtime license not active — barcode values will be obscured")
End If
End Sub
End Class
Il s'agit d'un constructeur de 15 lignes qui existe uniquement pour gérer deux systèmes de clés de licence distincts avant toute opération de code-barres. La garde IsRuntimeUnlocked n'est pas optionnelle - sans elle, le service renverra silencieusement des valeurs dégradées dans tout environnement où la clé d'exécution est manquante ou mal configurée.
Approche IronBarcode
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY"
Il s'agit là de la configuration complète de la licence. Pas de déverrouillage séparé du runtime, pas de nom de solution, pas d'appel à deux arguments UnlockRuntime. Dans Docker, cela devient une variable d'environnement lue au démarrage. Dans un pipeline CI/CD, il s'agit d'un secret. Dans un orchestrateur de conteneurs, il s'agit d'une variable d'environnement injectée dans le pod.
Lecture des codes-barres
La lecture des codes-barres révèle la différence entre les philosophies de configuration des deux bibliothèques : BarcodeXpress exige une énumération explicite du format et une API de configuration basée sur les propriétés, tandis Code-barres IronBarcode détecte automatiquement tout à partir d'un seul appel de méthode.
Approche BarcodeXpress
La lecture avec BarcodeXpress implique la configuration du lecteur via SetPropertyValue, qui prend une constante et une valeur, puis l'appel à Analyze() pour récupérer les résultats :
using Accusoft.BarcodeXpressSdk;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress();
barcodeXpress.Licensing.SolutionName = "AcmeCorp";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode |
BarcodeType.DataMatrixBarcode |
BarcodeType.QRCodeBarcode;
var results = barcodeXpress.reader.Analyze();
return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress();
barcodeXpress.Licensing.SolutionName = "AcmeCorp";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode |
BarcodeType.DataMatrixBarcode |
BarcodeType.QRCodeBarcode;
var results = barcodeXpress.reader.Analyze();
return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim barcodeXpress = New BarcodeXpress()
barcodeXpress.Licensing.SolutionName = "AcmeCorp"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"))
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath)
barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.DataMatrixBarcode Or BarcodeType.QRCodeBarcode
Dim results = barcodeXpress.reader.Analyze()
Return results.Select(Function(r) r.BarcodeValue)
End Function
La constante cycBxeSetFilename est la façon dont l'API spécifie le fichier à traiter. Ce modèle - passer un identifiant constant plus une valeur à une méthode générique SetPropertyValue - rappelle les anciennes API basées sur COM. Si un document contient un format non répertorié dans BarcodeTypes, il ne sera pas trouvé. Cela engendre des frais de maintenance supplémentaires lorsque les sources de documents changent.
Approche IronBarcode
using IronBarCode;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value);
}
using IronBarCode;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value);
}
Imports IronBarCode
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value)
End Function
IronBarcode détecte automatiquement le format pour toutes les symbologies prises en charge. Si l'image contient un Code 128, un code QR et un DataMatrix, les trois apparaissent dans la collection de résultats sans aucune modification de configuration. Pour un contrôle plus précis du comportement de lecture, la classe BarcodeReaderOptions expose des paramètres de vitesse, de nombre de threads et de lecture de plusieurs codes-barres.
La lecture native des fichiers PDF est également possible via la même méthode :
using IronBarCode;
// NatifPDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
using IronBarCode;
// NatifPDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
Imports IronBarCode
' NatifPDF support — no separate library needed
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}")
Next
BarcodeXpress ne lit pas les fichiers PDF nativement. Vous devez d'abord convertir chaque page en image, à l'aide d'une bibliothèque distincte, puis transmettre ces images au lecteur BarcodeXpress. Cela ajoute une dépendance, une étape de conversion et un coût de licence supplémentaire en fonction de la bibliothèque PDF choisie.
Traitement par lots et sécurité des filetages
Le traitement à haut volume de codes-barres met en évidence la différence architecturale entre le modèle d'instance avec état de BarcodeXpress et l'API statique sans état d'IronBarcode.
Approche BarcodeXpress
BarcodeXpress est basé sur des instances et son objet reader est à états. Le traitement parallèle nécessite une instance par thread, l'initialisation complète de la licence à deux niveaux étant répétée dans chaque contexte de thread :
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
_barcodeXpress.reader.SetPropertyValue(
BarcodeXpress.cycBxeSetFilename, path);
_barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;
var barcodes = _barcodeXpress.reader.Analyze();
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
_barcodeXpress.reader.SetPropertyValue(
BarcodeXpress.cycBxeSetFilename, path);
_barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;
var barcodes = _barcodeXpress.reader.Analyze();
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic
Public Function ProcessBatch(imagePaths As IEnumerable(Of String)) As Dictionary(Of String, String)
Dim results As New Dictionary(Of String, String)()
For Each path In imagePaths
_barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path)
_barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.QRCodeBarcode
Dim barcodes = _barcodeXpress.reader.Analyze()
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
Next
Return results
End Function
L'édition standard impose également un plafond de 40 pages par minute. Le traitement d'un lot de 100 000 documents à 40 PPM prend environ 41 heures. L'édition Professional supprime cette limite, mais à un coût plus élevé par développeur, en plus des licences d'exécution déjà achetées.
Approche IronBarcode
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
// Code-barres IronBarcode — parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();
Parallel.ForEach(files, file =>
{
var r = BarcodeReader.Read(file);
foreach (var barcode in r)
allResults.Add($"{file}: {barcode.Value}");
});
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
// Code-barres IronBarcode — parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();
Parallel.ForEach(files, file =>
{
var r = BarcodeReader.Read(file);
foreach (var barcode in r)
allResults.Add($"{file}: {barcode.Value}");
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
Imports System.IO
' Code-barres IronBarcode — parallel batch with thread-safe static API
Dim files = Directory.GetFiles("/incoming/scans", "*.png")
Dim allResults = New ConcurrentBag(Of String)()
Parallel.ForEach(files, Sub(file)
Dim r = BarcodeReader.Read(file)
For Each barcode In r
allResults.Add($"{file}: {barcode.Value}")
Next
End Sub)
Les méthodes statiques d'IronBarcode étant sans état, Parallel.ForEach leur survol est sûr, aucune isolation d'instance n'étant nécessaire. Code-barres IronBarcode n'impose aucun plafond de débit, quel que soit le niveau de prix. Pour régler les performances de lecture, la classe BarcodeReaderOptions fournit des paramètres ReadingSpeed et MaxParallelThreads :
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read("warehouse-scan.png", options)
ReadingSpeed.Balanced est la valeur par défaut. Utilisez ReadingSpeed.Faster pour les pipelines à haut débit où les codes-barres sont propres, ou ReadingSpeed.Detailed pour les images endommagées ou à faible contraste.
Référence de mappage d'API
| Accusoft BarcodeXpress | Code-barres IronBarcode |
|---|---|
new BarcodeXpress() |
Méthodes statiques — aucune instance requise |
Licensing.SolutionName = "..." |
IronBarCode.License.LicenseKey = "key" |
Licensing.SolutionKey = longValue |
(removed — not needed) |
Licensing.UnlockRuntime(key, solutionKey) |
(removed — no runtime license concept) |
Licensing.IsRuntimeUnlocked |
(removed — license is always either valid or not) |
reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path) |
BarcodeReader.Read(path) |
reader.BarcodeTypes = BarcodeType.LinearBarcode \| ... |
(removed — auto-detection handles all formats) |
reader.Analyze() |
(part of BarcodeReader.Read) |
result.BarcodeValue |
result.Value |
result.BarcodeType |
result.Format |
writer.BarcodeType = BarcodeType.Code128 |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
writer.BarcodeValue = "data" |
(first argument to CreateBarcode) |
writer.SaveToFile(path) |
.SaveAsPng(path) |
| Limite standard de 40 ppm | Aucune limite de débit à aucun niveau |
| Évaluation : valeurs masquées sous la forme " 1234...XXX " | Essai : valeurs complètes, filigrane uniquement sur les images de sortie |
Lorsque les équipes envisagent de passer d'Accusoft BarcodeXpress à IronBarcode
Dépasser le seuil des 40 ppm
La limite de 40 pages par minute de l'édition standard semble généreuse jusqu'à ce qu'une équipe commerciale décide d'effectuer un traitement par lots en fin de journée sur une année entière de factures archivées. Le traitement d'un lot de 100 000 documents à ce rythme prend environ 41 heures. Passer à l'édition Professional supprime la limite, mais au prix d'un coût plus élevé par poste de développeur, en plus des licences d'exécution déjà achetées. Les équipes qui découvrent le plafond de débit après avoir signé un bon de commande constatent souvent que le coût total de sa suppression dépasse largement les estimations initiales.
Complexité des licences des pipelines CI/CD
Une configuration CI/CD typique exécute les builds dans des conteneurs éphémères. Avec BarcodeXpress, chaque environnement de compilation nécessite à la fois la paire de clés du SDK et les clés de déverrouillage d'exécution, gérées comme des secrets distincts. Si la clé d'exécution est manquante ou mal configurée, la compilation peut réussir, mais les tests d'intégration renvoient des valeurs masquées — un mode de défaillance silencieux facile à manquer dans un pipeline de test si les assertions de test ne sont pas soigneusement écrites par rapport au contenu réel du code-barres.
Exigences de déploiement isolé et sécurisé
Certains environnements — systèmes de santé traitant les dossiers des patients, flux de travail documentaires gouvernementaux, traitement administratif des institutions financières — ne peuvent pas effectuer de validation de licence lors d'appels réseau sortants. Le système de licences d'exécution de BarcodeXpress repose sur l'infrastructure de licences d'Accusoft, ce qui peut poser un problème de conformité dans les environnements soumis à des restrictions strictes en matière de trafic réseau sortant. Les équipes travaillant dans ces environnements choisissent souvent des bibliothèques dont la validation des licences est entièrement locale.
Déploiement de Docker et de conteneurs
BarcodeXpress dans Docker nécessite généralement soit de monter un fichier de licence dans le conteneur à un emplacement connu, soit de configurer un serveur de licences et de pointer le conteneur vers celui-ci. Les deux approches ajoutent de la complexité au déploiement : les fichiers de licence doivent être distribués et synchronisés, et un serveur de licences représente un élément d'infrastructure supplémentaire à maintenir. Les équipes qui adoptent des architectures de microservices ou des modèles de déploiement sans serveur constatent que l'approche par fichier de configuration ne se traduit pas facilement en images de conteneurs immuables.
Exigences en matière de précision d'évaluation
Les équipes qui ont besoin de valider la précision de lecture sur leurs propres documents avant de procéder à un achat trouvent le mode d'évaluation de BarcodeXpress fondamentalement limitant. Les tests effectués sur des documents numérisés réels — vérifiant si la bibliothèque gère les codes-barres à faible contraste, les images déformées ou les pages à codes-barres multiples — nécessitent des valeurs décodées complètes. Les résultats partiellement masqués indiquent seulement que la bibliothèque a trouvé un code-barres, et non si elle l'a lu correctement.
Considérations courantes en matière de migration
Gestion des instances pour les appels statiques
BarcodeXpress nécessite qu'une instance BarcodeXpress soit créée et licenciée avant toute opération. Les méthodes statiques d'IronBarcode ne nécessitent pas d'instance. Les équipes qui migrent ont généralement une classe BarcodeService dont le constructeur est en grande partie un modèle de licence - après la migration, ce constructeur peut être entièrement supprimé ou réduit à une seule attribution de clé de licence.
Suppression de l'énumération des types de codes-barres
Chaque opération de lecture de BarcodeXpress nécessite une affectation de drapeau BarcodeTypes pour énumérer les symbologies à rechercher. Code-barres IronBarcode détecte automatiquement tous les formats pris en charge par défaut. Pendant la migration, toutes les affectations reader.BarcodeTypes = ...peuvent être supprimées sans être remplacées. S'il existe une raison de performance pour restreindre l'espace de recherche, BarcodeReaderOptions prend en charge le filtrage de format en tant qu'option explicite plutôt qu'en tant que valeur par défaut obligatoire.
Résultat : Modifications du nom de la propriété
Deux renommages de propriétés affectent tout le code de traitement des résultats : result.BarcodeValuedevient result.Value, et result.BarcodeTypedevient result.Format. Une fonction de recherche et de remplacement à l'échelle de la solution gère les deux. Les résultats d'IronBarcode exposent également result.Confidence et result.PageNumber, qui n'ont pas d'équivalent dans BarcodeXpress et peuvent être utilisés pour un filtrage supplémentaire sans modification de code dans le traitement des résultats existants.
Configuration de la licence Docker
Les déploiements Docker de BarcodeXpress utilisent généralement un fichier de configuration de licence monté. Code-barres IronBarcode utilise une variable d'environnement. La migration implique la suppression de l'instruction COPY pour le fichier de configuration et l'ajout d'une seule affectation de variable d'environnement. Dans Kubernetes, la clé de licence devient une référence secrète dans la spécification du pod plutôt qu'un volume monté.
Fonctionnalités supplémentaires IronBarcode
Au-delà des fonctionnalités essentielles abordées dans cette comparaison, Code-barres IronBarcode offre des capacités qui ne font pas partie de l'offre de BarcodeXpress :
- Code QR avec logo:
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")intègre une image de marque dans un code QR de manière native, avec un niveau de correction d'erreur configurable pour maintenir la fiabilité de la numérisation - Ajout de codes-barres sur les PDF : Insérez des codes-barres directement sur des documents PDF existants sans bibliothèque PDF distincte.
- Exportation par lots : Traitez des documents PDF entiers en une seule opération et recevez des résultats par page avec numéro de page, format, valeur et score de confiance.
Compatibilité .NET et préparation à l'avenir
IronBarcode prend en charge .NET Framework4.6.2 et versions ultérieures, .NET Core 3.1 et .NET 5, 6, 7, 8 et 9. Les plateformes cibles incluent Windows x64 et x86, Linux x64 et macOS x64 et ARM. BarcodeXpress pour .NET Core est un SDK distinct de l'ancienne édition .NET Framework ; les équipes qui mettent à niveau le framework cible de leur application doivent en tenir compte. Le package unique d'IronBarcode couvre tous les environnements d'exécution pris en charge. Des mises à jour régulières assurent la compatibilité avec .NET 10, prévu pour fin 2026, et avec les futures versions de .NET dès leur publication.
Conclusion
BarcodeXpress et Code-barres IronBarcode représentent deux philosophies de conception différentes pour les bibliothèques de codes-barres .NET commerciales. BarcodeXpress considère l'accès au SDK et le déploiement en production comme des produits sous licence distincts, avec une facturation, des systèmes de clés et des exigences d'achat minimales distincts. Code-barres IronBarcode considère la bibliothèque comme un produit unique avec une seule clé qui couvre tous les environnements, du développement à la production.
BarcodeXpress est un choix judicieux pour les équipes déjà intégrées à l'écosystème de produits Accusoft ; les organisations utilisant PrizmDoc ou ImageGear trouveront l'API de BarcodeXpress familière et leur relation avec leur compte Accusoft utile pour un support consolidé. Pour ces équipes, le système de licences à deux clés constitue un modèle opérationnel établi plutôt qu'une nouvelle source de friction. Le SDK convient également aux environnements dans lesquels les sources de documents sont bien contrôlées et les exigences en matière de format sont stables, ce qui fait du manuel BarcodeTypes@ une configuration ponctuelle acceptable plutôt qu'une maintenance continue.
IronBarcode est mieux adapté aux équipes déployant sur des conteneurs, des pipelines CI/CD et des environnements cloud où la complexité de la gestion des licences affecte directement les frais généraux opérationnels. Le modèle de détection automatique, l'API statique et la prise en charge native du format PDF réduisent la surface du code d'intégration, et le modèle de licence à clé unique simplifie la gestion des secrets dans les environnements de développement, de test et de production. Pour les équipes qui doivent évaluer la précision de lecture avant l'achat, le résultat complet de l'essai — avec un filigrane sur les images générées et non sur les résultats de lecture — permet une véritable évaluation comparative avant l'achat.
La différence de prix est significative à tous les niveaux. Au niveau d'un développeur individuel, l'écart entre le SDK BarcodeXpress Plus les licences d'exécution minimales et le niveau Lite d'IronBarcode est considérable. Pour les équipes pour lesquelles l'intégration à l'écosystème Accusoft prime sur la différence de coût, BarcodeXpress reste un choix judicieux. En revanche, pour celles qui évaluent les bibliothèques de codes-barres selon leurs propres mérites, les limitations du mode d'évaluation, la licence à deux clés et les plafonds de débit font Code-barres IronBarcode l'option la plus simple.
Questions Fréquemment Posées
Qu'est-ce que Accusoft BarcodeXpress ?
Accusoft BarcodeXpress 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 Accusoft BarcodeXpress et IronBarcode ?
IronBarcode utilise une API statique, sans état, ne nécessitant aucune gestion d'instance, alors qu'Accusoft BarcodeXpress 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'Accusoft BarcodeXpress ?
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 Accusoft BarcodeXpress ?
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 à Accusoft BarcodeXpress ?
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 à Accusoft BarcodeXpress ?
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 Accusoft BarcodeXpress 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'Accusoft BarcodeXpress vers IronBarcode ?
La migration d'Accusoft BarcodeXpress vers IronBarcode implique principalement le remplacement des appels API basés sur les instances par les méthodes statiques d'IronBarcode, la suppression du boilerplate de licence et la mise à jour des noms de 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().

