Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

Infragistics BarCode vs IronBarcode: C# Barcode-Bibliothek im Vergleich

Infragistics unterstützt das Lesen von Barcodes in WPF. Um dorthin zu gelangen, benötigt man eine BarcodeReader Instanz, einen DecodeComplete Ereignishandler, einen TaskCompletionSource<string> zur Überbrückung des Rückrufs in asynchronen Code, einen BitmapImage Laden von einer URI und eine explizite bitweise ODER-Verknüpfung aller SymbologyType, die Sie unterstützen möchten. Fehlt eine einzige Kennzeichnung – beispielsweise SymbologyType.EAN8 –, liefert jeder EAN-8-Barcode in Ihren Bildern stillschweigend keine Ergebnisse. Keine Ausnahme. Keine Vorwarnung. Einfach nur ein leeres Ergebnis.

Das ist die WPF-Seite. Auf der WinForms-Seite enthält das Paket Infragistics.Win.UltraWinBarcode zwar Generierungssteuerelemente, aber überhaupt keine Reader-Klasse. Wenn Sie in einem WinForms-Projekt Barcodes lesen müssen, gibt es im Infragistics-Barcode-Paket nichts, was Sie aufrufen könnten. Das Gleiche gilt für jeden ASP.NET CoreController, jedes Konsolentool, jede Azure-Funktion, Blazor Server-Komponente und jeden Docker-Container. Infragistics bietet Barcode-Unterstützung innerhalb der Grenzen des UI-Frameworks: WPFerhält Generierung und ereignisgesteuertes Lesen; WinFormserhält nur die Generierung; Alles andere geht leer aus.

Dieser Vergleich untersucht, was diese Aufteilung in der Praxis bedeutet, und betrachtet dann, wie IronBarcode die gleiche Arbeit mit einer einzigen statischen API bewältigt, die sich bei jedem Projekttyp identisch verhält.

Infragistics Barcode-Unterstützung verstehen

Infragistics ist einer der etabliertesten Anbieter von .NET -UI-Komponenten. Die Infragistics Ultimate Suite – das Abonnement inklusive Barcode-Funktionalität – umfasst Hunderte von Steuerelementen für WinForms, WPF, ASP.NET, Blazor und mobile Anwendungen. Für Teams, die bereits Infragistics-Grids, -Diagramme oder -Planer nutzen, sind die Barcode-Steuerelemente eine logische Ergänzung: Sie zahlen ja bereits für das Abonnement.

Die Barcode-Unterstützung ist jedoch keine einheitliche Bibliothek. Es handelt sich um zwei separate Baugruppen mit jeweils eigenen Funktionen, die sich nur teilweise überschneiden.

WinForms: UltraWinBarcode

Das Paket Infragistics.Win.UltraWinBarcode ermöglicht die Barcode-Generierung in WinForms-Anwendungen über die Klasse UltraWinBarcode. Die API ist unkompliziert:

// Infragistics WinFormsgeneration
using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
// Infragistics WinFormsgeneration
using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
Imports Infragistics.Win.UltraWinBarcode

Dim barcode As New UltraWinBarcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.SaveTo(outputPath)
$vbLabelText   $csharpLabel

Sie legen eine Symbologie fest, weisen Daten zu und rufen SaveTo() auf. Für Szenarien, in denen es nur um die Generierung von Daten geht, funktioniert dies in WinForms. Die Aufzählung Symbology umfasst gängige Formate: Code128, Code39, QR, EAN13 und andere.

Was in dieser Anordnung fehlt, ist ein Leser. Es gibt keine Klasse UltraBarcodeReader. Es gibt keine Scan() Methode. Wenn Sie versuchen, ein Barcode-Bild in einer WinForms-Anwendung nur mit dem Infragistics.Win.UltraWinBarcode-Paket zu lesen, gibt es nichts aufzurufen.

WPF: XamBarcode und BarcodeReader

Die WPF-Seite umfasst sowohl ein Generierungssteuerelement (XamBarcode) als auch eine separate Reader-Klasse (BarcodeReader in Infragistics.Controls.Barcodes, aus der Assembly Infragistics.WPF.BarcodeReader). Der Reader ist ereignisgesteuert und basiert auf dem WPF-Threading- und Imaging-Modell.

