Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

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"))
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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() und BarcodeWriter.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 BarcodeTypes Aufzä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
$vbLabelText   $csharpLabel

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"
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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.

Jordi Bardia
Software Ingenieur
Jordi ist am besten in Python, C# und C++ versiert. Wenn er nicht bei Iron Software seine Fähigkeiten einsetzt, programmiert er Spiele. Mit Verantwortung für Produkttests, Produktentwicklung und -forschung trägt Jordi mit immensem Wert zur kontinuierlichen Produktverbesserung bei. Die abwechslungsreiche Erfahrung hält ihn gefordert und engagiert, ...
Weiterlesen

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an