Wie man Barcodes in ZXing für C#-Entwickler scannt
Accusoft BarcodeXpressvs IronBarcode: Lizenzierung, Durchsatz und API-Kompromisse
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 Evaluierungsmodus werden dekodierte Barcode-Werte mit dem String " UNLICENSED accusoft.com " gestempelt und generierte 2D-Barcodes tragen denselben Stempel. Sie können überprüfen, ob die Bibliothek einen Barcode findet, aber nicht, 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 for .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: Jede Operation erfordert eine
BarcodeXpress-Instanz; statische Komfortmethoden sind nicht Teil des Entwurfs - Zwei-Schicht-Lizenzierung: SDK-Lizenzierung (
SetSolutionName+SetSolutionKey) und OEM/Runtime-Lizenzierung (SetOEMLicenseKey) sind separate Systeme, die separate Käufe erfordern - Evalutionsmodus-Stempel: Im Evaluierungsmodus werden dekodierte Werte mit
" UNLICENSED accusoft.com "gestempelt (und generierte 2D-Barcodes werden mit demselben String gestempelt), was einen Test der Genauigkeit vor dem Kauf unmöglich macht - Manuelle Formatspezifikation: Der Leser erfordert eine explizite
BarcodeTypes-Konfiguration, um zu bestimmen, welche Symbologien durchsucht werden sollen; 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;
// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");
// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
// Without a valid OEM license, the SDK runs in stamped evaluation mode.
Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");
// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
// Without a valid OEM license, the SDK runs in stamped evaluation mode.
Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
Imports Accusoft.BarcodeXpressSdk
' BarcodeXpress: two separate license keys required
' Constructor takes the path to the runtime files (e.g. ".").
Dim barcodeXpress As New BarcodeXpress(".")
' Step 1: SDK license (for development).
' SetSolutionName and SetSolutionKey are methods, not properties.
' SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
' Step 2: OEM/runtime license (for production — minimum 5 purchased).
Try
barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString")
Catch ex As Exception
' Without a valid OEM license, the SDK runs in stamped evaluation mode.
Console.WriteLine($"OEM license activation failed: {ex.Message}")
End Try
Das SetSolutionKey-Paar aktiviert das SDK selbst. Der SetOEMLicenseKey-Aufruf aktiviert die Produktivbereitstellungsfunktionen. Beide müssen vorhanden und gültig sein, damit eine Produktivbereitstellung Barcode-Werte ohne den " UNLICENSED accusoft.com "-Stempel zurückgibt.
Bei der Code-Überprüfung erzeugt dieses Muster eine vorhersehbare Frage: "Warum haben wir zwei separate Lizenzaktivierungen?" Die Antwort — dass Accusoft SDK-Lizenzierung und Bereitstellungslizenzierung als separate Produkte mit getrennten Abrechnungen behandelt — ist nicht immer offensichtlich aus der API selbst. 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.
Ohne gültige OEM-Lizenz wirft SetOEMLicenseKey einen Fehler und das SDK fällt in den Evaluierungsmodus zurück. Teams ummanteln die Aktivierung typischerweise in try/catch, damit das Scheitern lautstark protokolliert wird, anstatt im Hintergrund gestempelte Barcode-Werte in der Produktion zu produzieren:
try
{
barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
// In evaluation mode, barcode values are stamped with
// " UNLICENSED accusoft.com " in the output.
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
try
{
barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
// In evaluation mode, barcode values are stamped with
// " UNLICENSED accusoft.com " in the output.
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
Try
barcodeXpress.Licensing.SetOEMLicenseKey(oemKey)
Catch ex As Exception
' In evaluation mode, barcode values are stamped with
' " UNLICENSED accusoft.com " in the output.
Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
End Try
Dieses Schutzmuster fügen Teams hinzu, wenn sie erkennen, dass die Ausgabe im Evaluierungsmodus Ergebnisse stillschweigend stempelt, anstatt während der Dekodierung zu werfen.
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:
- Statische 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; keine
BarcodeTypes-Enumeration erforderlich - Native PDF-Unterstützung:
BarcodeReader.Read("document.pdf")verarbeitet PDF-Dateien direkt ohne einen 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 | Barcode-Werte gestempelt mit " UNLICENSED accusoft.com " | 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. | Native — 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 gestempelt mit " UNLICENSED accusoft.com " | 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 BarcodeTypes-Konfiguration |
Ja, mit ExpectMultipleBarcodes-Option |
| 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.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Layer 2: OEM/runtime license — separate purchase, minimum 5
try
{
_barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
}
catch (Exception ex)
{
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
}
}
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress(".");
// Layer 1: SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Layer 2: OEM/runtime license — separate purchase, minimum 5
try
{
_barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
}
catch (Exception ex)
{
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
}
}
Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
_barcodeXpress = New BarcodeXpress(".")
' Layer 1: SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
' Layer 2: OEM/runtime license — separate purchase, minimum 5
Try
_barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")
Catch ex As Exception
Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
End Try
End Sub
End Class
Dieser Konstruktor existiert ausschließlich, um zwei separate Lizenzaktivierungen zu verwalten, bevor eine Barcode-Operation stattfinden kann. Der try/catch-Block um SetOEMLicenseKey ist nicht optional — ohne ihn wird der Dienst stillschweigend gestempelte Werte in jeder Umgebung zurückgeben, in der der OEM-Schlüssel fehlt oder falsch konfiguriert ist.
IronBarcode Ansatz
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Das ist die vollständige Einrichtung der Lizenzierung. Keine separate Freischaltung zur Laufzeit, kein Lösungsname, kein Zwei-Argumente-UnlockRuntime-Aufruf. 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
Lesen mit BarcodeXpress erfordert das Laden des Bildes in einen System.Drawing.Bitmap, das Zuweisen der Symbologiesammlung an reader.BarcodeTypes als System.Array von BarcodeType-Werten und das Aufrufen von Analyze(bitmap), um Ergebnisse abzurufen. Das SDK liest PDFs nicht direkt — dokumentierte Eingabeformate sind TIFF, JPEG, PNG und BMP:
using Accusoft.BarcodeXpressSdk;
using System.Drawing;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
using var bitmap = new Bitmap(imagePath);
// BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
// enum). Pass Enum.GetValues to scan for everything, or assign a
// narrower array to restrict the search space.
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;
using System.Drawing;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
using var bitmap = new Bitmap(imagePath);
// BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
// enum). Pass Enum.GetValues to scan for everything, or assign a
// narrower array to restrict the search space.
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Drawing
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim barcodeXpress = New BarcodeXpress(".")
barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")
Using bitmap As New Bitmap(imagePath)
' BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
' enum). Pass Enum.GetValues to scan for everything, or assign a
' narrower array to restrict the search space.
barcodeXpress.Reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = barcodeXpress.Reader.Analyze(bitmap)
Return results.Select(Function(r) r.BarcodeValue)
End Using
End Function
Analyze nimmt ein Bitmap und gibt ein Result[] zurück. Wenn ein Dokument ein Format enthält, das im BarcodeTypes-Array nicht vorhanden ist, wird es nicht gefunden. Dies führt zu einem erhöhten Wartungsaufwand, wenn sich die Dokumentquellen ändern. PDFs erfordern ein vorheriges Rendern zu Bildern mit einer separaten Bibliothek, bevor sie in Analyze eingespeist werden können.
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;
using System.Drawing;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
using var bitmap = new Bitmap(path);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
var barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
using System.Drawing;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
using var bitmap = new Bitmap(path);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
var barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic
Imports System.Drawing
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
Using bitmap As New Bitmap(path)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
}
Dim barcodes = _barcodeXpress.reader.Analyze(bitmap)
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
End Using
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 Parallel.ForEach über ihnen sicher, ohne dass eine Instanzisolierung erforderlich ist. IronBarcode setzt in keiner Preisstufe eine Durchsatzbegrenzung fest. Um die Leseleistung zu optimieren, bietet die BarcodeReaderOptions-Klasse ReadingSpeed- und MaxParallelThreads-Einstellungen:
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 Standard. Verwenden Sie ReadingSpeed.Faster für Hochdurchsatz-Pipelines, 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.SetSolutionName("...") |
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" |
Licensing.SetSolutionKey(int, int, int, int) |
(removed — not needed) |
Licensing.SetOEMLicenseKey(string) |
(removed — no separate runtime license concept) |
| try/catch um die OEM-Aktivierung | (removed — license is always either valid or not) |
reader.Analyze(bitmap) (lädt zuerst System.Drawing.Bitmap) |
BarcodeReader.Read(path) |
reader.BarcodeTypes = new[] { BarcodeType.Code128Barcode, ... } |
(removed — auto-detection handles all formats) |
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 |
| Bewertung: Werte gestempelt mit " UNLICENSED accusoft.com " | 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 eine BarcodeXpress-Instanz erstellt und lizenziert wird, bevor eine Operation stattfindet. Die statischen Methoden von IronBarcode benötigen keine Instanz. Teams, die migrationsbedingt umstellen, haben in der Regel eine BarcodeService-Klasse, deren Konstruktor größtenteils Lizenzierungs-Standardtext ist — nach der Migration kann dieser Konstruktor vollständig entfernt oder auf eine einzelne Lizenzschlüsselzuweisung reduziert werden.
Entfernung der BarcodeTypes-Aufzählung
Jede BarcodeXpress-Leseoperation erfordert eine BarcodeTypes-Array-Zuweisung, um festzulegen, welche Symbologien durchsucht werden sollen. IronBarcode erkennt standardmäßig alle unterstützten Formate automatisch. Während der Migration können alle reader.BarcodeTypes = ...-Zuweisungen ohne Ersatz gelöscht werden. Wenn es einen Leistungsgrund gibt, den Suchbereich einzuschränken, unterstützt BarcodeReaderOptions die Formatfilterung als explizite Opt-in-Option und nicht als erforderlichen Standard.
Ergebnis: Änderungen des Eigenschaftsnamens
Zwei Umbenennungen von Eigenschaften betreffen den gesamten ergebnisverarbeitenden Code: result.BarcodeValue wird zu result.Value, und result.BarcodeType wird zu result.Format. Eine lösungsweite Such- und Ersetzungsfunktion erledigt beides. IronBarcode-Ergebnisse bieten auch result.Confidence und result.PageNumber, die kein BarcodeXpress-Äquivalent haben und für zusätzliche Filterung ohne Codeänderungen zur vorhandenen Ergebnisverarbeitung 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 einzigen Umgebung variablen Zuweisung. 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 Markenimage nativ in einen QR-Code ein, mit konfigurierbarem Fehlerkorrekturlevel, um die Scan-Zuverlässigkeit zu erhalten - 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 for .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 verfolgen neue .NET-Veröffentlichungen, sobald sie 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 Dokumentenquellen gut kontrolliert sind und die Formatvorgaben stabil sind, was die manuelle BarcodeTypes-Spezifikation zu einer akzeptablen einmaligen Konfiguration macht, anstatt laufender Wartung.
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 for .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.

