Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

Spire.Barcode vs IronBarcode: C# Barcode Bibliothek Vergleich

ZXing.Net.MAUI vs IronBarcode: C# MAUI Barcode Comparison 2026

ZXing.Net.Maui.Controls v0.7.4. Stabil auf NuGet, aber immer noch vor 1.0. Windows MAUI-Scannen nicht unterstützt (nur Generierung). Auto-Fokus des iPhone 15 Pro dokumentiert als betroffen (Issue #260). Kameraressourcenverlust ohne Dispose() (Issue #164). Dies ist die Bibliothek, zu der die meisten .NET MAUI Entwickler zuerst greifen – und die am häufigsten Produktionsprobleme aufdeckt, bevor ein Projekt überhaupt ausgeliefert wird.

ZXing .NET.MAUI verstehen

ZXing .NET.MAUI ist eine von der Community gepflegte .NET MAUI Portierung der ZXing .NET Barcode-Bibliothek, entwickelt und veröffentlicht von Jon Dick (GitHub: Redth) unter der MIT-Lizenz. Es bietet ein XAML-Kamerasteuerelement, CameraBarcodeReaderView, das einen Live-Barcode-Scannen-Sucher in MAUI-Seiten einbettet. Entwickler verknüpfen ein BarcodesDetected-Ereignis, um Scanergebnisse zu erhalten, während die Kamera Frames erfasst. Die Bibliothek erbt die vollständige Barcode-Format-Engine von ZXing.Net, einschließlich seines BarcodeFormats-Enums und BarcodeReaderOptions-Konfigurationsmodells.

Das Paket ZXing.Net.Maui.Controls wird in MauiProgram.cs über builder.UseBarcodeReader() registriert und ist auf die mobile Kameraleitung für iOS und Android ausgelegt. Die Bibliothek wird von keiner kommerziellen Organisation unterstützt, verfügt über keine Service-Level-Vereinbarung (SLA) und bietet keine kostenpflichtige Supportstufe an. Seine Version 0.7.4 ist eine stabile NuGet-Version, bleibt jedoch unter pre-1.0 unter semantischer Versionierung.

Wichtigste architektonische Merkmale von ZXing .NET.MAUI:

  • Pre-1.0 Status: Das NuGet-Paket ist bei v0.7.4 — stabil, aber immer noch vor 1.0. API-Änderungen in der Minder-Version sind vor 1.0 möglich, die Bug-Fix-Frequenz hängt vom Community-Maintainer ab, und es gibt keinen kommerziellen Support-Vertrag.
  • iOS- und Android-Scannen: Die Bibliothek ist auf Plattform-Kamera-APIs für iOS und Android aufgebaut. Windows MAUIunterstützt nur die Generierung — Kamera-Scannen ist nicht implementiert. Mac Catalyst ist in der Ziellistenrahmen enthalten, aber Scannen ist nicht offiziell dokumentiert.
  • Kontinuierlicher Kamerasucher: CameraBarcodeReaderView ist ein Live-Kamerasteuerelement, das kontinuierlich läuft, solange die Seite sichtbar ist. Es beansprucht Bildschirmfläche und erfordert ein Seitenlebenszyklusmanagement.
  • Keine Dispose()-Implementierung: Das Steuerelement implementiert IDisposable nicht. Kameraresourcen werden bei der Seitennavigation nicht formal freigegeben, was einen manuellen IsDetecting = false-Workaround in OnDisappearing() erfordert (GitHub-Issue #164).
  • iPhone 15 Pro Autofokusproblem: GitHub-Issue #260 dokumentiert, dass iPhone 15 Pro und Pro Max-Geräte (Hardware-Identifier iPhone16,1 und iPhone16,2) keinen zuverlässigen Fokus für die Barcode-Erkennung erreichen. Derzeit ist kein programmatische Korrektur verfügbar.
  • Android-Kamera-Kompatibilitätsproblem: GitHub-Issue #275 verfolgt Build-Fehler durch Kompatibilitätskonflikte mit AndroidX Camera 1.5.0, mit einem Workaround, die Kamerapakete auf 1.4.x festzulegen oder das Projekt minSdkVersion zu erhöhen.
  • Erbt ZXing.Net Formatspezifikation: Jede Scansitzung erfordert eine explizite Deklaration, welche BarcodeFormats-Werte gescannt werden sollen. Formate, die nicht in BarcodeReaderOptions.Formats aufgeführt sind, werden stumm ignoriert, auch wenn sie im Kameraframe sichtbar sind.
  • Architektur nur für Kameras: Die Bibliothek verfügt über keine Dateieingabe-API, keine Stream-Lese-API und keine PDF-Barcode-Extraktionsfunktion. Alle Scans müssen über den Live-Kamerasucher erfolgen.

Die CameraBarcodeReaderView-Architektur

Das CameraBarcodeReaderView-Steuerelement ist die zentrale Komponente von ZXing.Net.MAUI. Es wird in XAML deklariert und über eine BarcodeReaderOptions-Verbindung konfiguriert. Jede Seite, die es verwendet, muss OnAppearing- und OnDisappearing-Überschreibungen implementieren, um den IsDetecting-Zustand zu verwalten:


<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
    <zxing:CameraBarcodeReaderView
        x:Name="CameraView"
        Options="{Binding ReaderOptions}"
        BarcodesDetected="OnBarcodesDetected" />
</ContentPage>

<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
    <zxing:CameraBarcodeReaderView
        x:Name="CameraView"
        Options="{Binding ReaderOptions}"
        BarcodesDetected="OnBarcodesDetected" />
</ContentPage>
XML
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
    base.OnDisappearing();
    if (CameraView != null)
        CameraView.IsDetecting = false;  //NeinIDisposable on the control
}

protected override void OnAppearing()
{
    base.OnAppearing();
    if (CameraView != null)
        CameraView.IsDetecting = true;
}
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
    base.OnDisappearing();
    if (CameraView != null)
        CameraView.IsDetecting = false;  //NeinIDisposable on the control
}

