Dynamsoft Barcode Reader vs IronBarcode: C# Barcode Bibliothek Vergleich
Infragistics BarCodevs IronBarcode: Nur WPF-Leser vs plattformunabhängige API
Infragistics unterstützt das Lesen von Barcodes in WPF. Dorthin zu gelangen erfordert eine BarcodeReader-Instanz, einen DecodeComplete-Ereignishandler, einen TaskCompletionSource<string>, um den Rückruf in asynchronen Code zu überführen, ein BitmapImage-Laden von einer URI und ein bitweises ODER von jeder Symbology-Familie, die Sie unterstützen möchten – als zweites Argument an Decode() übergeben. Lassen Sie eine Familie weg – zum Beispiel Symbology.QRCode aus den Flags herauslassen – und jeder QR-Barcodes in Ihren Bildern gibt stillschweigend nichts zurück. Keine Ausnahme. Keine Vorwarnung. Einfach nur ein leeres Ergebnis.
Das ist die WPF-Seite. Auf der WinForms-Seite enthält das Infragistics.Win.UltraWinBarcode-Paket Generierungssteuerungen, aber überhaupt keine Leserklasse. 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 Infragistics.Win.UltraWinBarcode-Paket bietet Barcode-Generierung in WinForms-Anwendungen über die UltraWinBarcode-Klasse. 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)
Sie setzen eine Symbologie, weisen Daten zu, rufen SaveTo() auf. Für Szenarien, in denen es nur um die Generierung von Daten geht, funktioniert dies in WinForms. Das Symbology-Enum deckt häufige Formate ab: Code128, Code39, QR, EAN13 und andere.
Was in dieser Anordnung fehlt, ist ein Leser. Es gibt keine UltraBarcodeReader-Klasse. 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 zu rufen.
WPF: XamBarcode und BarcodeReader
Die WPF-Seite enthält sowohl eine Generierungssteuerung (XamBarcode) als auch eine separate Leserklasse (BarcodeReader in Infragistics.Controls.Barcodes, aus der Infragistics.WPF.BarcodeReader-Assembly). Der Reader ist ereignisgesteuert und basiert auf dem WPF-Threading- und Imaging-Modell.
Das Lesen eines Barcodes in WPFerfordert das Anschließen des DecodeComplete-Ereignisses, das Laden von Bildern als BitmapSource-Objekte statt als Dateipfade und das Umwandeln des Rückrufmusters in etwas, das wartbar ist, wenn Ihr Code asynchron ist.
ASP.NET Core, Konsole, Docker: Nichts
Es gibt kein Infragistics-Barcode-Paket, das auf net8.0 ohne WPF- oder WinForms-UI-Assemblies abzielt. 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));
// Build the Symbology flags. The enum is [Flags];
// EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
// and Code 39 is exposed as Code39Ext. Use Symbology.All
// to search every supported family.
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
// Symbology is the second argument to Decode/DecodeAsync,
// not a property on the reader. Result comes via callback.
_reader.DecodeAsync(bitmap, symbologies);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbolFound ? e.Value : "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));
// Build the Symbology flags. The enum is [Flags];
// EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
// and Code 39 is exposed as Code39Ext. Use Symbology.All
// to search every supported family.
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
// Symbology is the second argument to Decode/DecodeAsync,
// not a property on the reader. Result comes via callback.
_reader.DecodeAsync(bitmap, symbologies);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbolFound ? e.Value : "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 As New BitmapImage(New Uri(imagePath, UriKind.Absolute))
' Build the Symbology flags. The enum is [Flags];
' EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
' and Code 39 is exposed as Code39Ext. Use Symbology.All
' to search every supported family.
Dim symbologies = Symbology.Code128 Or
Symbology.Code39Ext Or
Symbology.QRCode Or
Symbology.EanUpc Or
Symbology.Interleaved2Of5
' Symbology is the second argument to Decode/DecodeAsync,
' not a property on the reader. Result comes via callback.
_reader.DecodeAsync(bitmap, symbologies)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(e.SymbolFound, e.Value, "No barcode found"))
End Sub
Public Sub Dispose()
If _reader IsNot Nothing Then
RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
_reader = Nothing
End If
End Sub
Das entspricht ungefähr 35 Infrastrukturzeilen, um einen Barcode zu lesen. Zählen Sie, was tatsächlich geschieht:
- Eine
BarcodeReader-Instanz wird erstellt und als Feld am Leben gehalten. - Im Konstruktor ist ein Ereignishandler eingebunden.
- Jeder Aufruf von
ReadBarcodeAsyncerstellt einen neuenTaskCompletionSource<string>, der einem gemeinsamen Feld zugewiesen ist – was bedeutet, dass dieser Dienst nicht threadsicher ist, wie geschrieben. Gleichzeitige Aufrufe würden_resultüberschreiben. - Das Bild muss als
BitmapImagevon einemUrigeladen werden – nicht als Dateipfad-String, nicht als Byte-Array, nicht als Stream. DecodeAsync()löst das Ereignis asynchron aus. DasTaskCompletionSourceist der Kleber zwischen der Rückrufwelt und der async/await-Welt.- Der Rückruf extrahiert
e.Value, wenne.SymbolFoundwahr ist. - Die
Dispose()-Methode muss den Ereignishandler abtrennen, um Speicherlecks zu verhindern.
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, in dem _result.Task niemals abgeschlossen wird – ein Timeout, ein Abbruch-Token oder ein Schutz davor, dass das Ereignis niemals 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. Was sie feststellen, ist, dass Infragistics.Win.UltraWinBarcode überhaupt keine Lesefunktion 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 erzeugt eine Abdeckungslücke für Teams, die Mixed-Framework-Projekte betreiben. 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
Das Symbology-Flags-Argument an Decode() im WPF-Leser verdient seinen eigenen Abschnitt, da sein Fehlermodus still ist: Ein fehlendes Flag gibt ein leeres Ergebnis ohne Fehler zurück.
Wenn Sie in den Leser aufrufen, verodern Sie jedes Barcode-Familien, die Sie durchsuchen möchten. Die unterstützten Familien sind QR, EAN/UPC (EanUpc), Code 39 (Code39Ext), Code 128, MaxiCode und Interleaved 2 of 5 – DataMatrix ist überhaupt nicht im Enum, sodass der WPF-Leser es nicht dekodieren kann. Symbology.All deckt alles im Enum ab:
// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
_reader.DecodeAsync(bitmap, symbologies);
// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
Symbology.Code39Ext |
Symbology.QRCode |
Symbology.EanUpc |
Symbology.Interleaved2Of5;
_reader.DecodeAsync(bitmap, symbologies);
' Build flags explicitly, or use Symbology.All to search every family
Dim symbologies = Symbology.Code128 Or
Symbology.Code39Ext Or
Symbology.QRCode Or
Symbology.EanUpc Or
Symbology.Interleaved2Of5
_reader.DecodeAsync(bitmap, symbologies)
Wenn ein Barcode-Bild einen QR-Code enthält und Symbology.QRCode nicht in den Flags ist, kommt e.SymbolFound falsch zurück und e.Value ist leer. 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 Leser schlägt still für alle Bilder mit dieser Familie fehl.
- Der Fehler sieht genauso aus wie "Bild hat keinen Barcode" und nicht wie "Format nicht konfiguriert".
Teams, die dies debuggen, verbringen Zeit damit, die Bildqualität zu untersuchen, bevor sie feststellen, dass die Familie nie in der Flaggenliste war. DataMatrix ist ein schärferer Fall: Es gibt kein Flag zum Hinzufügen, weil der WPF-Leser es überhaupt nicht unterstützt.
IronBarcode erfordert kein Format-Argument. Es erkennt bei jedem Lesen automatisch jedes unterstützte Format. 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 Functions | 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 BarCode
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 BarCode
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")
BarcodeReader.Read() ist eine statische Methode. Keine Instanz zu verwalten, kein Ereignis zu verbinden, keine TaskCompletionSource, um Rückrufmuster zu überbrücken. Es akzeptiert einen Dateipfad-String, ein Byte-Array, ein Stream oder ein Array von jedem davon zur Batch-Verarbeitung.
Für die Generierung gibt BarcodeWriter.CreateBarcode() ein Barcode-Objekt zurück, das Sie als PNG, JPEG, SVG speichern oder als Binärdaten erhalten 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")
Die Lizenzinitialisierung erfolgt einmalig beim Start der Anwendung:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Parallelverarbeitung: Stapelverarbeitung
Die Stapelverarbeitung offenbart eine weitere strukturelle Einschränkung des Infragistics WPF-Readers. Da der Leser einen gemeinsamen Ereignishandler verwendet und das _result-Feld bei jedem Aufruf überschrieben wird, kann die oben gezeigte Dienstklasse 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
// field mean concurrent calls would overwrite _result before the previous decode completes
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
// field mean concurrent calls would overwrite _result before the previous decode completes
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
Imports System.Threading.Tasks
' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' field mean concurrent calls would overwrite _result before the previous decode completes
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
Um dies parallel auszuführen, ist eine erhebliche zusätzliche Infrastruktur erforderlich: ein Lock, eine Warteschlange oder ein Semaphore, um sicherzustellen, dass _result nicht überschrieben wird, während ein vorheriges Decoding noch im Gange ist. Das ist ein nicht triviales Problem der Parallelverarbeitung für eine eigentlich einfache E/A-Operation.
IronBarcode's static BarcodeReader.Read() is thread-safe. 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)
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
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 Functions | Nicht verfügbar | Ja |
| Blazor -Server | Nicht verfügbar | Ja |
| Automatische Formaterkennung | Nein — müssen Symbologie-Flaggen an Decode() übergeben | Ja — Formate 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 (weggelassene Symbologie-Familie) | 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 | Jahresabonnement (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 an 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.DecodeAsync(bitmap, Symbology.X |Symbology.Y) |
Automatische Erkennung – keine Konfiguration erforderlich |
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap, ...) |
BarcodeReader.Read(path) |
e.Value (in ReaderDecodeArgs) |
result.Value |
e.Symbology (in ReaderDecodeArgs) |
result.Format |
TaskCompletionSource<string> asynchroner Wrapper |
Synchron – kein Wrapper erforderlich |
Dispose() – Ereignishandler abtrennen |
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 gut mit UltraWinBarcode, aber dann kommt eine neue Anforderung: einen Barcode von einem hochgeladenen Bild scannen oder ein Etikett vor dem Drucken validieren. 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 installiert mit dotnet add package BarCode und arbeitet 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. Der Infragistics WPFBarcodeReader geht mit ihnen. 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. IronBarcode's statischer Leser ist threadsicher und unterstützt Parallel.ForEach oder seine integrierte MaxParallelThreads-Option ohne jegliche Parallelitätsinfrastruktur.
Stille Formatfehler in der Produktion. Ein Team entdeckt, dass Barcodes einer bestimmten Familie wochenlang stillschweigend versagt haben, weil die Symbology-Flags an Decode() diese Familie nicht enthalten haben. 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. Die WPFBarcodeReader liest Barcodes. Die WinFormsUltraWinBarcode 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 Core-Controller schreiben, und derselbe Aufruf, den Sie in einem Linux-Docker-Container schreiben. Keine Ereignisse, keine Flags, 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 for .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.