Das Lesen eines Barcodes in WPFerfordert das Einbinden des DecodeComplete-Ereignisses, das Laden von Bildern als BitmapSource-Objekte anstatt als Dateipfade und die Umwandlung des Callback-Musters in etwas Awaitable, wenn Ihr Code asynchron ist.

ASP.NET Core, Konsole, Docker: Nichts

Es gibt kein Infragistics-Barcode-Paket, das net8.0 ohne WPF- oder WinForms-UI-Assemblys unterstützt. ASP.NET CoreProjekte, Konsolentools, Azure Functions, Blazor -Server und Linux Docker-Container verfügen nicht über die Infragistics-Barcode-Option. Die Bibliothek ist an das UI-Framework gekoppelt.

Das WPF-Lesemuster

So sieht das Lesen eines Barcodes in WPFmit Infragistics aus:

// Infragistics WPFreading: event-driven, requires WPFassemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;

private BarcodeReader _reader;
private TaskCompletionSource<string> _result;

public InfragisticsBarcodeService()
{
    _reader = new BarcodeReader();
    _reader.DecodeComplete += OnDecodeComplete;
}

public async Task<string> ReadBarcodeAsync(string imagePath)
{
    _result = new TaskCompletionSource<string>();

    // Load as WPFBitmapSource — not a file path
    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    // Must specify EVERY format — no auto-detection
    _reader.SymbologyTypes = SymbologyType.Code128 |
                             SymbologyType.Code39 |
                             SymbologyType.QR |
                             SymbologyType.EAN8 |
                             SymbologyType.EAN13 |
                             SymbologyType.UPCA |
                             SymbologyType.DataMatrix |
                             SymbologyType.Interleaved2of5;

    // Trigger decode — result comes via callback
    _reader.Decode(bitmap);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbologyValue ?? "No barcode found");
}

public void Dispose()
{
    if (_reader != null)
    {
        _reader.DecodeComplete -= OnDecodeComplete;
        _reader = null;
    }
}
// Infragistics WPFreading: event-driven, requires WPFassemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;

private BarcodeReader _reader;
private TaskCompletionSource<string> _result;

public InfragisticsBarcodeService()
{
    _reader = new BarcodeReader();
    _reader.DecodeComplete += OnDecodeComplete;
}

public async Task<string> ReadBarcodeAsync(string imagePath)
{
    _result = new TaskCompletionSource<string>();

    // Load as WPFBitmapSource — not a file path
    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    // Must specify EVERY format — no auto-detection
    _reader.SymbologyTypes = SymbologyType.Code128 |
                             SymbologyType.Code39 |
                             SymbologyType.QR |
                             SymbologyType.EAN8 |
                             SymbologyType.EAN13 |
                             SymbologyType.UPCA |
                             SymbologyType.DataMatrix |
                             SymbologyType.Interleaved2of5;

    // Trigger decode — result comes via callback
    _reader.Decode(bitmap);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbologyValue ?? "No barcode found");
}

public void Dispose()
{
    if (_reader != null)
    {
        _reader.DecodeComplete -= OnDecodeComplete;
        _reader = null;
    }
}
Imports Infragistics.Controls.Barcodes
Imports System.Windows.Media.Imaging
Imports System.Threading.Tasks

Private _reader As BarcodeReader
Private _result As TaskCompletionSource(Of String)

Public Sub New()
    _reader = New BarcodeReader()
    AddHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
End Sub

Public Async Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
    _result = New TaskCompletionSource(Of String)()

    ' Load as WPFBitmapSource — not a file path
    Dim bitmap = New BitmapImage(New Uri(imagePath, UriKind.Absolute))

    ' Must specify EVERY format — no auto-detection
    _reader.SymbologyTypes = SymbologyType.Code128 Or
                             SymbologyType.Code39 Or
                             SymbologyType.QR Or
                             SymbologyType.EAN8 Or
                             SymbologyType.EAN13 Or
                             SymbologyType.UPCA Or
                             SymbologyType.DataMatrix Or
                             SymbologyType.Interleaved2of5

    ' Trigger decode — result comes via callback
    _reader.Decode(bitmap)

    Return Await _result.Task