protected override void OnAppearing()
{
    base.OnAppearing();
    if (CameraView != null)
        CameraView.IsDetecting = true;
}
' Toggling IsDetecting in lifecycle overrides is the documented pattern
Protected Overrides Sub OnDisappearing()
    MyBase.OnDisappearing()
    If CameraView IsNot Nothing Then
        CameraView.IsDetecting = False 'NeinIDisposable on the control
    End If
End Sub

Protected Overrides Sub OnAppearing()
    MyBase.OnAppearing()
    If CameraView IsNot Nothing Then
        CameraView.IsDetecting = True
    End If
End Sub
$vbLabelText   $csharpLabel

Jede Scanseite in einer ZXing .NET.MAUI-Anwendung enthält diesen Lebenszyklus-Boilerplate-Code. Das Fehlen von IDisposable bedeutet, dass der Kamerazustand manuell über das IsDetecting-Flag anstelle des standardmäßigen Dispose-Musters verwaltet werden muss.

IronBarcode verstehen

IronBarcode ist eine kommerziell unterstützte .NET Barcode-Bibliothek, die von Iron Software entwickelt wurde. Es bietet sowohl Barcode-Lesen als auch -Erzeugung über eine statische API, BarcodeReader.Read(), die Bildbytes, Dateipfade, Streams und PDF-Dokumente akzeptiert. In einem MAUI-Kontext kombiniert IronBarcode sich mit MAUI's eingebautem MediaPicker, um Bilder durch die Systemkamera zu erfassen, dann das resultierende Bild nach der Aufnahme zu verarbeiten, anstatt einen kontinuierlichen Kamerastream zu verarbeiten.

Die Bibliothek zielt über dasselbe Paket und dieselben Codepfade auf alle MAUI-Plattformen ab – iOS, Android, Windows und macOS. Keine plattformbezogene Dienstregistrierung ist in MauiProgram.cs erforderlich, es wird kein Kamerasichtsteuerung in XAML eingebettet und keine Lebenszyklusverwaltung benötigt, da IronBarcode keinen laufenden Kamerazustand aufrechterhält.

Hauptmerkmale von IronBarcode:

  • Stabile kommerzielle Version: Veröffentlicht als produktionsreifes NuGet Paket mit kommerziellem Support, SLA und regelmäßigem Release-Zyklus.
  • Alle MAUI-Plattformen: Unterstützt iOS-, Android-, Windows- und macOS-MAUI-Ziele mit einem einzigen Paket und einem einzigen Codemuster.
  • Zustandslose API: BarcodeReader.Read() ist ein statischer Methodenaufruf. Zwischen den Scans laufen keine Hintergrundprozesse, es werden keine Lebenszyklus-Hooks benötigt und es sammeln sich keine Kameraressourcen über die Seitennavigation hinweg an. Automatische Erkennung aller Formate: Erkennt automatisch über 50 Barcode-Formate ohne Formatliste. Zum Scannen unbekannter Formate ist keine Konfiguration erforderlich.
  • Datei- und PDF-Lesen: Liest Barcodes nativ aus Dateipfaden, Byte-Arrays, Datenströmen und PDF-Dokumenten und deckt damit Szenarien ab, die Live-Kamera-Bibliotheken nicht abdecken können.
  • ML-gestützte Wiederherstellung beschädigter Barcodes: Wendet Modelle des maschinellen Lernens an, um Barcodes aus beschädigten, teilweise verdeckten oder qualitativ minderwertigen Bildern wiederherzustellen, was mit Schwellenwertalgorithmen nicht möglich ist.
  • Barcode-Generierung: Erzeugt alle gängigen 1D- und 2D-Barcode-Formate als Bilder mit konfigurierbarer Größe, Farbe und Rändern.
  • Plattformübergreifende Bereitstellung: Das gleiche Paket läuft in ASP.NET Core, WPF, WinForms, Konsolenanwendungen, Azure Functions und Docker-Containern parallel zu MAUI.

Funktionsvergleich

Die folgende Tabelle hebt die wichtigsten Unterschiede zwischen ZXing .NET.MAUI und IronBarcode hervor:

