Wie man die Fehlerkorrektur in C# einstellt | IronQR
Von ZXing.Net.MAUI zu IronBarcode migrieren
Dieser Leitfaden bietet einen vollständigen Migrationspfad von ZXing .NET.MAUI zu IronBarcode for .NET MAUI Entwickler. Es behandelt die Gründe, warum Teams diese Migration durchführen, einen Funktionsvergleich zur Untermauerung der Entscheidung, mechanische Schritte zum Ersetzen des Pakets und Aktualisieren der Projektdateien, Codebeispiele vor und nach der Migration für jedes wichtige Anwendungsmuster, eine API-Übersetzungsreferenz, einen Abschnitt zur Fehlerbehebung bei Problemen, die während des Übergangs auftreten, eine Migrations-Checkliste zur Verfolgung des Fortschritts und eine Zusammenfassung der Ergebnisse, die die Migration liefert.
Warum von ZXing .NET.MAUI migrieren?
Die Entscheidung, von ZXing .NET.MAUI wegzukommen, wird typischerweise durch eine oder mehrere konkrete Projektbedingungen ausgelöst. Hierbei handelt es sich nicht um stilistische Präferenzen – es sind Fälle, in denen die Architektur oder der Wartungszustand der Bibliothek die Erfüllung einer Anforderung verhindert.
Windows MAUI wird nicht unterstützt: ZXing .NET.MAUI verfügt über keine Windows-Kamera-Implementierung und es gibt auch keine öffentlichen Pläne, eine solche zu entwickeln. Die Bibliothek basiert auf den Kamera-APIs der iOS- und Android-Plattformen. Wenn ein MAUI-Projekt nach dem ersten Build ein Windows-Ziel hinzufügt – ein häufiges Vorgehen bei Teams, die mit Mobile-First arbeiten –, kann ZXing .NET.MAUI dieses Ziel nicht bedienen. Es gibt keinen Stub, keinen Fallback und keine Umgehungslösung.
iPhone 15 Pro Auto-Fokus Problem: Der GitHub-Issue-Tracker für Redth/ZXing.Net.Maui dokumentiert, dass iPhone 15 Pro und Pro Max Geräte (iPhone16,1 und iPhone16,2) bei der Barcode-Erkennung mit CameraBarcodeReaderView keinen zuverlässigen Fokus erzielen. Der Barcode ist im Kamerabild sichtbar, aber das Autofokussystem fokussiert nicht scharf genug, damit der Decoder ein Ergebnis extrahieren kann. Die einzige dokumentierte Abhilfemaßnahme besteht darin, den Benutzer anzuweisen, den Abstand zwischen Gerät und Barcode manuell anzupassen – eine Anweisung, die eine gut sichtbare Benutzerführung und Geduld des Benutzers erfordert und für einen primären Arbeitsablauf kein akzeptables Produktionsergebnis darstellt.
Kamera-Ressourcenleck: CameraBarcodeReaderView implementiert nicht IDisposable. Wenn der Benutzer eine Scanseite verlässt, werden die Kameraressourcen nicht nach einem Standard-Entsorgungsmuster freigegeben. Die dokumentierte Umgehungslösung besteht darin, IsDetecting = false in OnDisappearing() zu setzen, was die Auswirkungen reduziert, aber die Kamera nicht formell freigibt. Anwendungen, die häufig zwischen Scanseiten wechseln, verbrauchen vermehrt Ressourcen, was sich in Form von wachsendem Speicherbedarf, erhöhtem Batterieverbrauch und zeitweiligen Fehlern bei der Kamerainitialisierung beim Wechsel zurück zur Scanseite äußern kann.
Stiller Fehler bei der Formatspezifikation: ZXing .NET.MAUI erbt die Anforderung von ZXing.Net, jedes zu scannende Barcode-Format vor Beginn des Scans zu deklarieren. Formate, die in BarcodeReaderOptions.Formats weggelassen werden, werden stillschweigend ignoriert, auch wenn sie im Kamerabild deutlich sichtbar sind. Ein Benutzer, der das Gerät auf ein Barcode-Format richtet, das der Entwickler nicht vorgesehen hat, sieht keinen Fehler – die Anwendung erkennt einfach nichts. In Umgebungen, in denen Barcode-Formate von externen Lieferanten, Kunden oder Drittsystemen kontrolliert werden, wird dieses unbemerkte Versäumnis zu einem anhaltenden Supportproblem.
Stabilität vor 1.0: ZXing.Net.MAUI wird bei v0.7.4 veröffentlicht — eine stabile Version auf NuGet, aber immer noch vor 1.0 unter semantischer Versionierung. API-Änderungen in der Nebenversion bleiben vor 1.0 möglich, das Bugfixintervall hängt von der Verfügbarkeit der Community-Maintainer ab, und es gibt kein kommerzielles Support-SLA. Für Unternehmensanwendungen, die Auditierungen von Abhängigkeiten oder Softwarezusammensetzungsanalysen unterliegen, kann eine Community-Bibliothek vor 1.0 ohne kommerzielle Unterstützung den Genehmigungsprozess nicht bestehen.
Das grundsätzliche Problem
Das strukturelle Problem ist, dass CameraBarcodeReaderView den Entwickler in eine kamerazentrierte Ereignisschleife mit manuellem Lebenszyklusmanagement und einer festen Formatliste zwingt. Für alles, was über einfaches Kamerascanning auf iOS und Android mit bekannten Barcode-Formaten hinausgeht, erreicht die Architektur ihre Grenze:
// ZXing.Net.MAUI: event loop, format list, lifecycle boilerplate on every scan page
public partial class ScannerPage : ContentPage
{
public BarcodeReaderOptions ReaderOptions { get; }
public ScannerPage()
{
InitializeComponent();
ReaderOptions = new BarcodeReaderOptions
{
Formats = BarcodeFormats.QRCode |
BarcodeFormats.Code128 |
BarcodeFormats.Ean13 |
BarcodeFormats.UpcA,
TryHarder = true,
AutoRotate = true
};
BindingContext = this;
}
private void OnBarcodesDetected(object sender, BarcodeDetectionEventArgs e)
{
MainThread.BeginInvokeOnMainThread(() =>
{
foreach (var barcode in e.Results)
ResultLabel.Text = $"{barcode.Format}: {barcode.Value}";
});
CameraView.IsDetecting = false;
}
protected override void OnDisappearing()
{
base.OnDisappearing();
CameraView.IsDetecting = false; // Required — no Dispose() available
}
protected override void OnAppearing()
{
base.OnAppearing();
CameraView.IsDetecting = true;
}
}
// ZXing.Net.MAUI: event loop, format list, lifecycle boilerplate on every scan page
public partial class ScannerPage : ContentPage
{
public BarcodeReaderOptions ReaderOptions { get; }
public ScannerPage()
{
InitializeComponent();
ReaderOptions = new BarcodeReaderOptions
{
Formats = BarcodeFormats.QRCode |
BarcodeFormats.Code128 |
BarcodeFormats.Ean13 |
BarcodeFormats.UpcA,
TryHarder = true,
AutoRotate = true
};
BindingContext = this;
}
private void OnBarcodesDetected(object sender, BarcodeDetectionEventArgs e)
{
MainThread.BeginInvokeOnMainThread(() =>
{
foreach (var barcode in e.Results)
ResultLabel.Text = $"{barcode.Format}: {barcode.Value}";
});
CameraView.IsDetecting = false;
}
protected override void OnDisappearing()
{
base.OnDisappearing();
CameraView.IsDetecting = false; // Required — no Dispose() available
}
protected override void OnAppearing()
{
base.OnAppearing();
CameraView.IsDetecting = true;
}
}
Imports ZXing.Net.MAUI
Public Partial Class ScannerPage
Inherits ContentPage
Public ReadOnly Property ReaderOptions As BarcodeReaderOptions
Public Sub New()
InitializeComponent()
ReaderOptions = New BarcodeReaderOptions With {
.Formats = BarcodeFormats.QRCode Or
BarcodeFormats.Code128 Or
BarcodeFormats.Ean13 Or
BarcodeFormats.UpcA,
.TryHarder = True,
.AutoRotate = True
}
BindingContext = Me
End Sub
Private Sub OnBarcodesDetected(sender As Object, e As BarcodeDetectionEventArgs)
MainThread.BeginInvokeOnMainThread(Sub()
For Each barcode In e.Results
ResultLabel.Text = $"{barcode.Format}: {barcode.Value}"
Next
End Sub)
CameraView.IsDetecting = False
End Sub
Protected Overrides Sub OnDisappearing()
MyBase.OnDisappearing()
CameraView.IsDetecting = False ' Required — no Dispose() available
End Sub
Protected Overrides Sub OnAppearing()
MyBase.OnAppearing()
CameraView.IsDetecting = True
End Sub
End Class
IronBarcode ersetzt die Ereignisschleife durch einen einzigen asynchronen Aufruf beim Antippen einer Schaltfläche, entfernt die Formatkonfiguration vollständig und eliminiert die Lebenszyklusverwaltung von der Seite:
// NuGet: dotnet add package IronBarcode
// IronBarcode: stateless, all platforms, auto-detection, no lifecycle boilerplate
using IronBarCode;
public partial class ScannerPage : ContentPage
{
public ScannerPage() => InitializeComponent();
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());
ResultLabel.Text = results.FirstOrDefault()?.Value ?? "No barcode found";
}
//NeinOnAppearing / OnDisappearing needed
}
// NuGet: dotnet add package IronBarcode
// IronBarcode: stateless, all platforms, auto-detection, no lifecycle boilerplate
using IronBarCode;
public partial class ScannerPage : ContentPage
{
public ScannerPage() => InitializeComponent();
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());
ResultLabel.Text = results.FirstOrDefault()?.Value ?? "No barcode found";
}
//NeinOnAppearing / OnDisappearing needed
}
Imports IronBarCode
Public Partial Class ScannerPage
Inherits ContentPage
Public Sub New()
InitializeComponent()
End Sub
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())
ResultLabel.Text = If(results.FirstOrDefault()?.Value, "No barcode found")
End Using
End Using
End Sub
'NeinOnAppearing / OnDisappearing needed
End Class
IronBarcode vs. ZXing .NET.MAUI: Funktionsvergleich
| Feature | ZXing.Net.MAUI | IronBarcode |
|---|---|---|
| Veröffentlichungsstatus | Stabil, vor 1.0 (v0.7.4) | Stabile, kommerzielle Version |
| iOS MAUI | Ja (Fokus des iPhone 15 Pro defekt) | Ja |
| Android MAUI | Ja (Probleme mit der Kameraversion 1.5.0) | Ja |
| Windows MAUI | Nicht unterstützt | Ja |
| macOS MAUI | Nicht unterstützt | Ja |
| Serverseitig / ASP.NET Core | Nein | Ja |
| Live-Kamera-Sucher | Ja | Nein (MediaPicker-Systembenutzeroberfläche) |
| Formatvorgabe erforderlich | Ja | Nein (automatische Erkennung, über 50 Formate) |
| Kamera-Lebenszyklusmanagement | Manuell (IsDetecting) | Nicht zutreffend |
| Dispose()-Implementierung | Nein | Nicht zutreffend – staatenlos |
| iPhone 15 Pro Autofokus | Defekt (dokumentiert) | Nicht zutreffend |
| PDF-Barcode-Extraktion | Nein | Ja |
| Dateipfad-Eingabe | Nein (nur Kamera) | Ja |
| Wiederherstellung beschädigter Barcodes | Nur für TryHarder | Ja (ML-gestützt) |
| Barcode-Generierung | Ja (über ZXing .NET) | Ja |
| Kommerzielle Unterstützung | None | Ja |
| Lizenz | MIT (kostenlos) | Kommerziell |
Schnellstart
Schritt 1: Entfernen Sie ZXing .NET.Maui.Controls und bereinigen Sie MauiProgram.cs
Entfernen Sie das ZXing .NET.MAUI NuGet -Paket:
dotnet remove package ZXing.Net.Maui.Controls
dotnet remove package ZXing.Net.Maui.Controls
ZXing.Net.MAUI erfordert einen einmaligen Registrierungsaufruf in MauiProgram.cs. Entfernen Sie diese Zeile, falls sie vorhanden ist:
// Entfernen this line from MauiProgram.cs
builder.UseBarcodeReader();
// Entfernen this line from MauiProgram.cs
builder.UseBarcodeReader();
Der using ZXing.Net.Maui;-Import, der diesen Aufruf unterstützt, kann auch aus MauiProgram.cs entfernt werden.
Schritt 2: IronBarcode installieren
dotnet add package IronBarcode
dotnet add package IronBarcode
Das .NET MAUI Barcode-Scanner-Tutorial deckt die vollständige Projektkonfiguration ab, einschließlich Info.plist-Kameraberechtigungseinträgen für iOS und AndroidManifest.xml-Berechtigungserklärungen für Android.
Schritt 3: Namensräume aktualisieren und Lizenz initialisieren
Entfernen Sie die ZXing .NET.MAUI Namespace-Importe aus allen Dateien:
// Entfernen these from every .cs file that imported them
using ZXing.Net.Maui;
using ZXing.Net.Maui.Controls;
// Entfernen these from every .cs file that imported them
using ZXing.Net.Maui;
using ZXing.Net.Maui.Controls;
Imports ZXing.Net.Maui
Imports ZXing.Net.Maui.Controls
Fügen Sie den IronBarcode-Namespace hinzu und initialisieren Sie den Lizenzschlüssel beim Anwendungsstart. Der geeignete Ort ist MauiProgram.cs oder App.xaml.cs, bevor Barcode-Operationen durchgeführt werden:
using IronBarCode;
// In MauiProgram.cs CreateMauiApp() or App.xaml.cs constructor
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
using IronBarCode;
// In MauiProgram.cs CreateMauiApp() or App.xaml.cs constructor
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
' In MauiProgram.vb CreateMauiApp() or App.xaml.vb constructor
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Beispiele für die Code-Migration
Ersetzen der XAML-Kamerasteuerung und des zugehörigen Code-Behind
Die CameraBarcodeReaderView-XAML-Steuerung und ihr unterstützender Code-Behind sind das primäre Migrationstarget. Die Neuerung entfernt die Kameraansicht aus dem Seitenlayout und ersetzt das ereignisgesteuerte Scanmuster durch eine per Knopfdruck ausgelöste asynchrone Aufnahme.
ZXing .NET.MAUI Ansatz:
XAML:
<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
<StackLayout>
<zxing:CameraBarcodeReaderView
x:Name="CameraView"
Options="{Binding ReaderOptions}"
BarcodesDetected="OnBarcodesDetected"
VerticalOptions="FillAndExpand" />
<Label x:Name="ResultLabel" Text="Scanning..." />
</StackLayout>
</ContentPage>
<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
<StackLayout>
<zxing:CameraBarcodeReaderView
x:Name="CameraView"
Options="{Binding ReaderOptions}"
BarcodesDetected="OnBarcodesDetected"
VerticalOptions="FillAndExpand" />
<Label x:Name="ResultLabel" Text="Scanning..." />
</StackLayout>
</ContentPage>
Code-Behind:
using ZXing.Net.Maui;
using ZXing.Net.Maui.Controls;
public partial class ScannerPage : ContentPage
{
public BarcodeReaderOptions ReaderOptions { get; }
public ScannerPage()
{
InitializeComponent();
ReaderOptions = new BarcodeReaderOptions
{
Formats = BarcodeFormats.QRCode | BarcodeFormats.Code128 | BarcodeFormats.Ean13,
TryHarder = true,
AutoRotate = true
};
BindingContext = this;
}
private void OnBarcodesDetected(object sender, BarcodeDetectionEventArgs e)
{
MainThread.BeginInvokeOnMainThread(() =>
{
foreach (var barcode in e.Results)
ResultLabel.Text = $"{barcode.Format}: {barcode.Value}";
});
CameraView.IsDetecting = false;
}
protected override void OnDisappearing()
{
base.OnDisappearing();
CameraView.IsDetecting = false;
}
protected override void OnAppearing()
{
base.OnAppearing();
CameraView.IsDetecting = true;
}
}
using ZXing.Net.Maui;
using ZXing.Net.Maui.Controls;
public partial class ScannerPage : ContentPage
{
public BarcodeReaderOptions ReaderOptions { get; }
public ScannerPage()
{
InitializeComponent();
ReaderOptions = new BarcodeReaderOptions
{
Formats = BarcodeFormats.QRCode | BarcodeFormats.Code128 | BarcodeFormats.Ean13,
TryHarder = true,
AutoRotate = true
};
BindingContext = this;
}
private void OnBarcodesDetected(object sender, BarcodeDetectionEventArgs e)
{
MainThread.BeginInvokeOnMainThread(() =>
{
foreach (var barcode in e.Results)
ResultLabel.Text = $"{barcode.Format}: {barcode.Value}";
});
CameraView.IsDetecting = false;
}
protected override void OnDisappearing()
{
base.OnDisappearing();
CameraView.IsDetecting = false;
}
protected override void OnAppearing()
{
base.OnAppearing();
CameraView.IsDetecting = true;
}
}
Imports ZXing.Net.Maui
Imports ZXing.Net.Maui.Controls
Public Partial Class ScannerPage
Inherits ContentPage
Public ReadOnly Property ReaderOptions As BarcodeReaderOptions
Public Sub New()
InitializeComponent()
ReaderOptions = New BarcodeReaderOptions With {
.Formats = BarcodeFormats.QRCode Or BarcodeFormats.Code128 Or BarcodeFormats.Ean13,
.TryHarder = True,
.AutoRotate = True
}
BindingContext = Me
End Sub
Private Sub OnBarcodesDetected(sender As Object, e As BarcodeDetectionEventArgs)
MainThread.BeginInvokeOnMainThread(Sub()
For Each barcode In e.Results
ResultLabel.Text = $"{barcode.Format}: {barcode.Value}"
Next
End Sub)
CameraView.IsDetecting = False
End Sub
Protected Overrides Sub OnDisappearing()
MyBase.OnDisappearing()
CameraView.IsDetecting = False
End Sub
Protected Overrides Sub OnAppearing()
MyBase.OnAppearing()
CameraView.IsDetecting = True
End Sub
End Class
IronBarcode -Ansatz:
XAML:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui">
<StackLayout>
<Button Text="Scan Barcode" Clicked="ScanButton_Clicked" />
<Label x:Name="ResultLabel" Text="Tap to scan..." />
</StackLayout>
</ContentPage>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui">
<StackLayout>
<Button Text="Scan Barcode" Clicked="ScanButton_Clicked" />
<Label x:Name="ResultLabel" Text="Tap to scan..." />
</StackLayout>
</ContentPage>
Code-Behind:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public partial class ScannerPage : ContentPage
{
public ScannerPage() => InitializeComponent();
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());
var first = results.FirstOrDefault();
ResultLabel.Text = first != null
? $"{first.Format}: {first.Value}"
: "No barcode found";
}
//NeinOnAppearing or OnDisappearing required — no camera state exists between scans
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public partial class ScannerPage : ContentPage
{
public ScannerPage() => InitializeComponent();
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());
var first = results.FirstOrDefault();
ResultLabel.Text = first != null
? $"{first.Format}: {first.Value}"
: "No barcode found";
}
//NeinOnAppearing or OnDisappearing required — no camera state exists between scans
}
Imports IronBarCode
Public Partial Class ScannerPage
Inherits ContentPage
Public Sub New()
InitializeComponent()
End Sub
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 = New MemoryStream()
Await stream.CopyToAsync(ms)
Dim results = BarcodeReader.Read(ms.ToArray())
Dim first = results.FirstOrDefault()
ResultLabel.Text = If(first IsNot Nothing, $"{first.Format}: {first.Value}", "No barcode found")
End Using
End Using
End Sub
'NeinOnAppearing or OnDisappearing required — no camera state exists between scans
End Class
Der zxing:-XAML-Namespace, die BarcodeReaderOptions-Formatliste, der MainThread.BeginInvokeOnMainThread()-Wrapper und beide Lebenszyklus-Overrides werden vollständig eliminiert. Die Fortsetzung der async-Methode läuft im aufrufenden Kontext - was für einen UI-Event-Handler der Hauptthread ist - sodass keine explizite Thread-Verwaltung erforderlich ist.
Entfernen der Formatspezifikation
Alle BarcodeReaderOptions-Konfigurationsblöcke, die über mehrere Seiten oder Scan-Szenarien im Code verteilt sind, werden gelöscht. IronBarcode führt eine automatische Formaterkennung für alle über 50 unterstützten Formate ohne Vorkonfiguration durch.
ZXing .NET.MAUI Ansatz:
// ZXing.Net.MAUI: every anticipated format must be listed explicitly
// Formats not listed here will silently fail to detect
var readerOptions = new BarcodeReaderOptions
{
Formats = BarcodeFormats.QRCode |
BarcodeFormats.DataMatrix |
BarcodeFormats.Aztec |
BarcodeFormats.Pdf417 |
BarcodeFormats.Code128 |
BarcodeFormats.Code39 |
BarcodeFormats.Ean13 |
BarcodeFormats.UpcA |
BarcodeFormats.Codabar,
TryHarder = true
};
// ZXing.Net.MAUI: every anticipated format must be listed explicitly
// Formats not listed here will silently fail to detect
var readerOptions = new BarcodeReaderOptions
{
Formats = BarcodeFormats.QRCode |
BarcodeFormats.DataMatrix |
BarcodeFormats.Aztec |
BarcodeFormats.Pdf417 |
BarcodeFormats.Code128 |
BarcodeFormats.Code39 |
BarcodeFormats.Ean13 |
BarcodeFormats.UpcA |
BarcodeFormats.Codabar,
TryHarder = true
};
' ZXing.Net.MAUI: every anticipated format must be listed explicitly
' Formats not listed here will silently fail to detect
Dim readerOptions As New BarcodeReaderOptions With {
.Formats = BarcodeFormats.QRCode Or
BarcodeFormats.DataMatrix Or
BarcodeFormats.Aztec Or
BarcodeFormats.Pdf417 Or
BarcodeFormats.Code128 Or
BarcodeFormats.Code39 Or
BarcodeFormats.Ean13 Or
BarcodeFormats.UpcA Or
BarcodeFormats.Codabar,
.TryHarder = True
}
IronBarcode -Ansatz:
// IronBarcode: no format configuration needed
// All formats are detected automatically on every read call
var results = BarcodeReader.Read(imageBytes);
// Optional: restrict to specific formats for performance tuning (not required for correctness)
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};
var tunedResults = BarcodeReader.Read(imageBytes, options);
// IronBarcode: no format configuration needed
// All formats are detected automatically on every read call
var results = BarcodeReader.Read(imageBytes);
// Optional: restrict to specific formats for performance tuning (not required for correctness)
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};
var tunedResults = BarcodeReader.Read(imageBytes, options);
Imports IronBarcode
' IronBarcode: no format configuration needed
' All formats are detected automatically on every read call
Dim results = BarcodeReader.Read(imageBytes)
' Optional: restrict to specific formats for performance tuning (not required for correctness)
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128
}
Dim tunedResults = BarcodeReader.Read(imageBytes, options)
In IronBarcode stehen Formatierungshinweise für leistungssensible Szenarien zur Verfügung, diese sind jedoch optional. Ein Barcode in einem Format, das nicht in einem Optionsobjekt aufgeführt ist, wird dennoch erkannt und zurückgegeben.
Entfernen der IsDetecting-Lebenszyklusverwaltung
Jede OnAppearing und OnDisappearing-Override, die existiert, um CameraView.IsDetecting zu toggeln, wird entfernt. Wenn diese Method-Overrides andere Logik für den Seitenlebenszyklus enthalten, bewahren Sie diese Logik und entfernen Sie nur die IsDetecting-Zeilen.
ZXing .NET.MAUI Ansatz:
// Required boilerplate on every page — omitting this causes camera resource leaks
protected override void OnDisappearing()
{
base.OnDisappearing();
if (CameraView != null)
CameraView.IsDetecting = false;
}
protected override void OnAppearing()
{
base.OnAppearing();
if (CameraView != null)
CameraView.IsDetecting = true;
}
// Required boilerplate on every page — omitting this causes camera resource leaks
protected override void OnDisappearing()
{
base.OnDisappearing();
if (CameraView != null)
CameraView.IsDetecting = false;
}
protected override void OnAppearing()
{
base.OnAppearing();
if (CameraView != null)
CameraView.IsDetecting = true;
}
' Required boilerplate on every page — omitting this causes camera resource leaks
Protected Overrides Sub OnDisappearing()
MyBase.OnDisappearing()
If CameraView IsNot Nothing Then
CameraView.IsDetecting = False
End If
End Sub
Protected Overrides Sub OnAppearing()
MyBase.OnAppearing()
If CameraView IsNot Nothing Then
CameraView.IsDetecting = True
End If
End Sub
IronBarcode -Ansatz:
// Delete both methods if they contain only IsDetecting management.
// If they contain other logic, remove only the IsDetecting lines and keep the rest.
// IronBarcode is stateless — there is no camera view running between button taps.
// Delete both methods if they contain only IsDetecting management.
// If they contain other logic, remove only the IsDetecting lines and keep the rest.
// IronBarcode is stateless — there is no camera view running between button taps.
' Delete both methods if they contain only IsDetecting management.
' If they contain other logic, remove only the IsDetecting lines and keep the rest.
' IronBarcode is stateless — there is no camera view running between button taps.
Windows MAUI: Derselbe Code, keine bedingte Kompilierung
Bei ZXing .NET.MAUI schlug das Hinzufügen eines Windows-Ziels zu einem Projekt entweder beim Kompilieren fehl oder es waren plattformspezifische Stubs erforderlich, da die Windows-Implementierung nie geschrieben wurde. Mit IronBarcode lässt sich derselbe Code, der auf iOS und Android läuft, ohne Änderungen auch unter Windows kompilieren und ausführen.
ZXing .NET.MAUI Ansatz:
// Windows MAUI: either fails to compile or requires a platform-specific stub
// There is no documented path to Windows support
#if ANDROID || IOS
// ZXing.Net.MAUI scanning — Windows has no implementation
#endif
// Windows MAUI: either fails to compile or requires a platform-specific stub
// There is no documented path to Windows support
#if ANDROID || IOS
// ZXing.Net.MAUI scanning — Windows has no implementation
#endif
IronBarcode -Ansatz:
// NuGet: dotnet add package IronBarcode
//Neinplatform conditionals — same code runs on iOS, Android, Windows, and macOS
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());
ResultLabel.Text = results.FirstOrDefault()?.Value ?? "No barcode found";
}
// NuGet: dotnet add package IronBarcode
//Neinplatform conditionals — same code runs on iOS, Android, Windows, and macOS
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());
ResultLabel.Text = results.FirstOrDefault()?.Value ?? "No barcode found";
}
' NuGet: dotnet add package IronBarcode
' Neinplatform conditionals — same code runs on iOS, Android, Windows, and macOS
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())
ResultLabel.Text = If(results.FirstOrDefault()?.Value, "No barcode found")
End Using
End Using
End Sub
Unter Windows wird MediaPicker.CapturePhotoAsync() auf den Windows-Dateiauswähler abgebildet, was es dem Benutzer ermöglicht, eine Bilddatei auszuwählen - ein angemessenes Verhalten für eine Desktop-Umgebung. Der MAUI Desktop-Barcode-Leitfaden behandelt die MAUI-Konfiguration unter Windows und macOS im Detail.
PDF-Barcode-Lesen (Neue Funktion)
ZXing .NET.MAUI verfügt über keine API zum Lesen von Barcodes aus PDF-Dokumenten. Falls es sich um eine neue Anforderung handelt, die durch die Migration ermöglicht wird, gilt folgendes Muster:
ZXing .NET.MAUI Ansatz:
// ZXing.Net.MAUI: no API for PDF or file-based barcode reading
// Cannot fulfill this requirement — a separate library is required
// ZXing.Net.MAUI: no API for PDF or file-based barcode reading
// Cannot fulfill this requirement — a separate library is required
' ZXing.Net.MAUI: no API for PDF or file-based barcode reading
' Cannot fulfill this requirement — a separate library is required
IronBarcode -Ansatz:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Read all barcodes from all pages of a PDF
var pdfResults = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in pdfResults)
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");
// Read from a user-selected file using MAUI FilePicker
private async void ReadFileButton_Clicked(object sender, EventArgs e)
{
var file = await FilePicker.PickAsync(new PickOptions
{
PickerTitle = "Select image or PDF"
});
if (file == null) return;
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 all barcodes from all pages of a PDF
var pdfResults = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in pdfResults)
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");
// Read from a user-selected file using MAUI FilePicker
private async void ReadFileButton_Clicked(object sender, EventArgs e)
{
var file = await FilePicker.PickAsync(new PickOptions
{
PickerTitle = "Select image or PDF"
});
if (file == null) return;
var fileResults = BarcodeReader.Read(file.FullPath);
foreach (var result in fileResults)
ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
Imports IronBarCode
' Read all barcodes from all pages of a PDF
Dim pdfResults = BarcodeReader.Read("invoice.pdf")
For Each barcode In pdfResults
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}")
Next
' Read from a user-selected file using MAUI FilePicker
Private Async Sub ReadFileButton_Clicked(sender As Object, e As EventArgs)
Dim file = Await FilePicker.PickAsync(New PickOptions With {
.PickerTitle = "Select image or PDF"
})
If file Is Nothing Then Return
Dim fileResults = BarcodeReader.Read(file.FullPath)
For Each result In fileResults
ResultLabel.Text &= $"\n{result.Format}: {result.Value}"
Next
End Sub
Der vollständige Workflow zum Lesen von PDF-Barcodes – einschließlich mehrseitiger Dokumente, Metadaten zu Seitenzahlen und Dokumenten in gemischten Formaten – ist im Leitfaden "Barcodes aus PDFs lesen" dokumentiert.
ZXing .NET.MAUI API zu IronBarcode Mapping-Referenz
| ZXing.Net.MAUI | IronBarcode | Notizen |
|---|---|---|
builder.UseBarcodeReader() |
Nicht erforderlich | Entfernen von MauiProgram.cs |
using ZXing.Net.Maui; |
using IronBarCode; |
Namespace-Ersetzung |
using ZXing.Net.Maui.Controls; |
Nicht erforderlich | Entfernen |
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;..." |
Nicht erforderlich | Aus XAML entfernen |
<zxing:CameraBarcodeReaderView> |
<Button> + MediaPicker.CapturePhotoAsync() |
Architektonischer Ersatz |
Options="{Binding ReaderOptions}" |
Nicht erforderlich | Bindung entfernen |
BarcodesDetected="OnBarcodesDetected" |
BarcodeReader.Read()-Rückgabewert |
Ereignis → asynchrone Rückgabe |
new BarcodeReaderOptions { Formats = BarcodeFormats.X \| ... } |
Nicht erforderlich | Die automatische Erkennung ersetzt Formatlisten. |
BarcodeDetectionEventArgs e |
IEnumerable<BarcodeResult> |
Unterschiedliche Ergebnislieferung |
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 |
BarcodeFormats.UpcA |
BarcodeEncoding.UPCA |
Enum umbenennen |
CameraView.IsDetecting = false |
Nicht erforderlich | Entfernen von OnDisappearing |
CameraView.IsDetecting = true |
Nicht erforderlich | Entfernen von OnAppearing |
| API ohne Dateieingabe | BarcodeReader.Read("path/to/image.png") |
Neue Fähigkeit |
| Keine PDF-Eingabe-API | BarcodeReader.Read("document.pdf") |
Neue Fähigkeit |
| Nur für iOS und Android | iOS, Android, Windows, macOS, Server | Plattformerweiterung |
Gängige Migrationsprobleme und Lösungen
Problem 1: Kein gleichwertiger Live-Sucher
ZXing.Net.MAUI: Das CameraBarcodeReaderView zeigt einen kontinuierlichen Kamerastream im Seitenlayout an und bietet dem Benutzer eine Live-Vorschau mit überlagertem Scan-Feedback.
Lösung: IronBarcode bietet keine Live-Suchersteuerung. Das Ersatzmuster verwendet MediaPicker.CapturePhotoAsync(), das die Systemkamera-Benutzeroberfläche der Plattform öffnet. Die Systemkamera verfügt über eine eigene Live-Vorschau und eine Fokusanzeige. Nachdem der Benutzer das Bild aufgenommen und bestätigt hat, wird das Ergebnis an BarcodeReader.Read() übergeben. Wenn ein persistenter In-App-Sucher ein benötigtes UX-Element ist, das nicht durch die Systemkamera-Benutzeroberfläche ersetzt werden kann, muss die Kameraintegrationsebene separat mithilfe von Microsoft.Maui.Media oder Plattformkamera-APIs erstellt werden, wobei IronBarcode den Dekodierschritt übernimmt.
Problem 2: Erklärungen zur Kameraberechtigung
ZXing .NET.MAUI: Die Kameraberechtigungen wurden möglicherweise im Rahmen der ZXing .NET.MAUI-Einrichtungsanweisungen im Projekt deklariert.
Lösung: Kameraberechtigungen bleiben erforderlich für den MediaPicker.CapturePhotoAsync()-Aufruf, den das IronBarcode-MAUI-Muster verwendet. Überprüfen Sie, ob NSCameraUsageDescription in Info.plist für iOS und ob <uses-permission android:name="android.permission.CAMERA" /> in AndroidManifest.xml für Android vorhanden ist. IronBarcode greift nicht direkt auf die Kamera zu – es verarbeitet Bilder –, aber der MediaPicker-Aufruf, der ihm Bilder bereitstellt, erfordert Kameraberechtigung. Die Einrichtung der Berechtigungen wird im .NET MAUI Barcode-Scanner-Tutorial behandelt.
Problem 3: Windows-Build nun erfolgreich, wo er zuvor fehlgeschlagen ist
ZXing .NET.MAUI: Projekte, die versuchten, ein Windows-Ziel mit ZXing .NET.MAUI einzubinden, stießen typischerweise auf Kompilierungsfehler oder erforderten, dass die Bibliothek durch bedingte MSBuild-Logik vom Windows-Build ausgeschlossen wurde.
Lösung: Nach dem Entfernen von ZXing .NET.MAUI und der Installation von IronBarcode gelingt der Windows MAUI-Build ohne jegliche Plattformbedingungen. Entfernen Sie alle #if ANDROID || IOS-Schutzmechanismen, die um ZXing .NET.MAUI-Aufrufe platziert wurden, um diese vom Windows-Build auszuschließen. DerBarcodeReader.Read()-Aufruf von IronBarcode kompiliert und läuft auf allen Ziel-Frameworks. WennMediaPicker.CapturePhotoAsync()` von Windows-Builds ausgeschlossen wurde, kann dieser Ausschluss ebenfalls entfernt werden – die Methode wird auf Windows MAUIunterstützt und auf den Dateiauswähler abgebildet. Überprüfen Sie, ob die Gesamtlösung nach dem Entfernen der Bedingungen für alle Zielframeworks fehlerfrei erstellt werden kann.
Ausgabe 4: Referenzen zum BarcodeFormats-Enum
ZXing.Net.MAUI: Das BarcodeFormats-Enum von ZXing.Net.Maui wird umfangreich in BarcodeReaderOptions-Konfigurationen verwendet. Nach dem Entfernen des Pakets führen alle verbleibenden Verweise zu Kompilierungsfehlern.
Lösung: Löschen Sie alle BarcodeReaderOptions-Initialisierungsblöcke, die verwendet wurden, um Formlisten zu konfigurieren. IronBarcode benötigt für den korrekten Betrieb keine Formatvorgabe. Wenn verbleibender Code BarcodeFormats-Werte für Protokollierungs-, Anzeige- oder Vergleichszwecke referenziert, ersetzen Sie sie durch BarcodeEncoding-Werte aus dem IronBarCode-Namespace. Führen Sie grep -rn "BarcodeFormats\." --include="*.cs" . aus, um nach allen verbleibenden Referenzen nach der Paketentfernung zu suchen.
ZXing .NET.MAUI Migrations-Checkliste
Vor der Migration anfallende Aufgaben
Prüfen Sie vor der Änderung alle Verwendungen von ZXing .NET.MAUI im Quellcode:
grep -rn "ZXing.Net.Maui" --include="*.cs" --include="*.xaml" .
grep -rn "CameraBarcodeReaderView" --include="*.cs" --include="*.xaml" .
grep -rn "BarcodeDetectionEventArgs" --include="*.cs" .
grep -rn "BarcodeReaderOptions" --include="*.cs" .
grep -rn "BarcodeFormats\." --include="*.cs" .
grep -rn "IsDetecting" --include="*.cs" .
grep -rn "UseBarcodeReader" --include="*.cs" .
grep -rn "zxing:" --include="*.xaml" .
grep -rn "e\.Results" --include="*.cs" .
grep -rn "ZXing.Net.Maui" --include="*.cs" --include="*.xaml" .
grep -rn "CameraBarcodeReaderView" --include="*.cs" --include="*.xaml" .
grep -rn "BarcodeDetectionEventArgs" --include="*.cs" .
grep -rn "BarcodeReaderOptions" --include="*.cs" .
grep -rn "BarcodeFormats\." --include="*.cs" .
grep -rn "IsDetecting" --include="*.cs" .
grep -rn "UseBarcodeReader" --include="*.cs" .
grep -rn "zxing:" --include="*.xaml" .
grep -rn "e\.Results" --include="*.cs" .
Alle im Rahmen des Audits identifizierten Scanseiten dokumentieren. Beachten Sie, welche OnAppearing und OnDisappearing-Overrides nur IsDetecting-Management (um gelöscht zu werden) enthalten im Gegensatz zu denen, die andere Logik enthalten (die teilweise geändert werden soll). Beachten Sie, dass alle BarcodeReaderOptions-Instanzen Formatlisten enthalten können, die in anderen als den Erkennungskonfigurationen verwendet werden.
Aufgaben der Code-Aktualisierung
- Entfernen Sie das
ZXing.Net.Maui.Controls-NuGet-Paket aus der Projektdatei - Entfernen Sie
builder.UseBarcodeReader()ausMauiProgram.cs - Entfernen Sie die
using ZXing.Net.Maui;undusing ZXing.Net.Maui.Controls;-Namespace-Imports aus allen Dateien - Installieren Sie das
IronBarcode-NuGet-Paket - Fügen Sie
using IronBarCode;zu allen Dateien hinzu, die Barcode-Lesefunktionen nutzen - Fügen Sie
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";beim Anwendungsstart hinzu - Entfernen Sie die
xmlns:zxing-Namespace-Deklaration aus allen XAML-Dateien - Entfernen Sie alle
<zxing:CameraBarcodeReaderView>-Elemente aus XAML-Dateien - Ersetzen Sie die entfernte Kameraansicht durch ein
<Button>-Steuerelement in jeder XAML-Datei - Fügen Sie
Clicked="ScanButton_Clicked"zu jedem Scan-Button hinzu - Löschen Sie die
OnBarcodesDetected-Ereignis-Handler-Methoden aus allen Code-Behind-Dateien - Fügen Sie
async void ScanButton_Clicked-Methoden hinzu, dieMediaPicker.CapturePhotoAsync()+BarcodeReader.Read()auf jeder Seite implementieren - Löschen Sie alle
BarcodeReaderOptions-Initialisierungsblöcke - Löschen Sie alle
OnDisappearingundOnAppearing-Overrides, die ausschließlich fürIsDetecting-Management existieren - Entfernen Sie
IsDetecting-Zeilen aus allenOnDisappearing- undOnAppearing-Overrides, die andere Logik enthalten - Entfernen Sie alle
#if ANDROID-Einträge. || IOS-bedingte Kompilierungsschutzmechanismen, die ZXing .NET.MAUI von Windows-Builds isolierten - Ersetzen Sie verbleibende
BarcodeFormats.X-Enum-Referenzen durchBarcodeEncoding.X-Äquivalente
Post-Migrationstests
Nachdem die Migration fehlerfrei kompiliert wurde, überprüfen Sie Folgendes:
- Android MAUI: Die Scan-Schaltfläche öffnet die Systemkamera, nimmt ein Foto auf und liefert ein korrektes Barcode-Ergebnis – überprüfen Sie dies in der Android-Scananleitung.
- iOS MAUI: Der gleiche Ablauf funktioniert auch unter iOS, einschließlich des iPhone 15 Pro, wo zuvor das Problem mit dem Autofokus auftrat.
- Windows MAUI: Der Windows-Build kompiliert fehlerfrei, und die Scan-Schaltfläche öffnet die Dateiauswahl und liefert ein korrektes Ergebnis für ein ausgewähltes Bild.
- Formate: Testen Sie das Scannen von Barcodes in Formaten, die nicht in der alten
BarcodeFormats-Liste enthalten waren, um die automatisierte Erkennung zu bestätigen - Seitennavigation: Navigieren Sie mehrmals zur Scanseite und wieder zurück und überprüfen Sie, ob kein Speicherzuwachs oder Fehler bei der Kamerainitialisierung auftreten.
- PDF-Lesen: Falls die Migration das Lesen von PDF-Barcodes als neue Funktion hinzufügt, überprüfen Sie, ob mehrseitige PDFs Ergebnisse mit korrekten Seitenzahlen-Metadaten liefern.
Wichtigste Vorteile der Migration zu IronBarcode
Erweiterte Plattformabdeckung: Nach der Migration unterstützt die Anwendung neben iOS und Android auch Windows und macOS MAUI-Ziele – alles aus dem gleichen Paket und mit dem gleichen Scanmuster. Projekte, die zuvor plattformspezifische Stubs benötigten oder Windows von der Barcode-Funktionalität ausschlossen, erhalten nun ohne zusätzlichen Code eine vollständige Abdeckung.
Zuverlässigkeit aktueller Hardwaregenerationen: Der Bildaufnahmeansatz über MediaPicker und BarcodeReader.Read() wird nicht durch das CameraBarcodeReaderView-Autofokusmodell beeinflusst, das auf iPhone 15 Pro und Pro Max Hardware fehlschlägt. Die Systemkamera übernimmt die Fokussierung unabhängig, und IronBarcode verarbeitet das aufgenommene Bild, nachdem der Benutzer die Aufnahme bestätigt hat.
Eliminierung des Kameraressourcen-Managements: Durch das Entfernen von CameraBarcodeReaderView wird die gesamte Kategorie von Kameraressourcenleck-Bugs entfernt. Es gibt keinen IsDetecting-Zustand zu verfolgen, keine OnAppearing und OnDisappearing Boilerplate auf jeder Scanseite zu pflegen und keine Anhäufung von Kameraressourcen über Navigationszyklen hinweg. Die zustandslose API sorgt dafür, dass Scan-Seiten hinsichtlich des Ressourcenlebenszyklus nicht von anderen Seiten zu unterscheiden sind.
Formatabdeckung ohne Konfiguration: Jedes im Feld vorkommende Barcode-Format wird automatisch erkannt. Scanfehler, die durch fehlende Einträge in einer BarcodeFormats-Liste verursacht wurden, werden beseitigt. Supportanfragen von Nutzern, deren Barcodes stillschweigend ignoriert wurden, weil ein Lieferant sein Etikettenformat geändert hat, hören auf.
Datei- und Dokumentenverarbeitung: Die Migration ermöglicht das Lesen von Barcodes aus PDF-Dokumenten, Bilddateien und Byte-Streams ohne zusätzliche Bibliothek. Arbeitsabläufe, die zuvor außerhalb des Bereichs von ZXing.Net.MAUI lagen – das Lesen von Barcodes von hochgeladenen Rechnungen, die Verarbeitung digitaler Tickets, das Batch-Scannen von Bildverzeichnissen – werden durch denselben BarcodeReader.Read()-Aufruf zugänglich, der für Kameraaufnahmen verwendet wird.
Stabilität auf Produktionsniveau: IronBarcode wird als stabile kommerzielle Version mit aktivem Entwicklungszyklus, kommerziellem Support und regelmäßigen Updates ausgeliefert, die mit den .NET Versionsveröffentlichungen Schritt halten. Bei Abhängigkeitsprüfungen, Software-Kompositionsanalysen und Enterprise Genehmigungsprozessen wird auf eine unterstützte Bibliothek mit dokumentierter Wartungsverpflichtung und nicht auf ein Community-Vorabversionspaket zugegriffen.
Häufig gestellte Fragen
Warum sollte ich von ZXing.Net.MAUI zu IronBarcode migrieren?
Zu den häufigsten Gründen gehören die Vereinfachung der Lizenzierung (Beseitigung der Komplexität von SDK und Laufzeitschlüsseln), die Beseitigung von Durchsatzbeschränkungen, die Verbesserung der nativen PDF-Unterstützung, die Verbesserung der Docker/CI/CD-Bereitstellung und die Verringerung von API-Boilerplate im Produktionscode.
Wie kann ich ZXing.Net.MAUI API-Aufrufe durch IronBarcode ersetzen?
Ersetzen Sie Instanzerstellung und Lizenzierung durch IronBarCode.License.LicenseKey = "key". Ersetzen Sie die Leseaufrufe durch BarcodeReader.Read(path) und die Schreibaufrufe durch BarcodeWriter.CreateBarcode(data, encoding). Statische Methoden erfordern keine Instanzverwaltung.
Wie viel Code ändert sich bei der Migration von ZXing.Net.MAUI zu IronBarcode?
Die meisten Migrationen führen zu weniger Codezeilen. Lizenzierungs-Boilerplate, Instanzkonstruktoren und explizite Formatkonfiguration werden entfernt. Zentrale Lese-/Schreibvorgänge werden auf kürzere IronBarcode-Äquivalente mit saubereren Ergebnisobjekten abgebildet.
Muss ich während der Migration sowohl ZXing.Net.MAUI als auch IronBarcode installiert lassen?
Nein. Die meisten Migrationen sind direkte Ersetzungen und keine Paralleloperationen. Migrieren Sie eine Serviceklasse nach der anderen, ersetzen Sie die NuGet-Referenz und aktualisieren Sie die Instanzierungs- und API-Aufrufmuster, bevor Sie zur nächsten Klasse übergehen.
Wie lautet der NuGet-Paketname für IronBarcode?
Das Paket ist 'IronBarCode' (mit großem B und C). Installieren Sie es mit 'Install-Package IronBarCode' oder 'dotnet add package IronBarCode'. Die using-Anweisung im Code lautet 'using IronBarCode;'.
Wie vereinfacht IronBarcode die Docker-Bereitstellung im Vergleich zu ZXing.Net.MAUI?
IronBarcode ist ein NuGet-Paket, für das keine externen SDK-Dateien oder Lizenzkonfigurationen erforderlich sind. In Docker setzen Sie die Umgebungsvariable IRONBARCODE_LICENSE_KEY und das Paket übernimmt die Lizenzvalidierung beim Start.
Erkennt IronBarcode for .NET nach der Migration von ZXing.Net.MAUI automatisch alle Barcodeformate?
Ja, IronBarcode erkennt automatisch die Symbologie aller unterstützten Formate. Eine explizite Aufzählung von BarcodeTypes ist nicht erforderlich. Wenn das Format bereits bekannt ist und die Leistung eine Rolle spielt, ermöglicht BarcodeReaderOptions die Einschränkung des Suchraums als eine Optimierung.
Kann IronBarcode Barcodes aus PDFs ohne eine separate Bibliothek lesen?
Ja, BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien nativ. Die Ergebnisse enthalten PageNumber, Format, Value und Confidence für jeden gefundenen Barcode. Es ist kein externer PDF-Rendering-Schritt erforderlich.
Wie handhabt IronBarcode die parallele Verarbeitung von Barcodes?
Die statischen Methoden von IronBarcode sind zustandslos und thread-sicher. Verwenden Sie Parallel.ForEach direkt über Dateilisten ohne Instanzmanagement pro Thread. BarcodeReaderOptions.MaxParallelThreads steuert das interne Thread-Budget.
Welche Ergebniseigenschaften ändern sich bei der Migration von ZXing.Net.MAUI zu IronBarcode?
Übliche Umbenennungen: BarcodeValue wird zu Value, BarcodeType wird zu Format. IronBarcode-Ergebnisse fügen auch Confidence und PageNumber hinzu. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt die Umbenennungen im bestehenden Ergebnisverarbeitungscode.
Wie kann ich die IronBarcode-Lizenzierung in einer CI/CD-Pipeline einrichten?
Speichern Sie IRONBARCODE_LICENSE_KEY als Pipeline-Geheimnis und weisen Sie IronBarCode.License.LicenseKey im Startup-Code der Anwendung zu. Ein Geheimnis deckt alle Umgebungen ab, einschließlich Entwicklung, Test, Staging und Produktion.
Unterstützt IronBarcode die Generierung von QR-Codes mit benutzerdefiniertem Styling?
Ja. QRCodeWriter.CreateQrCode() unterstützt benutzerdefinierte Farben über ChangeBarCodeColor(), das Einbetten von Logos über AddBrandLogo(), konfigurierbare Fehlerkorrekturstufen und mehrere Ausgabeformate einschließlich PNG, JPG, PDF und Stream.