End Function

Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
    _result?.TrySetResult(If(e.SymbologyValue, "No barcode found"))
End Sub

Public Sub Dispose()
    If _reader IsNot Nothing Then
        RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
        _reader = Nothing
    End If
End Sub
$vbLabelText   $csharpLabel

Das entspricht ungefähr 35 Infrastrukturzeilen, um einen Barcode zu lesen. Zählen Sie, was tatsächlich geschieht:

  1. Eine BarcodeReader-Instanz wird erstellt und als Feld aktiv gehalten.
  2. Im Konstruktor ist ein Ereignishandler eingebunden.
  3. Jeder Aufruf von ReadBarcodeAsync erzeugt ein neues TaskCompletionSource<string>, das einem gemeinsamen Feld zugewiesen ist – was bedeutet, dass dieser Dienst in der vorliegenden Form nicht threadsicher ist. Gleichzeitige Aufrufe würden _result überschreiben.
  4. Das Bild muss als BitmapImage aus einem Uri geladen werden — nicht als Dateipfadzeichenfolge, nicht als Byte-Array, nicht als Datenstrom.
  5. Decode() löst das Ereignis asynchron aus. Der TaskCompletionSource ist das Bindeglied zwischen der Callback-Welt und der async/await-Welt.
  6. Der Callback extrahiert e.SymbologyValue.
  7. Die Methode Dispose() muss den Ereignishandler trennen, um Speicherlecks zu vermeiden.

Diese Logik hat nichts mit Barcodes zu tun. Es handelt sich um die notwendige Infrastruktur, um das ereignisgesteuerte Design zu ermöglichen. Im Produktionscode müssten Sie auch den Fall behandeln, dass _result.Task nie abgeschlossen wird – einen Timeout, ein Abbruchtoken oder eine andere Schutzmaßnahme, um zu verhindern, dass das Ereignis jemals ausgelöst wird.

Die WinForms-Lücke

Die Lücke zwischen WinFormsund WinFormsist abrupter, als es zunächst scheinen mag. Teams, die WinForms-Anwendungen entwickeln, erwarten auf der Infragistics-Barcode-Seite oft ein symmetrisches Benutzererlebnis – Generierung und Lesen auf beiden UI-Frameworks. Sie stellen fest, dass Infragistics.Win.UltraWinBarcode keinerlei Lesefähigkeit bietet.

Dies ist kein Dokumentationsfehler. Die WinForms-Barcode-Assembly wurde als Generierungssteuerung konzipiert. Wenn Sie in einer WinForms-Anwendung Barcodes scannen müssen – beispielsweise einen Barcode aus einer vom Benutzer hochgeladenen Bilddatei lesen oder einen Barcode aus einem Kamerabild dekodieren – ist dies mit den Barcode-Tools von Infragistics nicht möglich. Man müsste eine komplett separate Bibliothek einbinden, wodurch die Argumentation für die Verwendung von Infragistics zur Generierung an Bedeutung verliert.

Die Asymmetrie schafft eine wirklich unangenehme Situation für Teams, die Projekte mit gemischten Frameworks durchführen. Ein Team, das sowohl einen WPF-Desktop-Client als auch einen WinForms-Desktop-Client besitzt, kann Infragistics nicht zum Barcode-Lesen im WinForms-Projekt verwenden, obwohl es Infragistics überall sonst einsetzt.

Symbolikspezifikation: Ein stiller Ausfallmodus

Die SymbologyTypes Flag-Eigenschaft im WPF-Reader verdient einen eigenen Abschnitt, da ihr Fehlermodus subtil und in der Produktion gefährlich ist.

Bei der Konfiguration des Lesegeräts müssen Sie jedes Barcode-Format, das Sie unterstützen möchten, explizit mit einem ODER verknüpfen:

// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
                         SymbologyType.Code39 |
                         SymbologyType.QR |
                         SymbologyType.EAN8 |
                         SymbologyType.EAN13 |
                         SymbologyType.UPCA |
                         SymbologyType.DataMatrix |
                         SymbologyType.Interleaved2of5;
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
                         SymbologyType.Code39 |
                         SymbologyType.QR |
                         SymbologyType.EAN8 |
                         SymbologyType.EAN13 |
                         SymbologyType.UPCA |
                         SymbologyType.DataMatrix |
                         SymbologyType.Interleaved2of5;
' Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 Or
                         SymbologyType.Code39 Or
                         SymbologyType.QR Or
                         SymbologyType.EAN8 Or
                         SymbologyType.EAN13 Or
                         SymbologyType.UPCA Or
                         SymbologyType.DataMatrix Or
                         SymbologyType.Interleaved2of5
$vbLabelText   $csharpLabel

Wenn ein Barcode-Bild einen EAN-8-Barcode enthält und SymbologyType.EAN8 nicht in den Flags enthalten ist, wird e.SymbologyValue als null oder leer zurückgegeben. Das Dekodierungsereignis wird weiterhin ausgelöst. Es wird keine Ausnahme ausgelöst. Der Anrufer erhält die Meldung "Kein Barcode gefunden" und hat keinen Hinweis darauf, ob das Bild unlesbar war oder einfach nicht konfiguriert wurde.

In der Praxis bedeutet dies:

  • Die Ersteinrichtung funktioniert einwandfrei für die vom Entwickler getesteten Formate.
  • Ein neues Barcode-Format wird in das System eingeführt (ein Lieferant ändert den Etikettentyp, eine neue Produktlinie verwendet eine andere Symbolik).
  • Der Reader schlägt bei allen Bildern dieses Formats stillschweigend fehl.
  • Der Fehler sieht genauso aus wie "Bild hat keinen Barcode" und nicht wie "Format nicht konfiguriert".

Die Teams, die diesen Fehler beheben, verbringen viel Zeit damit, die Bildqualität zu untersuchen, bevor sie feststellen, dass das Format nie in der Flag-Liste enthalten war.

IronBarcode besitzt keine SymbologyTypes-Eigenschaft. Es erkennt bei jedem Lesevorgang automatisch alle über 50 unterstützten Formate. Es gibt keine Flagge, die man vergessen sollte.

Die Plattformmatrix

Die Fähigkeitslücke zwischen den Plattformen ist der deutlichste Weg, die architektonische Beschränkung zu verstehen:

Plattform Infragistics-Generation Infragistics Lesen IronBarcode Generierung IronBarcode Lesung
WPF XamBarcode-Steuerung BarcodeReader (ereignisgesteuert) Ja Ja
WinForms UltraWinBarcode NICHT VERFÜGBAR Ja Ja
ASP.NET Core NICHT VERFÜGBAR NICHT VERFÜGBAR Ja Ja
Konsole NICHT VERFÜGBAR NICHT VERFÜGBAR Ja Ja
Blazor -Server NICHT VERFÜGBAR NICHT VERFÜGBAR Ja Ja
Docker/Linux NICHT VERFÜGBAR NICHT VERFÜGBAR Ja Ja
Azure-Funktionen NICHT VERFÜGBAR NICHT VERFÜGBAR Ja Ja

Diese Tabelle veranschaulicht, warum Teams, die mehr als nur reine WPF-Desktopanwendungen betreiben, die Barcode-Unterstützung von Infragistics als unzureichend empfinden. Sobald ein Projekt WinFormsund ASP.NET Core– oder WPFund einen Hintergrundworkerdienst – umfasst, deckt die Infragistics-Barcodebibliothek nur noch einen Teil der Codebasis ab.

IronBarcode verstehen

IronBarcode ist eine dedizierte Barcode-Bibliothek für .NET , die keine Abhängigkeit von WinForms, WPFoder einem UI-Framework aufweist. Das gleiche NuGet Paket, der gleiche Namespace und die gleiche API funktionieren in jedem .NET Projekt: WinForms, WPF, ASP.NET Core, Konsole, Blazor Server, Docker, Azure Functions, AWS Lambda.

// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
Imports IronBarCode