Feature ZXing.Net.MAUI IronBarcode
Veröffentlichungsstatus Stabil, aber vor 1.0 (v0.7.4) Stabile, kommerzielle Version
Windows, Linux, macOS, Docker, Azure, AWS. iOS, Android-Scannen (Windows nur Generierung) iOS, Android, Windows, macOS, Server
Formatvorgabe erforderlich Ja Nein (automatische Erkennung)
Kamera-Ressourcenmanagement Manuell (IsDetecting) Nicht zutreffend – staatenlos
PDF-Barcode-Extraktion Nicht verfügbar Ja
Lizenz MIT (kostenlos, Community) Kommerziell
Kommerzielle Unterstützung None Ja

Detaillierter Funktionsvergleich

Feature ZXing.Net.MAUI IronBarcode
Plattform
iOS MAUI Ja (iPhone 15 Pro Fokus-Issue #260) Ja
Android MAUI Ja (Kamera 1.5.0 Build-Issue #275) Ja
Windows MAUI Nur Generierung — Scannen nicht implementiert Ja
macOS MAUI Mac Catalyst angezielt; Scannen nicht offiziell dokumentiert Ja
ASP.NET Core / Server Nein Ja
WPF/WinForms Nein Ja
Azure Functions / Docker Nein Ja
.NET Framework 4.6.2+ Nein Ja
Lektüre
automatische Formaterkennung Nein – Formate müssen angegeben werden. Ja (über 50 Formate)
Dateipfad-Eingabe Nur über ZXing .NET Core Ja
Stream-Eingabe Nur über ZXing .NET Core Ja
PDF-Barcode-Extraktion Nein Ja
Wiederherstellung beschädigter Barcodes Nur für TryHarder Ja (ML-gestützt)
Kameraintegration
Live-Suchersteuerung Ja Nein (MediaPicker-Systembenutzeroberfläche)
Lebenszyklusmanagement erforderlich Ja (Erkennung) Nein
Dispose()-Implementierung Nein Nicht zutreffend
iPhone 15 Pro Autofokus Betroffen (GitHub-Issue #260) Nicht zutreffend
Generation
Barcode-Generierung Ja (über ZXing .NET) Ja
Wartung
Veröffentlichungsstatus Stabil, aber vor 1.0 (v0.7.4) Produktionsbereit
Kommerzielle Unterstützung None Ja
API-Stabilitätsgarantie Pre-1.0 — Minder-Version-Änderungen möglich Ja
Lizenz MIT (kostenlos) Kommerziell

Plattformunterstützung

Die Plattformabdeckung ist ein struktureller Unterschied zwischen ZXing .NET.MAUI und IronBarcode , da die beiden Bibliotheken auf grundlegend verschiedenen Annahmen darüber basieren, wo .NET MAUI Anwendungen ausgeführt werden.

ZXing .NET.MAUI-Ansatz

ZXing.Net.MAUI ist auf Plattform-Kamera-APIs für iOS und Android aufgebaut. Windows MAUIunterstützt nur Barcode-Generierung — Kamera-Scannen ist nicht implementiert und steht nicht auf einer öffentlichen Roadmap. Dies spiegelt die architektonische Entscheidung wider, die Bibliothek um ein Live-Kamera-Sucher-Steuerelement zu bauen, dessen Plattformimplementierungen nur für mobile Betriebssysteme geschrieben wurden.

Ein MAUI-Projekt, das auf net8.0-windows10.0.19041.0 abzielt, erhält keine Barcode-Scannen-Funktionalität von ZXing.Net.MAUI. Mac Catalyst ist in der Ziellistenrahmen enthalten, jedoch ist das Scannen auf diesem Ziel nicht offiziell dokumentiert. Teams, die ein Projekt mit nur mobilen Zielen starten und später eine Windows- oder macOS-Anforderung hinzufügen, werden feststellen, dass ZXing.Net.MAUI auf diesen Zielen nicht scannen kann. Der iOS-Support selbst trägt eine Einschränkung: GitHub Issue #260 dokumentiert, dass iPhone 15 Pro und Pro Max-Geräte von einem Auto-Fokus-Issue betroffen sind, das eine zuverlässige Erkennung verhindert.

IronBarcode Ansatz

IronBarcode unterstützt alle MAUI-Zielframeworks – iOS, Android, Windows und macOS – mit demselben Paket und demselben Codemuster. Der MediaPicker + BarcodeReader.Read()-Ansatz passt sich natürlich jeder Plattform an: auf Mobilgeräten ruft MediaPicker.CapturePhotoAsync() die Gerätekamera auf; Unter Windows wird es dem Dateiauswahldialog zugeordnet, was für eine Desktop-Umgebung ein angemessenes Verhalten darstellt. Es ist kein plattformspezifischer Code, keine bedingte Kompilierung und keine Registrierung von Plattformdiensten erforderlich.

Das MAUI-Desktop-Barcode-Muster für Windows und macOS wird vom selben Paket abgedeckt, das auch das Scannen auf Mobilgeräten übernimmt. Der gleiche BarcodeReader.Read()-Aufruf, der auf einem Android-Gerät läuft, läuft auch in einem ASP.NET Core-Endpunkt, einer WinForms-Desktopanwendung oder einer Azure-Funktion — das Bereitstellungsziel beeinflusst die API nicht.

Kameraintegration und Lebenszyklus

Die beiden Bibliotheken vertreten gegensätzliche architektonische Positionen hinsichtlich der Funktionsweise des Kamerazugriffs in einer MAUI-Anwendung.

ZXing .NET.MAUI-Ansatz

CameraBarcodeReaderView ist ein persistentes Kamerasteuerelement, das in der XAML-Seite eingebettet ist. Es beginnt mit der Verarbeitung von Kameraframes, wenn IsDetecting auf true gesetzt ist, und stoppt, wenn es auf false gesetzt ist. Das Fehlen einer Dispose()-Implementierung bedeutet, dass Kameraresourcen nicht durch das standardmäßige IDisposable-Muster freigegeben werden, wenn der Benutzer wegnavigiert. Die dokumentierte Abschwächung besteht darin, IsDetecting = false in OnDisappearing() zu setzen und es in OnAppearing() wiederherzustellen:

// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
    base.OnDisappearing();
    CameraView.IsDetecting = false;
}

protected override void OnAppearing()
{
    base.OnAppearing();
    CameraView.IsDetecting = true;
}
// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
    base.OnDisappearing();
    CameraView.IsDetecting = false;
}

protected override void OnAppearing()
{
    base.OnAppearing();
    CameraView.IsDetecting = true;
}
' ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
Protected Overrides Sub OnDisappearing()
    MyBase.OnDisappearing()
    CameraView.IsDetecting = False
End Sub

Protected Overrides Sub OnAppearing()
    MyBase.OnAppearing()
    CameraView.IsDetecting = True
End Sub
$vbLabelText   $csharpLabel

Dieses Muster muss auf jeder Seite wiederholt werden, die einen Scanner enthält. Anwendungen, die häufig zu und von Scan-Seiten navigieren, können Kameraressourcen ansammeln, die nicht vollständig freigegeben wurden, was in GitHub Issue #164 verfolgt wird, zusammen mit Berichten über Speicherwachstum und sporadische Kamerainitialisierung bei Rückkehr. Das Autofokusproblem beim iPhone 15 Pro (GitHub-Issue #260) ist ein separates Anliegen in der Kamera-Integrationsschicht: Die Kameraansicht rendert den Barcode klar, aber das Autofokussystem arretiert nicht scharf genug für die Erkennung auf iPhone16,1- und iPhone16,2-Hardware. Das dokumentierte Workaround ist, dem Benutzer zu sagen, er solle den Abstand zwischen dem Gerät und dem Barcode manuell anpassen.

IronBarcode Ansatz

IronBarcode bettet keine Kamerasteuerung in das XAML-Layout ein. Stattdessen öffnet der MediaPicker.CapturePhotoAsync()-Aufruf die System-Kamera-UI, wenn der Benutzer einen Button drückt. Die Systemkamera übernimmt Fokus, Belichtung und Autofokus unabhängig. Wenn der Benutzer die Aufnahme bestätigt, wird das resultierende Bild als Byte-Array an BarcodeReader.Read() übergeben:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var barcode in results)
        Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}

