Accusoft BarcodeXpress im Vergleich zu IronBarcode: C# Barcode Bibliothek Vergleich
Wenn Sie eine Barcode-Bibliothek anhand ihrer Testversion evaluieren, erwarten Sie, dass Sie sehen können, ob sie tatsächlich mit Ihren Bildern funktioniert, bevor Sie sich zum Kauf entscheiden. Accusoft BarcodeXpressbietet Ihnen diese Option nicht. Im Auswertungsmodus werden die dekodierten Barcodewerte teilweise verdeckt – "1234567890" wird als "1234...XXX" zurückgegeben. Sie können zwar überprüfen, ob die Bibliothek einen Barcode findet, aber Sie können nicht überprüfen, ob sie den Barcode korrekt liest. Das ist eine Situation, in der man sich festlegt, bevor man die Transaktion überprüft, und das stellt einen erheblichen Reibungspunkt dar, noch bevor man sich mit der Preisgestaltung befasst hat.
Accusoft BarcodeXpressverstehen
Accusoft entwickelt seit Jahrzehnten Dokumentenverarbeitungssoftware für Enterprise . BarcodeXpress ist Teil einer größeren Produktfamilie, zu der auch PrizmDoc, ImageGear und Accusoft Imaging gehören. Teams, die diese Produkte bereits nutzen, stoßen auf eine vertraute API-Oberfläche und können auf eine bestehende Accusoft-Kontobeziehung zurückgreifen. Für die eigenständige Verwendung von Barcodes bietet dieser Kontext weniger Vorteile.
Das Kern-SDK ist als NuGet Paket für .NET Core verfügbar. Die API ist instanzbasiert – Sie erstellen ein BarcodeXpress-Objekt, konfigurieren die Licensing-Eigenschaft und verwenden dann untergeordnete reader- und writer-Objekte für die eigentlichen Operationen. Das Dual-Key-Lizenzsystem unterscheidet BarcodeXpress von den meisten Alternativen.
Wichtigste architektonische Merkmale von BarcodeXpress:
- Instanzbasierte API: Für jede Operation wird eine
BarcodeXpress-Instanz benötigt; statische Komfortmethoden sind nicht Teil des Entwurfs - Zweistufige Lizenzierung: SDK-Lizenzierung (
SolutionName+SolutionKey) und Laufzeitlizenzierung (UnlockRuntime) sind separate Systeme, die separate Käufe erfordern. - Verschleierungsmodus für die Auswertung: Im Auswertungsmodus werden die dekodierten Werte absichtlich verschlechtert – "1234567890" wird als "1234...XXX" zurückgegeben – wodurch ein Genauigkeitstest vor dem Kauf unmöglich wird.
- Manuelle Formatangabe: Der Leser benötigt eine explizite
BarcodeTypes-Konfiguration, um die zu durchsuchenden Symbologien aufzulisten; nicht spezifizierte Formate werden nicht erkannt - Standard-Obergrenze von 40 Seiten pro Minute: Die Standard Edition drosselt die Verarbeitung auf 40 Seiten pro Minute, eine Grenze, die die meisten Teams eher nach der Bereitstellung als vorher erreichen.
- Keine native PDF-Unterstützung: PDF-Dateien müssen mithilfe einer separaten Bibliothek in Bilder umgewandelt werden, bevor der Reader sie verarbeiten kann.
- Mindestens fünf Laufzeitlizenzen: Selbst für eine Einzelserver-Bereitstellung sind mindestens fünf Laufzeitlizenzen erforderlich.
Das Zwei-Schlüssel-System erklärt
BarcodeXpress unterteilt die Lizenzierung in zwei konzeptionell getrennte Ebenen:
// 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"))
Das Codepaar SolutionName und SolutionKey aktiviert das SDK selbst. Der Aufruf UnlockRuntime, der seinen eigenen Schlüssel und seinen eigenen Lösungsschlüssel als separate Argumente entgegennimmt, aktiviert die Produktionsbereitstellungsfunktionen. Beide müssen vorhanden und gültig sein, damit eine Produktionsbereitstellung vollständige und unverschlüsselte Barcode-Werte zurückgibt.
Bei Code-Reviews führt dieses Muster zu einer vorhersehbaren Frage: "Warum rufen wir UnlockRuntime mit zwei verschiedenen Schlüsseln auf?" Die Antwort – dass Accusoft SDK-Lizenzierung und Bereitstellungslizenzierung als separate Produkte mit separater Abrechnung behandelt – ist aus der API selbst nicht immer ersichtlich. Teams, die diesen Code sechs Monate nach der Ersteinrichtung warten, müssen oft in der Dokumentation nachschlagen, um zu verstehen, welche Taste welche Funktion hat.
Mit der Eigenschaft IsRuntimeUnlocked können Sie überprüfen, ob die Laufzeitschicht aktiv ist:
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
Diese Überprüfung ist die zusätzliche Sicherheitsmaßnahme, die Teams einführen, wenn sie feststellen, dass die Ausgabe im Auswertungsmodus stillschweigend nur Teildaten zurückgibt, anstatt eine Ausnahme auszulösen oder eindeutig fehlzuschlagen.
IronBarcode verstehen
IronBarcode ist eine eigenständige .NET -Barcode-Bibliothek, die außer ihrem NuGet Paket keine externen Abhängigkeiten aufweist. Es übernimmt sowohl die Generierung als auch das Lesen über statische Factory-Methoden, was bedeutet, dass kein Instanzlebenszyklus verwaltet werden muss und keine Konstruktoraufrufe im Anwendungscode verstreut sind.
Das Single-Key-Lizenzierungsmodell bedeutet, dass das, was Sie im Testmodus testen, auch in der Produktion zum Einsatz kommt – der einzige Unterschied besteht in einem Wasserzeichen auf den generierten Barcode-Bildern während der Testphase. Die dekodierten Werte sind immer vollständig, sodass Sie die Lesegenauigkeit anhand Ihrer tatsächlichen Dokumente überprüfen können, bevor Sie sich für den Kauf entscheiden.
Hauptmerkmale von IronBarcode:
- Statisches API-Design:
BarcodeReader.Read()undBarcodeWriter.CreateBarcode()sind zustandslose statische Methoden – keine Instanzverwaltung erforderlich - Einzelner Lizenzschlüssel: Ein Schlüssel deckt sowohl die Entwicklungs- als auch die Produktionsumgebung ab; es gibt keine separate Laufzeitlizenzschicht
- Vollständige Testwerte: Der Testmodus liefert die vollständig dekodierten Werte zurück; Das Wasserzeichen gilt nur für die generierten Ausgabebilder, nicht für die Leseergebnisse.
- Automatische Formaterkennung: IronBarcode erkennt die Symbolik in allen unterstützten Formaten automatisch; Es ist keine
BarcodeTypesAufzählung erforderlich - Native PDF-Unterstützung:
BarcodeReader.Read("document.pdf")verarbeitet PDF-Dateien direkt ohne separaten Rendering-Schritt. - Keine Durchsatzbegrenzung: Die Verarbeitungsgeschwindigkeit wird nur durch die Hardware- und Netzwerkkapazität begrenzt, nicht durch eine softwareseitig festgelegte Obergrenze.
- Thread-sicher von Grund auf: Zustandslose statische Methoden können gleichzeitig von beliebig vielen Threads ohne Instanzisolation aufgerufen werden.
Funktionsvergleich
| Feature | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| Lizenzmodell | SDK-Lizenz + separate Laufzeitlizenz | Ein einziger ewiger Schlüssel |
| Verhalten im Auswertungsmodus | Barcodewerte teilweise verdeckt ("1234...XXX") | Es werden vollständige Werte zurückgegeben, ein Wasserzeichen wird nur auf der generierten Ausgabe angezeigt. |
| Durchsatzgrenze (Standard) | 40 Seiten pro Minute | Keine Durchsatzbegrenzung |
| PDF-Unterstützung | Für die Bildextraktion wird eine externe PDF-Bibliothek benötigt. | Nativ - BarcodeReader.Read("doc.pdf") |
| API-Stil | Instanzbasierte, ausführliche Konfiguration | Statische Factory-Methoden, flüssige API |
| Thread-Sicherheit | Instanz pro Thread erforderlich | Zustandslose statische Methoden – von Natur aus threadsicher |
| Einstiegspreis | 1.960 $ + SDK + 2.500 $ + Laufzeit (mind. 5) | 749 $ Dauerlizenz (Lite, 1 Entwickler) |
Detaillierter Funktionsvergleich
| Feature | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| Lizenzierung | ||
| Lizenzmodell | SDK-Schlüssel + Laufzeitschlüssel | Ein einziger ewiger Schlüssel |
| Mindestlaufzeitlizenzen | 5 (auch für 1 Server) | Konzept ohne Laufzeitlizenz |
| Auswertungsmodus | Werte als "1234...XXX" verschleiert | Vollständige Werte, Wasserzeichen nur auf den Ausgabebildern |
| Unbefristete Lizenz | Nicht Standard – bitte kontaktieren Sie den Vertrieb. | Ja, alle Stufen. |
| Jährliche Erneuerung | Für die Unterstützung erforderlich | Optional |
| Lektüre | ||
| automatische Formaterkennung | Manuell – Barcode-Typen müssen angegeben werden | Automatischer Ablauf über alle unterstützten Formate hinweg |
| PDF lesen | Erfordert eine externe PDF-Bibliothek | Native |
| Mehrere Barcodes pro Bild | Ja, mit der Konfiguration BarcodeTypes |
Ja, mit der Option ExpectMultipleBarcodes |
| Ergebniseigenschaften | BarcodeValue, BarcodeType |
Value, Format, Confidence, PageNumber |
| Durchsatzgrenze | 40 PPM (Standardausgabe) | Keine Begrenzung auf keiner Stufe |
| Generation | ||
| Code 128-Generierung | Ja, über writer.BarcodeType |
Ja, über BarcodeWriter.CreateBarcode() |
| QR-Code-Generierung | Ja | Ja, über QRCodeWriter.CreateQrCode() |
| QR-Code mit Logo | Manuelle Bildüberlagerung erforderlich | AddBrandLogo("logo.png") eingebaut |
| Ausgabeformate | Datei speichern | PNG, JPG, PDF, Binärdaten, Datenstrom |
| Plattform und Bereitstellung | ||
| .NET Framework | Separates Legacy-SDK | .NET Framework4.6.2+ |
| .NET Core / .NET 5+ | Ja (.NET Core SDK) | .NET Core 3.1+, .NET 5/6/7/8/9 |
| Linux/Docker | Ja | Ja – Windows x64/x86, Linux x64, macOS x64/ARM |
| Docker-Lizenzkonfiguration | Lizenzdatei oder Lizenzserver | Umgebungsvariable |
| CI/CD-Integration | Sowohl SDK- als auch Laufzeitschlüssel erforderlich | Ein Geheimnis |
| Batch-Verarbeitung | ||
| Gewindesicherheit | Instanz pro Thread erforderlich | Staatenlos — Parallel.FürJeden sicher |
| Paralleler Batch | Erfordert eine Instanzverwaltung pro Thread. | Direkte Parallele.ForEach-Unterstützung |
Lizenzarchitektur
Der Unterschied in der Komplexität der Lizenzierung zwischen BarcodeXpress und IronBarcode wird am deutlichsten beim Schreiben von Initialisierungscode, der in der Produktion ausgeführt werden soll.
BarcodeXpress-Ansatz
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
Dies ist ein 15-zeiliger Konstruktor, der ausschließlich dazu dient, zwei separate Lizenzschlüsselsysteme zu verwalten, bevor eine Barcode-Operation stattfinden kann. Der Schutz IsRuntimeUnlocked ist nicht optional – ohne ihn gibt der Dienst in jeder Umgebung, in der der Laufzeitschlüssel fehlt oder falsch konfiguriert ist, stillschweigend fehlerhafte Werte zurück.
IronBarcode Ansatz
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"
Das ist die vollständige Lizenzkonfiguration. Keine separate Laufzeitfreischaltung, kein Lösungsname, kein Aufruf mit zwei Argumenten UnlockRuntime. In Docker wird dies zu einer Umgebungsvariablen, die beim Start ausgelesen wird. In einer CI/CD-Pipeline ist es ein Geheimnis. In einem Container-Orchestrator handelt es sich um eine Umgebungsvariable, die in den Pod injiziert wird.
Lesen von Barcodes
Das Lesen von Barcodes offenbart den Unterschied zwischen den Konfigurationsphilosophien der beiden Bibliotheken – BarcodeXpress erfordert eine explizite Formataufzählung und eine eigenschaftsbasierte Setup-API, während IronBarcode alles automatisch mit einem einzigen Methodenaufruf erkennt.
BarcodeXpress-Ansatz
Das Lesen mit BarcodeXpress erfordert die Konfiguration des Lesegeräts über SetPropertyValue, das eine Konstante und einen Wert benötigt, und anschließend den Aufruf von Analyze(), um die Ergebnisse abzurufen:
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
Die Konstante cycBxeSetFilename ist die Methode der API, die zu verarbeitende Datei anzugeben. Dieses Muster – die Übergabe einer konstanten Kennung und eines Werts an eine generische SetPropertyValue-Methode – erinnert an ältere COM-basierte APIs. Dokumente mit einem Format, das nicht in BarcodeTypes aufgeführt ist, werden nicht gefunden. Dies führt zu einem erhöhten Wartungsaufwand, wenn sich die Dokumentquellen ändern.
IronBarcode Ansatz
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 erkennt das Format automatisch für alle unterstützten Symbologien. Wenn das Bild einen Code 128, einen QR-Code und eine DataMatrix enthält, werden alle drei ohne Konfigurationsänderung in der Ergebnisliste angezeigt. Für eine bessere Kontrolle über das Leseverhalten bietet die Klasse BarcodeReaderOptions Einstellungen für Geschwindigkeit, Thread-Anzahl und Multi-Barcode-Unterstützung.
Das native Lesen von PDFs ist ebenfalls über dieselbe Methode möglich:
using IronBarCode;
// NativePDF 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;
// NativePDF 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
' NativePDF 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 kann PDFs nicht nativ lesen. Sie müssen jede Seite zunächst mithilfe einer separaten Bibliothek in ein Bild umwandeln und diese Bilder dann an den BarcodeXpress-Leser übergeben. Dadurch entsteht eine Abhängigkeit, ein zusätzlicher Konvertierungsschritt und je nach gewählter PDF-Bibliothek weitere Lizenzkosten.
Stapelverarbeitung und Gewindesicherheit
Die Verarbeitung großer Mengen von Barcodes offenbart den architektonischen Unterschied zwischen dem zustandsbehafteten Instanzmodell von BarcodeXpress und der zustandslosen statischen API von IronBarcode.
BarcodeXpress-Ansatz
BarcodeXpress ist instanzbasiert und sein reader-Objekt ist zustandsbehaftet. Die parallele Verarbeitung erfordert eine Instanz pro Thread, wobei die vollständige zweistufige Lizenzinitialisierung in jedem Thread-Kontext wiederholt wird:
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
Die Standardausgabe sieht außerdem eine maximale Lesegeschwindigkeit von 40 Seiten pro Minute vor. Die Bearbeitung eines Stapels von 100.000 Dokumenten bei einer Geschwindigkeit von 40 Seiten pro Minute dauert etwa 41 Stunden. Die Professional Edition hebt diese Beschränkung auf, allerdings zu höheren Kosten pro Entwickler – zusätzlich zu den bereits erworbenen Laufzeitlizenzen.
IronBarcode Ansatz
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
// 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;
// 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
' 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)
Da die statischen Methoden von IronBarcode zustandslos sind, ist der Zugriff darauf sicher, ohne dass eine Instanzisolierung erforderlich ist. IronBarcode setzt in keiner Preisstufe eine Durchsatzbegrenzung fest. Zur Optimierung der Leseleistung bietet die Klasse BarcodeReaderOptions die Einstellungen ReadingSpeed und 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 ist der Standardwert. Verwenden Sie ReadingSpeed.Faster für Pipelines mit hohem Durchsatz, bei denen die Barcodes sauber sind, oder ReadingSpeed.Detailed für beschädigte oder kontrastarme Bilder.
API-Mapping-Referenz
| Accusoft BarcodeXpress | IronBarcode |
|---|---|
new BarcodeXpress() |
Statische Methoden – keine Instanz erforderlich |
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) |
| 40 ppm Standardgrenzwert | Keine Durchsatzbegrenzung auf keiner Ebene |
| Auswertung: Werte als "1234...XXX" verschleiert | Testversion: volle Werte, Wasserzeichen nur auf den Ausgabebildern |
Wenn Teams einen Wechsel von Accusoft BarcodeXpresszu IronBarcode erwägen
Skalierung jenseits der 40-ppm-Grenze
Die Begrenzung der Standardausgabe auf 40 Seiten pro Minute klingt großzügig, bis ein Geschäftsteam beschließt, am Ende des Tages eine Stapelverarbeitung für die archivierten Rechnungen eines ganzen Jahres durchzuführen. Bei diesem Tempo dauert die Bearbeitung eines Stapels von 100.000 Dokumenten etwa 41 Stunden. Der Wechsel zur Professional Edition beseitigt zwar die Beschränkung, führt aber zu höheren Kosten pro Entwicklerplatz – zusätzlich zu den bereits erworbenen Laufzeitlizenzen. Teams, die die Durchsatzgrenze erst nach Unterzeichnung eines Kaufvertrags entdecken, stellen oft fest, dass die Gesamtkosten für deren Beseitigung die ursprünglichen Schätzungen erheblich übersteigen.
Lizenzierungskomplexität der CI/CD-Pipeline
Ein typisches CI/CD-Setup führt Builds in kurzlebigen Containern aus. Bei BarcodeXpress benötigt jede Build-Umgebung sowohl das SDK-Schlüsselpaar als auch die Laufzeit-Entsperrschlüssel, die als separate Geheimnisse verwaltet werden. Wenn der Laufzeitschlüssel fehlt oder falsch konfiguriert ist, kann der Build zwar erfolgreich sein, aber Integrationstests liefern verschleierte Werte – ein stiller Fehler, der in einer Testpipeline leicht übersehen werden kann, wenn die Testzusicherungen nicht sorgfältig anhand des tatsächlichen Barcode-Inhalts geschrieben werden.
Anforderungen an eine abgeschottete und sichere Bereitstellung
In einigen Umgebungen – wie etwa Gesundheitssystemen, die Patientendaten verarbeiten, Dokumentenworkflows der Regierung oder Backoffice-Prozessen von Finanzinstituten – ist eine Lizenzvalidierung bei ausgehenden Netzwerkanrufen nicht möglich. Das Laufzeitlizenzsystem von BarcodeXpress nutzt die Lizenzinfrastruktur von Accusoft, was in Umgebungen mit strengen Beschränkungen des ausgehenden Netzwerkzugriffs zu Compliance-Problemen führen kann. Teams, die in solchen Umgebungen arbeiten, wählen oft Bibliotheken, deren Lizenzvalidierung vollständig lokal erfolgt.
Docker und Containerbereitstellung
BarcodeXpress in Docker erfordert typischerweise entweder das Einbinden einer Lizenzdatei in den Container unter einem bekannten Pfad oder die Konfiguration eines Lizenzservers und die Angabe des entsprechenden Pfads im Container. Beide Ansätze erhöhen die Komplexität der Bereitstellung – Lizenzdateien müssen verteilt und synchronisiert werden, und ein Lizenzserver stellt eine zusätzliche Infrastrukturkomponente dar, die gewartet werden muss. Teams, die auf Microservice-Architekturen oder serverlose Bereitstellungsmuster umsteigen, stellen fest, dass sich der Ansatz mit Konfigurationsdateien nicht sauber in unveränderliche Container-Images übersetzen lässt.
Anforderungen an die Genauigkeit der Bewertung
Teams, die die Lesegenauigkeit ihrer eigenen Dokumente überprüfen müssen, bevor sie sich zum Kauf entscheiden, empfinden den Evaluierungsmodus von BarcodeXpress als grundlegend einschränkend. Tests mit realen Dokumentenscans – bei denen geprüft wird, ob die Bibliothek mit kontrastarmen Barcodes, verzerrten Bildern oder Seiten mit mehreren Barcodes zurechtkommt – erfordern vollständig dekodierte Werte. Die teilweise verdeckte Ausgabe zeigt lediglich an, dass die Bibliothek einen Barcode gefunden hat, nicht aber, ob sie ihn korrekt gelesen hat.
Gemeinsame Überlegungen zur Migration
Instanzverwaltung für statische Aufrufe
BarcodeXpress erfordert, dass vor jeglicher Operation eine BarcodeXpress-Instanz erstellt und lizenziert wird. Die statischen Methoden von IronBarcode benötigen keine Instanz. Teams, die migrieren, haben typischerweise eine BarcodeService Klasse, deren Konstruktor größtenteils aus Lizenzierungs-Boilerplate-Code besteht – nach der Migration kann dieser Konstruktor vollständig entfernt oder auf die Zuweisung eines einzigen Lizenzschlüssels reduziert werden.
Entfernung der BarcodeTypes-Aufzählung
Jeder Lesevorgang von BarcodeXpress erfordert die Zuweisung eines BarcodeTypes-Flags, um die zu durchsuchenden Symbologien aufzulisten. IronBarcode erkennt standardmäßig alle unterstützten Formate automatisch. Während der Migration können alle reader.BarcodeTypes = ...-Zuweisungen ersatzlos gelöscht werden. Falls aus Performancegründen der Suchraum eingeschränkt werden muss, unterstützt BarcodeReaderOptions die Formatfilterung als explizite Option anstatt als erforderliche Standardeinstellung.
Ergebnis: Änderungen des Eigenschaftsnamens
Zwei Eigenschaftsumbenennungen wirken sich auf den gesamten Ergebnisverarbeitungscode aus: result.BarcodeValuewird zu result.Value, und result.BarcodeTypewird zu result.Format. Eine lösungsweite Such- und Ersetzungsfunktion erledigt beides. Die Ergebnisse von IronBarcode zeigen außerdem result.Confidence und result.PageNumber an, für die es kein Äquivalent in BarcodeXpress gibt und die ohne Codeänderungen an der bestehenden Ergebnisverarbeitung für zusätzliche Filter verwendet werden können.
Docker-Lizenzkonfiguration
BarcodeXpress Docker-Bereitstellungen verwenden typischerweise eine eingebundene Lizenzkonfigurationsdatei. IronBarcode verwendet eine Umgebungsvariable. Die Migration beinhaltet das Entfernen der COPY Anweisung für die Konfigurationsdatei und das Hinzufügen einer einzelnen Umgebungsvariablenzuweisung. In Kubernetes wird der Lizenzschlüssel zu einer geheimen Referenz in der Pod-Spezifikation anstatt zu einem eingebundenen Volume.
Zusätzliche IronBarcode Funktionen
Über die in diesem Vergleich behandelten Kernfunktionen hinaus bietet IronBarcode Funktionen, die nicht zum Angebot von BarcodeXpress gehören:
- QR-Code mit Logo :
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")bettet ein Markenbild nativ in einen QR-Code ein, mit konfigurierbarem Fehlerkorrekturniveau zur Aufrechterhaltung der Scanzuverlässigkeit - Barcode-Aufdruck auf PDFs : Barcodes direkt in bestehende PDF-Dokumente schreiben, ohne separate PDF-Bibliothek
- Stapelverarbeitungsexport : Verarbeiten Sie ganze PDF-Dokumente in einem einzigen Aufruf und erhalten Sie Ergebnisse pro Seite mit Seitenzahl, Format, Wert und Konfidenzbewertung.
.NET-Kompatibilität und Zukunftsfähigkeit
IronBarcode unterstützt .NET Framework4.6.2 und höher, .NET Core 3.1 sowie .NET 5, 6, 7, 8 und 9. Zu den Zielplattformen gehören Windows x64 und x86, Linux x64 sowie macOS x64 und ARM. BarcodeXpress für .NET Core ist ein separates SDK von der älteren .NET FrameworkEdition – Teams, die das Zielframework ihrer Anwendung aktualisieren, müssen dies berücksichtigen. Das Einzelpaket von IronBarcode deckt alle unterstützten Laufzeitumgebungen ab. Regelmäßige Updates gewährleisten die Kompatibilität mit .NET 10, das voraussichtlich Ende 2026 erscheint, sowie mit zukünftigen .NET Versionen, sobald diese veröffentlicht werden.
Abschluss
BarcodeXpress und IronBarcode repräsentieren zwei unterschiedliche Designphilosophien für kommerzielle .NET -Barcodebibliotheken. BarcodeXpress behandelt den SDK-Zugriff und die Produktionsbereitstellung als separate lizenzierte Produkte mit separater Abrechnung, separaten Schlüsselsystemen und separaten Mindestabnahmemengen. IronBarcode behandelt die Bibliothek als ein einziges Produkt mit einem einzigen Schlüssel, der alle Umgebungen von der Entwicklung bis zur Produktion abdeckt.
BarcodeXpress ist eine sinnvolle Wahl für Teams, die bereits in das Accusoft-Produktökosystem eingebunden sind – Organisationen, die PrizmDoc oder ImageGear verwenden, werden die API von BarcodeXpress als vertraut empfinden und ihre Accusoft-Kontobeziehung für einen konsolidierten Support als nützlich empfinden. Für diese Teams stellt das Zwei-Schlüssel-Lizenzsystem ein etabliertes Betriebsmuster und keine neue Reibungsquelle dar. Das SDK eignet sich auch für Umgebungen, in denen die Dokumentquellen gut kontrolliert werden und die Formatvorgaben stabil sind, sodass die manuelle BarcodeTypes Spezifikation eine akzeptable einmalige Konfiguration anstelle einer laufenden Wartung darstellt.
IronBarcode eignet sich besser für Teams, die in Containern, CI/CD-Pipelines und Cloud-Umgebungen arbeiten, wo die Komplexität des Lizenzmanagements den operativen Aufwand direkt beeinflusst. Das automatische Erkennungsmodell, die statische API und die native PDF-Unterstützung reduzieren den Umfang des Integrationscodes, und das Einzelschlüssel-Lizenzmodell vereinfacht die Geheimnisverwaltung in Entwicklungs-, Test- und Produktionsumgebungen. Für Teams, die die Lesegenauigkeit vor dem Kauf bewerten müssen, ermöglicht die vollständige Testausgabe – Wasserzeichen auf den generierten Bildern, nicht auf den Leseergebnissen – ein echtes Benchmarking vor dem Kauf.
Die Preisunterschiede sind in jeder Preisstufe erheblich. Auf Ebene einzelner Entwickler ist die Kluft zwischen dem BarcodeXpress SDK Plus minimalen Laufzeitlizenzen und der Lite Version von IronBarcode beträchtlich. Für Teams, bei denen die Kostenunterschiede zugunsten der Integration in das Accusoft-Ökosystem zweitrangig sind, bleibt BarcodeXpress eine sinnvolle Wahl. Für Teams, die Barcode-Bibliotheken anhand ihrer eigenen Vorzüge evaluieren, ist IronBarcode aufgrund der Einschränkungen im Evaluierungsmodus, der Zwei-Schlüssel-Lizenzierung und der Durchsatzbegrenzungen die unkompliziertere Option.
Häufig gestellte Fragen
Was ist Accusoft BarcodeXpress?
Accusoft BarcodeXpress ist eine .NET-Barcode-Bibliothek zum Erzeugen und Lesen von Barcodes in C#-Anwendungen. Sie ist eine von mehreren Alternativen, die Entwickler bei der Auswahl einer Barcode-Lösung für .NET-Projekte in Betracht ziehen.
Was sind die Hauptunterschiede zwischen Accusoft BarcodeXpress und IronBarcode?
IronBarcode verwendet eine statische, zustandslose API, die keine Instanzverwaltung erfordert, während Accusoft BarcodeXpress in der Regel eine Instanzerstellung und -konfiguration vor der Verwendung erfordert. IronBarcode bietet außerdem native PDF-Unterstützung, automatische Formaterkennung und Single-Key-Lizenzierung in allen Umgebungen.
Ist IronBarcode einfacher zu lizenzieren als Accusoft BarcodeXpress?
IronBarcode verwendet einen einzigen Lizenzschlüssel, der sowohl die Entwicklungs- als auch die Produktionsbereitstellung abdeckt. Dies vereinfacht CI/CD-Pipelines und Docker-Konfigurationen im Vergleich zu Lizenzierungssystemen, die SDK-Schlüssel von Laufzeitschlüsseln trennen.
Unterstützt IronBarcode alle Barcodeformate, die auch Accusoft BarcodeXpress unterstützt?
IronBarcode unterstützt über 30 Barcode-Symbologien, darunter QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 und viele mehr. Die automatische Formaterkennung bedeutet, dass keine explizite Formataufzählung erforderlich ist.
Unterstützt IronBarcode das native Lesen von PDF-Barcodes?
Ja, IronBarcode liest Barcodes direkt aus PDF-Dateien mit BarcodeReader.Read("document.pdf"), ohne dass eine separate PDF-Rendering-Bibliothek erforderlich ist. Die seitenweisen Ergebnisse umfassen Seitenzahl, Barcodeformat, Wert und Konfidenzwert.
Wie handhabt IronBarcode die Stapelverarbeitung im Vergleich zu Accusoft BarcodeXpress?
Die statischen Methoden von IronBarcode sind zustandslos und natürlich thread-sicher, was die direkte Verwendung von Parallel.ForEach ohne Instanzverwaltung pro Thread ermöglicht. Es gibt auf keiner Preisstufe eine Obergrenze für den Durchsatz.
Welche .NET Versionen werden von IronBarcode unterstützt?
IronBarcode unterstützt .NET Framework 4.6.2+, .NET Core 3.1 und .NET 5, 6, 7, 8 und 9 in einem einzigen NuGet-Paket. Zu den Zielplattformen gehören Windows x64/x86, Linux x64 und macOS x64/ARM.
Wie installiere ich IronBarcode in einem .NET-Projekt?
Installieren Sie IronBarcode über NuGet: Führen Sie "Install-Package IronBarCode" in der Paketmanager-Konsole oder "dotnet add package IronBarCode" in der CLI aus. Es sind keine zusätzlichen SDK-Installationsprogramme oder Laufzeitdateien erforderlich.
Kann ich IronBarcode vor dem Kauf testen, im Gegensatz zu Accusoft BarcodeXpress?
Ja, der Testmodus von IronBarcode liefert vollständige dekodierte Barcodewerte - nur die erzeugten Ausgabebilder erhalten ein Wasserzeichen. Sie können die Lesegenauigkeit an Ihren eigenen Dokumenten testen, bevor Sie sich zum Kauf verpflichten.
Was ist der Preisunterschied zwischen Accusoft BarcodeXpress und IronBarcode?
Die Preise für IronBarcode beginnen bei 749 US-Dollar für eine unbefristete Einzelentwicklerlizenz für Entwicklung und Produktion. Preisdetails und Volumenoptionen sind auf der IronBarcode-Lizenzierungsseite verfügbar. Es ist keine separate Runtime-Lizenz erforderlich.
Ist der Umstieg von Accusoft BarcodeXpress auf IronBarcode einfach?
Bei der Migration von Accusoft BarcodeXpress zu IronBarcode geht es in erster Linie darum, instanzbasierte API-Aufrufe durch statische Methoden von IronBarcode zu ersetzen, Lizenzierungsvorlagen zu entfernen und die Namen von Ergebniseigenschaften zu aktualisieren. Bei den meisten Migrationen wird eher Code reduziert als hinzugefügt.
Kann IronBarcode QR-Codes mit Logos generieren?
Ja. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") bettet ein Markenbild nativ in einen QR-Code mit konfigurierbarer Fehlerkorrektur ein. Farbige QR-Codes werden auch über ChangeBarCodeColor() unterstützt.