' Read — 2 lines, any platform
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
$vbLabelText   $csharpLabel

BarcodeReader.Read() ist eine statische Methode. Keine zu verwaltende Instanz, kein zu verdrahtendes Ereignis, keine TaskCompletionSource-Callback-Muster. Es akzeptiert einen Dateipfad als Zeichenkette, ein Byte-Array, ein Stream oder ein Array davon zur Stapelverarbeitung.

Zur Generierung gibt BarcodeWriter.CreateBarcode() ein Barcode-Objekt zurück, das Sie als PNG, JPEG oder SVG speichern oder als Binärdaten abrufen können:

using IronBarCode;

// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .SaveAsPng("qr.png");
using IronBarCode;

// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .SaveAsPng("qr.png");
Imports IronBarCode

' Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
             .ResizeTo(400, 100) _
             .SaveAsPng("barcode.png")

' Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

Die Lizenzinitialisierung erfolgt einmalig beim Start der Anwendung:

IronBarCode.License.LicenseKey = "YOUR-KEY";
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-KEY"
$vbLabelText   $csharpLabel

Parallelverarbeitung: Stapelverarbeitung

Die Stapelverarbeitung offenbart eine weitere strukturelle Einschränkung des Infragistics WPF-Readers. Da der Reader einen gemeinsamen Ereignishandler verwendet und das Feld _result bei jedem Aufruf überschrieben wird, kann die oben gezeigte Serviceklasse nicht sicher mehrere Bilder gleichzeitig verarbeiten. Sie müssen die Aufrufe in einer bestimmten Reihenfolge aufrufen:

// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// are not thread-safe; concurrent calls would corrupt _result
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    // Each call must await before starting the next
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// are not thread-safe; concurrent calls would corrupt _result
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    // Each call must await before starting the next
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}
Imports System.Collections.Generic

' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' are not thread-safe; concurrent calls would corrupt _result
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()

For Each file In imageFiles
    ' Each call must await before starting the next
    Dim value As String = Await service.ReadBarcodeAsync(file)
    results.Add(value)
Next
$vbLabelText   $csharpLabel

Um dies gleichzeitig zu ermöglichen, ist eine erhebliche zusätzliche Infrastruktur erforderlich: eine Sperre, eine Warteschlange oder ein Semaphor, um sicherzustellen, dass _result nicht überschrieben wird, während ein vorheriger Dekodierungsvorgang noch läuft. Das ist ein nicht triviales Problem der Parallelverarbeitung für eine eigentlich einfache E/A-Operation.

IronBarcodes statischer BarcodeReader.Read() ist threadsicher. Es kann von mehreren Threads gleichzeitig ohne zusätzliche Synchronisierung aufgerufen werden. Für Batch-Workloads können Sie Parallel.ForEach direkt verwenden:

using IronBarCode;

// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var barcodeResults = BarcodeReader.Read(file);
    foreach (var result in barcodeResults)
    {
        results.Add(result.Value);
    }
});
using IronBarCode;

// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var barcodeResults = BarcodeReader.Read(file);
    foreach (var result in barcodeResults)
    {
        results.Add(result.Value);
    }
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

' IronBarcode: parallel batch with thread-safe static API
Dim results As New ConcurrentBag(Of String)()

Parallel.ForEach(imageFiles, Sub(file)
    Dim barcodeResults = BarcodeReader.Read(file)
    For Each result In barcodeResults
        results.Add(result.Value)
    Next
End Sub)
$vbLabelText   $csharpLabel