//NeinOnAppearing or OnDisappearing needed — no camera state to manage
// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var barcode in results)
        Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}

//NeinOnAppearing or OnDisappearing needed — no camera state to manage
Imports IronBarCode

Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
    Dim photo = Await MediaPicker.CapturePhotoAsync()
    If photo Is Nothing Then Return

    Using stream = Await photo.OpenReadAsync()
        Using ms As New MemoryStream()
            Await stream.CopyToAsync(ms)

            Dim results = BarcodeReader.Read(ms.ToArray())
            For Each barcode In results
                Console.WriteLine($"{barcode.Format}: {barcode.Value}")
            Next
        End Using
    End Using
End Sub

'NeinOnAppearing or OnDisappearing needed — no camera state to manage
$vbLabelText   $csharpLabel

Das .NET MAUI Barcode-Scanner-Tutorial behandelt die vollständige Projekteinrichtung für dieses Muster, einschließlich der Berechtigungskonfiguration für iOS und Android. Da es keine persistente Kameraansicht gibt, gibt es keine Ressource freizugeben, keinen Zustand umzuschalten und keinen Lebenszyklus-Boilerplate-Code, der seitenübergreifend gepflegt werden muss.

Formatspezifikation

Die Art und Weise, wie eine Bibliothek die Barcode-Formaterkennung handhabt, hat direkte Auswirkungen auf die Zuverlässigkeit des Scannens im realen Einsatz.

ZXing .NET.MAUI-Ansatz

ZXing .NET.MAUI erbt die ZXing .NET -Formatspezifikationsanforderung. Bevor das Scannen beginnt, muss der Entwickler BarcodeReaderOptions.Formats mit einem Bitmasken der BarcodeFormats-Enum-Werte, die erkannt werden sollen, befüllen. Formate, die nicht in dieser Liste enthalten sind, werden nicht erkannt – stillschweigend, ohne Fehlermeldung oder Warnung:

// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
    Formats = BarcodeFormats.QRCode |
              BarcodeFormats.Code128 |
              BarcodeFormats.Ean13 |
              BarcodeFormats.UpcA,
    TryHarder = true,
    AutoRotate = true
};
// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
    Formats = BarcodeFormats.QRCode |
              BarcodeFormats.Code128 |
              BarcodeFormats.Ean13 |
              BarcodeFormats.UpcA,
    TryHarder = true,
    AutoRotate = true
};
' ZXing.Net.MAUI: formats must be declared explicitly
' Formats not listed here are not detected
ReaderOptions = New BarcodeReaderOptions With {
    .Formats = BarcodeFormats.QRCode Or
               BarcodeFormats.Code128 Or
               BarcodeFormats.Ean13 Or
               BarcodeFormats.UpcA,
    .TryHarder = True,
    .AutoRotate = True
}
$vbLabelText   $csharpLabel

Wenn ein Benutzer die Kamera auf einen GS1 DataBar, einen Aztec-Code, einen MaxiCode oder ein beliebiges Format richtet, das nicht in den Optionen deklariert ist, gibt der Scan kein Ergebnis zurück, ohne einen Fehler zu erzeugen. Die Kamera rendert den Barcode und es wird kein Resultat an die Anwendung zurückgegeben. In einer kontrollierten Umgebung – einem Lager, in dem jeder Artikel mit einem Code128-Etikett versehen ist – ist dies zu bewältigen. In Bereitstellungen, in denen Barcode-Formate von externen Lieferanten, Kunden oder Drittsystemen bestimmt werden, wird das Fehlen eines Fallback-Pfads zu einem wiederkehrenden Support-Problem.

IronBarcode Ansatz

IronBarcode führt eine automatische Formaterkennung für alle unterstützten Formate ohne jegliche Vorkonfiguration durch. BarcodeReader.Read() analysiert das Bild und gibt Ergebnisse für jeden Barcode zurück, den es identifiziert, unabhängig vom Format. Keine BarcodeReaderOptions-Liste ist erforderlich:

// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
    Console.WriteLine($"{barcode.Format}: {barcode.Value}");
// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
    Console.WriteLine($"{barcode.Format}: {barcode.Value}");
Imports IronBarcode

' IronBarcode: no format specification needed
' All 50+ formats detected automatically
Dim results = BarcodeReader.Read(imageBytes)
For Each barcode In results
    Console.WriteLine($"{barcode.Format}: {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Wenn eine Leistungsoptimierung für ein kontrolliertes Szenario erforderlich ist, in dem nur ein Format erwartet wird, können Formathinweise optional übergeben werden – sie sind jedoch niemals für die korrekte Erkennung erforderlich. Ein Barcode in einem vom Entwickler nicht vorhergesehenen Format wird dennoch erkannt und zurückgegeben.

Datei- und PDF-Verarbeitung

Neben dem Scannen mit Live-Kameras beinhalten viele Produktions-Barcode-Workflows das Lesen von gespeicherten Dokumenten – Versandrechnungen, digitalen Tickets, hochgeladenen Bildern und PDF-Anhängen.

ZXing .NET.MAUI-Ansatz

ZXing .NET.MAUI ist eine Kamerasteuerungsbibliothek. Es verfügt über keine API zum Lesen von Barcodes aus Dateipfaden, direkt aus dem Speicher übergebenen Byte-Arrays oder PDF-Dokumenten. Das CameraBarcodeReaderView-Steuerelement erfordert eine Live-Kamerafeed; Es gibt keine statische Methode, die einen Dateipfad akzeptiert und Barcode-Ergebnisse zurückgibt. Teams, die Barcodes aus hochgeladenen PDFs, Dokumentenmanagementsystemen oder Stapelbildverarbeitungswarteschlangen lesen müssen, können ZXing .NET.MAUI für diese Szenarien nicht verwenden und müssen eine separate Bibliothek einführen.

IronBarcode Ansatz

IronBarcode liest Barcodes aus jeder Quelle durch die gleiche BarcodeReader.Read()-Methode. Es akzeptiert Dateipfade, Byte-Arrays, Datenströme und PDF-Dokumente. PDF-Parsing ist nativ – IronBarcode verarbeitet PDF-Seiten direkt ohne einen Zwischenschritt der Rasterisierung:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");

// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
    var fileResults = BarcodeReader.Read(file.FullPath);
    foreach (var result in fileResults)
        ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");

// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
    var fileResults = BarcodeReader.Read(file.FullPath);
    foreach (var result in fileResults)
        ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
Imports IronBarCode
Imports Microsoft.Maui.Storage

' Read barcodes from a PDF file
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}")
Next

' Read from a user-selected file using MAUI FilePicker
Dim file = Await FilePicker.PickAsync()
If file IsNot Nothing Then
    Dim fileResults = BarcodeReader.Read(file.FullPath)
    For Each result In fileResults
        ResultLabel.Text &= $"\n{result.Format}: {result.Value}"
    Next
End If
$vbLabelText   $csharpLabel

Der vollständige Workflow zum Lesen von PDF-Barcodes, einschließlich mehrseitiger Dokumente und gemischter Barcode-Formate über mehrere Seiten hinweg, ist im Leitfaden "Barcodes aus PDF lesen" dokumentiert. Dies umfasst Versandrechnungen, digitale Tickets, Dokumentenmanagement-Workflows und Stapelverarbeitungsszenarien, die die reine Kameraarchitektur von ZXing .NET.MAUI nicht abdecken kann.

API-Mapping-Referenz

ZXing.Net.MAUI IronBarcode Notizen
builder.UseBarcodeReader() Nicht erforderlich Entfernen aus MauiProgram.cs
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;..." Nicht erforderlich XAML-Namespace-Deklaration entfernen
<zxing:CameraBarcodeReaderView> Ersetzen mit <Button> + MediaPicker Architektonischer Wandel
Options="{Binding ReaderOptions}" Nicht erforderlich Kein Optionsobjekt erforderlich
BarcodesDetected="OnBarcodesDetected" BarcodeReader.Read() Rückgabewert Ereignis → Methodenrückgabe
new BarcodeReaderOptions { Formats = BarcodeFormats.X \| ... } Nicht erforderlich Die automatische Erkennung ersetzt dies.
BarcodeDetectionEventArgs e IEnumerable<BarcodeResult> Unterschiedliches Ergebnislieferungsmodell
e.Results Rückgabewert von BarcodeReader.Read()
barcode.Value result.Value Gleicher Eigenschaftsname
barcode.Format result.Format Gleicher Eigenschaftsname
BarcodeFormats.QRCode BarcodeEncoding.QRCode Enum umbenennen
BarcodeFormats.Code128 BarcodeEncoding.Code128 Enum umbenennen
BarcodeFormats.Ean13 BarcodeEncoding.EAN13 Enum umbenennen
CameraView.IsDetecting = false (OnDisappearing) Nicht erforderlich – Methode entfernen IronBarcode ist zustandslos
CameraView.IsDetecting = true (OnAppearing) Nicht erforderlich – Methode entfernen IronBarcode ist zustandslos
API ohne Dateieingabe BarcodeReader.Read("path/to/file.png") Neue Fähigkeit
Keine PDF-API BarcodeReader.Read("document.pdf") Neue Fähigkeit

Wenn Teams den Wechsel von ZXing .NET.MAUI zu IronBarcode erwägen

Mehrere konkrete Szenarien führen zu der Entscheidung, IronBarcode als Ersatz für ZXing .NET.MAUI zu evaluieren. Hierbei handelt es sich um Projekt- und Produktbedingungen, nicht um Implementierungspräferenzen.

Windows MAUI-Anforderungen

Der häufigste Auslöser für eine erneute Bewertung ist das Hinzufügen eines Windows MAUI-Ziels zu einem Projekt, das ursprünglich nur für iOS und Android konzipiert war. Die Teams von MAUI beginnen häufig mit mobilen Versionen und erweitern diese dann auf Desktop-Ziele, wenn sich die Anforderungen ändern. Wenn diese Erweiterung erfolgt, bietet ZXing .NET.MAUI keine Lösung – die Windows-Plattform ist nicht implementiert und auch nicht in der öffentlichen Roadmap vorgesehen. Das Team muss entweder akzeptieren, dass Barcode-Scanning unter Windows nicht verfügbar sein wird, oder die Bibliothek ersetzen. Da der Austausch in jedem Fall eine strukturelle Änderung des Scanmusters mit sich bringt, nehmen die Teams die Änderung in der Regel für alle Plattformen gleichzeitig vor.

Hardwarekompatibilität der aktuellen Generation