Sie können auch mehrere Dateien in einem einzigen Aufruf übergeben und die Parallelität über BarcodeReaderOptions konfigurieren:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read(imageFiles, options)
For Each result In results
    Console.WriteLine($"{result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

Funktionsvergleich

Feature Infragistics BarCode IronBarcode
WinForms-Barcode-Lesen Nicht verfügbar Ja
WPF-Barcode-Lesen Ja (ereignisgesteuert) Ja (synchron)
ASP.NET CoreUnterstützung Nicht verfügbar Ja
Konsolen-/Arbeitsdienst Nicht verfügbar Ja
Docker/Linux Nicht verfügbar Ja
Azure-Funktionen Nicht verfügbar Ja
Blazor -Server Nicht verfügbar Ja
Automatische Formaterkennung Nein – jedes SymbologyType-Flag muss angegeben werden. Ja – alle über 50 Formate wurden automatisch erkannt.
PDF-Barcode-Lesen Nicht verfügbar Ja – nativ, kein zusätzliches Paket
Thread-sicheres Lesen Nein (gemeinsamer Ereignishandler) Ja (statische API)
ereignisgesteuerte API erforderlich Ja (WPF) Nein
Explizites Laden von Bildern (BitmapSource) Ja Nein – akzeptiert Dateipfad, Bytes, Datenstrom
Synchrones Lesen Nein (die Brücke muss über TaskCompletionSource erfolgen) Ja
Stapelverarbeitung Nur sequentiell (nicht gleichzeitige Ausführung möglich) Eingebaute Parallelisierung
Stille Formatierungsfehler Ja (fehlendes SymbologyType-Flag) Nein
Suite -Abhängigkeit erforderlich Ja – Infragistics Ultimate-Abonnement Nein – eigenständiges Paket
Option für eine unbefristete Lizenz Nein – Jahresabonnement Ja
Ungefähre Lizenzkosten Ab 1.675 US-Dollar/Jahr (Infragistics Ultimate) Ab 749 $ (Lite)

API-Mapping-Referenz

WinForms(UltraWinBarcode) zu IronBarcode

Infragistics WinForms- UltraWinBarcode IronBarcode
new UltraWinBarcode() BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128 BarcodeEncoding.Code128 (Parameter zu CreateBarcode)
barcode.Data = "ITEM-12345" Erstes Argument von CreateBarcode()
barcode.SaveTo(outputPath) .SaveAsPng(outputPath)
Es existiert keine Lese-API. BarcodeReader.Read(imagePath)

WPF(BarcodeReader) zu IronBarcode

Infragistics WPF– BarcodeReader IronBarcode
new BarcodeReader() Statische Klasse – keine Instanz erforderlich
_reader.DecodeComplete += OnDecodeComplete Nicht erforderlich
_reader.SymbologyTypes = SymbologyType.X \| SymbologyType.Y \| ... Automatische Erkennung – keine Konfiguration erforderlich
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap) BarcodeReader.Read(path)
e.SymbologyValue (im Rückruf) result.Value
e.Symbology (im Rückruf) result.Format
TaskCompletionSource<string> asynchroner Wrapper Synchron – kein Wrapper erforderlich
Dispose() — Ereignishandler zum Trennen Nicht erforderlich – keine Instanz oder kein Ereignis
Nur WPF-Projekt Jeder .NET -Projekttyp

Wenn die Teams wechseln

Mehrere spezifische Situationen veranlassen Teams immer wieder dazu, sich von der Barcode-Unterstützung von Infragistics fernzuhalten.

Lesen ist in WinFormserforderlich. Dies ist das häufigste Szenario. Eine WinForms-Anwendung generiert Barcodes problemlos mit UltraWinBarcode, aber dann kommt eine neue Anforderung hinzu: Scannen eines Barcodes aus einem hochgeladenen Bild oder Validierung eines Etiketts vor dem Drucken. Es gibt keine Infragistics-Lese-API für WinForms. Das Team bindet entweder eine zweite Bibliothek ein oder ersetzt den Generierungscode durch etwas, das beides kann.

Neuer ASP.NET CoreEndpunkt. Eine Desktop-Anwendung mit Infragistics-Barcode-Generierung erhält eine zugehörige Web-API. Der Endpunkt muss Bild-Uploads akzeptieren und Barcode-Werte zurückgeben oder bei Bedarf Barcode-Bilder generieren können. Beides ist mit Infragistics-Barcode-Paketen in einem ASP.NET Core-Projekt nicht möglich. IronBarcode wird mit dotnet add package IronBarcode installiert und funktioniert in einer Controller-Aktion genauso wie in einer Konsolenmethode.