Das iPhone 15 Pro Autofokus-Problem (GitHub-Issue #260) ist eine echte Überlegung für jedes Team, das einen Barcode-Scanner an iOS-Benutzer liefert. iPhone 15 Pro und Pro Max sind häufig im Verbrauchersegment, das eine polierte Anwendungs-Erfahrung erwartet, und ein Workaround, der von Benutzern verlangt, den Abstand zu einem Barcode anzupassen, ist im Vergleich zu älterer iPhone-Hardware eine auffällige UX-Regression. Teams, die dieses Problem in der QA aufdecken oder Support-Berichte von iPhone 15 Pro-Nutzern erhalten, stehen vor der Entscheidung, auf einer Bibliothek zu bleiben, für die derzeit keine Lösung verfügbar ist, oder zu einem Ansatz zu wechseln, der nicht vom Kamera-Sucher-Fokusmodell betroffen ist.

Datei- und Dokumentenverarbeitung

Die Anforderungen an das Barcode-Scannen beschränken sich selten auf die Live-Kameraaufnahme. Anwendungen, die als Inventarscanner beginnen, werden häufig erweitert und umfassen dann das Lesen von Barcodes aus hochgeladenen PDFs, die Verarbeitung von Versandrechnungen oder die Bearbeitung digitaler Tickets aus E-Mail-Anhängen. ZXing .NET.MAUI verfügt über keine API für diese Szenarien. Wenn eine Produktanforderung im Backlog landet, die das Lesen eines Barcodes aus einer Datei oder einem Dokument beinhaltet, müssen Teams, die ZXing .NET.MAUI verwenden, eine separate Bibliothek einführen, um dies zu handhaben. Wenn das Team IronBarcode bereits für eines dieser dateibasierten Szenarien verwendet, ist die Konsolidierung des MAUI-Kamera-Scannens in dieselbe Bibliothek der logische nächste Schritt.

Anforderungen an die Produktionsstabilität

Die Bezeichnung pre-1.0 bei v0.7.4 — während das Paket selbst eine stabile NuGet-Version ist — hat Auswirkungen auf Teams, die einer Softwarekompositionsanalyse, Abhängigkeitsaudits oder internen Genehmigungsprozessen unterliegen. Einige Unternehmensumgebungen erfordern, dass Produktionsabhängigkeiten eine stabile Version 1.0+ tragen, einen kommerziellen Support-Vertrag oder beides. ZXing.Net.MAUI wird von der Community gepflegt und ist pre-1.0, was sich für interne Tools und Prototypen eignet, jedoch Überprüfungsschritte in kundenorientierten Anwendungen hinzufügt, bei denen der Barcode-Scanner der primäre Workflow ist. Das Fehlen einer bezahlten Support-Stufe bedeutet, dass sich jedes kritische Fehler auf die Verfügbarkeit des Community-Maintainers stützt.

Gemeinsame Überlegungen zur Migration

Die strukturelle Umstellung von ZXing .NET.MAUI auf IronBarcode beinhaltet drei spezifische technische Ersetzungen, die jede Datei in der Codebasis betreffen, die am Barcode-Scannen beteiligt ist.

CameraBarcodeReaderView zu MediaPicker-Muster

Das CameraBarcodeReaderView-XAML-Steuerelement und seine xmlns:zxing-Namespace-Deklaration werden vollständig entfernt. In jeder XAML-Datei, die eine Scannansicht beinhaltete, wird diese durch ein Button-Steuerelement ersetzt, das MediaPicker.CapturePhotoAsync() in seinem Clicked-Handler aufruft. Das ereignisgesteuerte Modell — bei dem die Ergebnisse über BarcodesDetected eintreffen — wird ersetzt, indem der Rückgabewert von BarcodeReader.Read() direkt im asynchronen Handler gelesen wird.

Erkennt die Entfernung im Lebenszyklus?

Jede OnAppearing- und OnDisappearing-Überschreibung, die ausschließlich dazu dient, CameraView.IsDetecting umzuschalten, kann gelöscht werden. Wenn diese Überschreibungen andere Seitenlebenszykluslogik enthalten, werden die IsDetecting-Zeilen entfernt und die verbleibende Logik beibehalten. Es gibt kein IronBarcode-Äquivalent zu IsDetecting, da kein anhaltender Kamerazustand zwischen Seitennavigationen verwaltet werden muss.

UseBarcodeReader()-Registrierungsentfernung

ZXing.Net.MAUI erfordert einen einmaligen builder.UseBarcodeReader()-Aufruf in MauiProgram.cs, um seine Plattformkameradienste zu registrieren. IronBarcode erfordert keine MauiProgram.cs-Registrierung. Die UseBarcodeReader()-Zeile wird entfernt, und der using ZXing.Net.Maui;-Namespace-Import, der sie unterstützt, wird zusammen mit der Deinstallation des Pakets entfernt.

Zusätzliche IronBarcode Funktionen

Über die in diesem Vergleich behandelten Szenarien hinaus bietet IronBarcode eine Barcode-Funktionalität, die weit über das hinausgeht, was ein kamerabasiertes MAUI-Steuerelement leisten kann:

  • iOS Barcode-Scannen: Vollständige iOS MAUI-Unterstützung mit dem gleichen MediaPicker + BarcodeReader.Read()-Muster — keine plattformspezifische Kameraverwaltung, keine Formatlisten und kein Lebenszyklus-Schema.
  • Android Barcode Scanning : Android MAUIscannt über dieselbe einheitliche API, ohne die Abhängigkeitsprobleme der Kamera 1.5.0, die bei ZXing .NET.MAUI auftreten.
  • Barcode-Generierung: Erzeugt QR-Codes, Code128, EAN-13, PDF417, Data Matrix und alle gängigen Formate als Bilder mit konfigurierbarer Größe, Farbe, Ruhezone und Fehlerkorrekturstufe.
  • Stapelverarbeitung: Liest in einem einzigen Aufruf alle Barcodes von allen Seiten eines mehrseitigen PDFs oder eines Bildverzeichnisses und gibt zu jedem Ergebnis die Metadaten zur Seitenzahl zurück.
  • Serverseitige Bereitstellung: Das gleiche NuGet-Paket und der gleiche BarcodeReader.Read()-Aufruf laufen in ASP.NET Core Endpunkten, Azure Functions und Docker-Containern — ein Paket deckt sowohl den mobilen Client als auch das Server-Backend ab.
  • Wiederherstellung beschädigter Barcodes: Modelle des maschinellen Lernens stellen Barcodes von physisch beschädigten Etiketten, kontrastarmen Ausdrucken und Bildern wieder her, die unter suboptimalen Winkeln aufgenommen wurden und von herkömmlichen schwellenwertbasierten Decodern nicht verarbeitet werden können.
  • Stilisierte Barcode-Generierung: Erzeugt Barcodes mit benutzerdefinierten Farben, eingebetteten Logos, abgerundeten Ecken und Anmerkungstext – über die einfache monochrome Ausgabe von ZXing .NET hinaus.

.NET-Kompatibilität und Zukunftsfähigkeit

IronBarcode wird aktiv weiterentwickelt und regelmäßig mit Updates auf aktuelle .NET Versionen aktualisiert. die Bibliothek unterstützt .NET 8, .NET 9 und verfolgt nachfolgende .NET-Veröffentlichungen. Es unterstützt auch .NET Framework 4.6.2 und später für Legacy-Anwendungsumgebungen. ZXing.Net.MAUI als community-gepflegtes pre-1.0 Paket, enthält keine formalen Verpflichtungen hinsichtlich .NET-Version-Support-Zeitplänen. Für MAUI-Projekte – die an den .NET -Releasezyklus gekoppelt sind – ist die Verfügbarkeit einer aktiv gepflegten, kommerziell unterstützten Bibliothek, die jede .NET Version verfolgt, für die langfristige Planung relevant.

Abschluss

ZXing .NET.MAUI und IronBarcode stellen unterschiedliche Antworten auf dasselbe Problem dar – das Lesen von Barcodes in einer .NET MAUI Anwendung –, gehen aber von unterschiedlichen architektonischen Prämissen aus. ZXing .NET.MAUI bettet einen Live-Kamerasucher direkt in die XAML-Seite ein, der als persistentes Kamerasteuerelement fungiert und Ereignisse auslöst, während Frames analysiert werden. IronBarcode behandelt die Kamera als Erfassungsgerät, das über die System-MediaPicker zugegriffen wird, und verarbeitet ein statisches Bild nach der Aufnahme anstatt eines kontinuierlichen Streams. Dieser Unterschied in der Herangehensweise bestimmt nahezu alles andere: Plattformabdeckung, Komplexität des Lebenszyklus, Formatverarbeitung und Bereitstellungsumfang.

ZXing.Net.MAUI ist für spezifische Projektprofile wirklich geeignet: iOS- und Android-Anwendungen, Prototypen und interne Tools, Teams, die ihre Barcode-Formate im Voraus kennen, Projekte ohne Windows MAUIScan-Anforderung und Situationen, in denen die Null-Kosten MIT-Lizenz der entscheidende Faktor ist. Für einen Lagerbestandsscanner auf einer festen Anzahl von Android-Geräten, der Code128-Etiketten scannt, funktioniert ZXing .NET.MAUI einwandfrei. Der pre-1.0 Status, das iPhone 15 Pro Problem und das Lebenszyklus-Burden sind echte Kompromisse, die im richtigen Kontext akzeptabel sind.

IronBarcode eignet sich, wenn der Projektumfang größer ist: Windows- oder macOS-MAUI-Ziele, unbekannte oder variable Barcode-Formate von externen Systemen, Anforderungen, die das Lesen von Barcodes aus PDFs oder hochgeladenen Dateien umfassen, Anforderungen an die Stabilität in der Produktion oder serverseitige Barcode-Verarbeitung zusätzlich zum mobilen Scannen. Die kommerzielle Lizenz ist eine Investition, die Support, Wartung und Kompatibilitätsupdates für alle .NET Versionen umfasst. Die zustandslose API beseitigt eine Kategorie von Fehlern – Kamera-Ressourcenlecks, Lebenszyklus-Statusfehler –, die Entwickler bei ZXing .NET.MAUI manuell verhindern müssen.

Die ehrliche Einschätzung lautet, dass keine der beiden Bibliotheken uneingeschränkt richtig ist. ZXing .NET.MAUI verdient seinen Status als erste Bibliothek, die die meisten MAUI-Entwickler ausprobieren, weil sie kostenlos, vertraut und schnell zu integrieren ist. Die damit verbundenen Probleme sind real, spielen aber nur unter bestimmten Projektbedingungen eine Rolle. Wenn diese Bedingungen erfüllt sind – sei es eine Windows-Anforderung, Hardware der aktuellen iPhone-Generation, dateibasiertes Scannen oder Produktionsstandards für Stabilität –, erfüllt IronBarcode alle Anforderungen. Die Entscheidung hängt davon ab, ob die spezifischen Einschränkungen des Projekts es innerhalb oder außerhalb der Szenarien platzieren, in denen die bekannten Beschränkungen von ZXing .NET.MAUI zu Blockern werden.

Häufig gestellte Fragen

Was ist ZXing.Net.MAUI?

ZXing.Net.MAUI 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 ZXing.Net.MAUI und IronBarcode?

IronBarcode verwendet eine statische, zustandslose API, die keine Instanzverwaltung erfordert, während ZXing.Net.MAUI 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 ZXing.Net.MAUI?

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 ZXing.Net.MAUI 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 ZXing.Net.MAUI?

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 ZXing.Net.MAUI?

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 ZXing.Net.MAUI 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 die Migration von ZXing.Net.MAUI zu IronBarcode einfach?

Die Migration von ZXing.Net.MAUI zu IronBarcode beinhaltet in erster Linie das Ersetzen instanzbasierter API-Aufrufe durch statische Methoden von IronBarcode, das Entfernen von Lizenzierungsvorlagen und das Aktualisieren der Namen von Ergebniseigenschaften. 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.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

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