Docker-Bereitstellung. Eine WPF-Anwendung wird containerisiert oder ihre Barcode-Logik in einen Microservice ausgelagert. WPF-Assemblies können nicht in Linux-Docker-Containern ausgeführt werden. Die Infragistics WPFBarcodeReader gehört dazu. IronBarcode ist nativ für Linux x64 ausgelegt.

Leistung bei der Stapelverarbeitung. Ein Workflow verarbeitet Hunderte oder Tausende von Barcode-Bildern. Der ereignisgesteuerte Infragistics-Reader verarbeitet sie sequenziell. Der statische Reader von IronBarcode ist threadsicher und unterstützt Parallel.ForEach oder die integrierte Option MaxParallelThreads ohne jegliche Parallelverarbeitungsinfrastruktur.

Stille Formatfehler in der Produktion. Ein Team entdeckt, dass Barcodes eines bestimmten Formats seit Wochen unbemerkt ausfallen, weil die SymbologyTypes Flags dieses Format nicht enthielten. Durch die Umstellung auf automatische Erkennung wird diese Fehlerursache vollständig beseitigt.

Reduzierung des Infragistics-Abonnementumfangs. Einige Teams zahlen den Preis für das Infragistics Ultimate-Abonnement speziell deshalb, weil die Barcode-Steuerung darin enthalten ist. Wenn die Barcode-Anforderung der einzige Grund für das Abonnement ist, lohnt es sich, eine spezielle Barcode-Bibliothek zu einem Bruchteil der Kosten in Betracht zu ziehen.

Abschluss

Das zentrale Problem bei der Barcode-Unterstützung von Infragistics ist architektonischer Natur und nicht funktionsbezogen. Der WPFBarcodeReader kann Barcodes lesen. Die WinForms-Anwendung UltraWinBarcode generiert sie. Innerhalb des engen Kontextes, für den jede Komponente konzipiert wurde, funktionieren sie. Das Problem ist, dass diese beiden Kontexte nicht das abdecken, was die meisten .NET Teams tatsächlich benötigen.

Eine Barcode-Funktion in einer modernen .NET Anwendung ist selten in einem einzigen UI-Framework implementiert. Es erscheint in einem WinForms-Client und einer Web-API. Es läuft in einem Docker-Container und auf einem Desktop-Rechner. Es muss Bilder scannen, die an einen ASP.NET Endpunkt hochgeladen wurden, und Etiketten über ein Konsolentool ausgeben. Nichts davon funktioniert mit Infragistics Barcode-Paketen, und das ereignisgesteuerte Muster des WPF-Readers mit erforderlichen Symbolisierungsflags führt selbst in dem einen Kontext, in dem es funktioniert, zu erheblicher Komplexität.

IronBarcode löst das gleiche Problem – das Lesen und Generieren von Barcodes – mit einer statischen API, die in jedem .NET Projekttyp identisch kompiliert und ausgeführt wird. Der BarcodeReader.Read()-Aufruf, den Sie in einer WPF-Dienstklasse schreiben, ist derselbe Aufruf, den Sie in einem ASP.NET CoreController schreiben, und derselbe Aufruf, den Sie in einem Linux-Docker-Container schreiben. Keine Ereignisse, keine Flaggen, kein TaskCompletionSource. Die Barcode-Logik besteht aus zwei Zeilen anstatt fünfunddreißig, und diese zwei Zeilen funktionieren überall.

Häufig gestellte Fragen

Was ist Infragistics BarCode?

Infragistics BarCode 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 Infragistics BarCode und IronBarcode?

IronBarcode verwendet eine statische, zustandslose API, die keine Instanzverwaltung erfordert, während Infragistics BarCode 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 Infragistics BarCode?

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 Barcode-Formate, die Infragistics Barcode 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 Infragistics BarCode?

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 im Gegensatz zu Infragistics vor dem Kauf testen?

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 Infragistics BarCode 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 Infragistics BarCode auf IronBarcode einfach?

Bei der Migration von Infragistics Barcode zu IronBarcode geht es in erster Linie darum, instanzbasierte API-Aufrufe durch die statischen Methoden von IronBarcode zu ersetzen, Lizenzierungsformulierungen zu entfernen und die Namen der 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