Comment définir la correction d'erreur en C# | IronQR
Migrer de ZXing.Net.MAUI vers IronBarcode
Ce guide fournit un chemin de migration complet de ZXing .NET.MAUI vers Code-barres IronBarcode pour les développeurs .NET MAUI . Il aborde les raisons pour lesquelles les équipes entreprennent cette migration, une comparaison des fonctionnalités pour cadrer la décision, les étapes mécaniques pour remplacer le package et mettre à jour les fichiers de projet, des exemples de code avant et après pour chaque cas d'utilisation majeur, une référence de traduction d'API, une section de dépannage pour les problèmes qui surviennent pendant la transition, une liste de contrôle de migration pour suivre les progrès et un résumé des résultats que la migration apporte.
Pourquoi migrer depuis ZXing .NET.MAUI
La décision de migrer depuis ZXing .NET.MAUI est généralement déclenchée par une ou plusieurs conditions concrètes du projet. Il ne s'agit pas de préférences stylistiques, mais de cas où l'architecture ou l'état de maintenance de la bibliothèque empêche de satisfaire une exigence.
MAUI sous Windows non pris en charge : ZXing .NET.MAUI ne dispose d'aucune implémentation de la caméra Windows et aucun projet public n'est prévu pour en développer une. La bibliothèque est conçue autour des API caméra des plateformes iOS et Android. Si un projet MAUI ajoute une cible Windows après la compilation initiale (une pratique courante dans les équipes qui privilégient le mobile), ZXing .NET.MAUI ne pourra pas du tout prendre en charge cette cible. Il n'y a pas de solution de repli, pas de solution de contournement.
Problème de mise au point automatique de l'iPhone 15 Pro : Le suivi des problèmes GitHub pour Redth/ZXing.Net.Maui documente que les appareils iPhone 15 Pro et Pro Max (iPhone16,1 et iPhone16,2) échouent à obtenir une mise au point fiable pour la détection de codes-barres lorsqu'ils utilisent CameraBarcodeReaderView. Le code-barres est visible dans le cadre de la caméra, mais le système de mise au point automatique ne parvient pas à une netteté suffisante pour que le décodeur puisse extraire un résultat. La seule solution documentée consiste à demander à l'utilisateur d'ajuster manuellement la distance entre l'appareil et le code-barres — une instruction qui nécessite une interface utilisateur visible et de la patience de l'utilisateur, et qui ne constitue pas un résultat de production acceptable pour un flux de travail principal.
Fuite de ressources de la caméra : CameraBarcodeReaderView n'implémente pas IDisposable. Lorsque l'utilisateur quitte une page de numérisation, les ressources de la caméra ne sont pas libérées selon un modèle de libération standard. La solution de contournement documentée consiste à définir IsDetecting = false dans OnDisappearing(), ce qui réduit l'impact mais ne libère pas formellement la caméra. Les applications qui naviguent fréquemment entre les pages de numérisation et les autres consomment des ressources qui peuvent se traduire par une augmentation de la mémoire, une décharge de la batterie et des échecs intermittents d'initialisation de l'appareil photo lors du retour à la page de numérisation.
Échec silencieux de la spécification de format : ZXing .NET.MAUI hérite de l'exigence de ZXing.Net de déclarer chaque format de code-barres à scanner avant le début de la numérisation. Les formats omis de BarcodeReaderOptions.Formats sont silencieusement ignorés même lorsqu'ils sont clairement visibles dans le cadre de la caméra. Un utilisateur qui pointe l'appareil vers un format de code-barres que le développeur n'avait pas prévu ne voit aucune erreur : l'application ne détecte tout simplement rien. Dans les environnements où les formats de codes-barres sont contrôlés par des fournisseurs externes, des clients ou des systèmes tiers, cette lacune silencieuse devient un problème de support persistant.
Stabilité avant 1.0 : ZXing.Net.MAUI est publié à v0.7.4 — une version stable sur NuGet mais toujours pré-1.0 sous versionnement sémantique. Les changements de l'API de version mineure restent possibles avant 1.0, la cadence des corrections de bugs dépend de la disponibilité des mainteneurs communautaires, et il n'y a pas de SLA de support commercial. Pour les applications d'entreprise soumises à des audits de dépendance ou des analyses de composition logicielle, une bibliothèque communautaire pré-1.0 sans support commercial pourrait ne pas passer le processus d'approbation.
Le problème fondamental
Le problème structurel est que CameraBarcodeReaderView enferme le développeur dans une boucle d'événements centrée sur la caméra avec une gestion manuelle du cycle de vie et une liste de formats fixes. Pour toute utilisation au-delà de la numérisation de base de la caméra sur iOS et Android avec des formats de code-barres connus, l'architecture atteint sa limite :
// 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 remplace la boucle d'événements par un simple appel asynchrone lors d'un clic sur un bouton, supprime entièrement la configuration du format et élimine la gestion du cycle de vie de la page :
// 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";
}
// Non OnAppearing / 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";
}
// Non OnAppearing / 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
' Non OnAppearing / OnDisappearing needed
End Class
Comparaison des fonctionnalités Code-barres IronBarcode et de ZXing .NET.MAUI
| Fonction | ZXing.Net.MAUI | Code-barres IronBarcode |
|---|---|---|
| État de la publication | Stable, pré-1.0 (v0.7.4) | Version stable et commerciale |
| iOS MAUI | Oui (la mise au point de l'iPhone 15 Pro est défectueuse) | Oui |
| Android MAUI | Oui (Problèmes de version de l'appareil photo 1.5.0) | Oui |
| Windows MAUI | Non pris en charge | Oui |
| macOS MAUI | Non pris en charge | Oui |
| Côté serveur / ASP.NET Core | Non | Oui |
| viseur de caméra en direct | Oui | Non (interface utilisateur du système MediaPicker) |
| Spécification de format requise | Oui | Non (détection automatique, plus de 50 formats) |
| Gestion du cycle de vie des caméras | Manuel (IsDetecting) | Sans objet |
| implémentation de Dispose() | Non | Non applicable — apatride |
| Mise au point automatique de l'iPhone 15 Pro | Cassé (documenté) | Sans objet |
| extraction de codes-barres PDF | Non | Oui |
| Saisie du chemin de fichier | Non (appareil photo uniquement) | Oui |
| Récupération de codes-barres endommagés | TryHarder uniquement | Oui (basé sur l'apprentissage automatique) |
| génération de codes-barres | Oui (via ZXing .NET) | Oui |
| Soutien commercial | None | Oui |
| Licence | MIT (gratuit) | Commercial |
Démarrage rapide
Étape 1 : Supprimer ZXing .NET.Maui.Controls et nettoyer MauiProgram.cs
Supprimez le package NuGet ZXing .NET .MAUI :
dotnet remove package ZXing.Net.Maui.Controls
dotnet remove package ZXing.Net.Maui.Controls
ZXing.Net.MAUI nécessite un appel d'enregistrement unique dans MauiProgram.cs. Supprimez cette ligne si elle est présente :
// Retirer this line from MauiProgram.cs
builder.UseBarcodeReader();
// Retirer this line from MauiProgram.cs
builder.UseBarcodeReader();
L'importation de using ZXing.Net.Maui; qui supporte cet appel peut également être supprimée de MauiProgram.cs.
Étape 2 : Installer IronBarcode
dotnet add package IronBarcode
dotnet add package IronBarcode
Le tutoriel sur le lecteur de codes-barres .NET MAUI couvre la configuration complète du projet, y compris les entrées d'autorisation de caméra Info.plist pour iOS et les déclarations d'autorisation AndroidManifest.xml pour Android.
Étape 3 : Mise à jour des espaces de noms et initialisation de la licence
Supprimez les importations d'espace de noms ZXing .NET.MAUI de tous les fichiers :
// Retirer these from every .cs file that imported them
using ZXing.Net.Maui;
using ZXing.Net.Maui.Controls;
// Retirer these from every .cs file that imported them
using ZXing.Net.Maui;
using ZXing.Net.Maui.Controls;
Ajoutez l'espace de noms Code-barres IronBarcode et initialisez la clé de licence au démarrage de l'application. L'emplacement approprié est MauiProgram.cs ou App.xaml.cs, avant que toute opération de code-barres ne soit effectuée :
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"
Exemples de migration de code
Remplacement du contrôle de caméra XAML et du code-behind
Le contrôle XAML CameraBarcodeReaderView et son code-behind de support sont les cibles principales de la migration. Ce remplacement supprime la vue caméra de la mise en page et remplace le modèle de balayage événementiel par une capture asynchrone déclenchée par un bouton.
Approche ZXing .NET.MAUI :
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
Approche IronBarcode :
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";
}
// Non OnAppearing 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";
}
// Non OnAppearing 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
' Non OnAppearing or OnDisappearing required — no camera state exists between scans
End Class
L'espace de noms XAML zxing:, la liste de formats BarcodeReaderOptions, le wrapper MainThread.BeginInvokeOnMainThread(), et les deux surcharges du cycle de vie sont complètement éliminés. La continuation de la méthode async s'exécute dans le contexte de l'appelant – qui est le thread principal pour un gestionnaire d'événements UI – donc aucun régime explicite de threads n'est nécessaire.
Suppression des spécifications de format
Tous les blocs de configuration BarcodeReaderOptions dispersés sur plusieurs pages ou scénarios de numérisation dans la base de code sont supprimés. Code-barres IronBarcode effectue une détection automatique du format parmi plus de 50 formats pris en charge, sans préconfiguration.
Approche ZXing .NET.MAUI :
// 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
}
Approche IronBarcode :
// 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)
Des indications de format sont disponibles dans Code-barres IronBarcode pour les scénarios sensibles aux performances, mais elles sont facultatives. Un code-barres dont le format ne figure pas dans un objet d'options sera tout de même détecté et renvoyé.
Suppression de la gestion du cycle de vie IsDetecting
Toutes les surcharges OnAppearing et OnDisappearing qui existent pour basculer CameraView.IsDetecting sont supprimées. Si ces surcharges de méthodes contiennent d'autres logiques de cycle de vie des pages, conservez cette logique et supprimez uniquement les lignes IsDetecting.
Approche ZXing .NET.MAUI :
// 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
Approche IronBarcode :
// Delete both methods if they contain only IsDetecting management.
// If they contain other logic, remove only the IsDetecting lines and keep the rest.
// Code-barres 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.
// Code-barres 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.
' Code-barres IronBarcode is stateless — there is no camera view running between button taps.
Windows MAUI : Même code, aucune compilation conditionnelle
Avec ZXing .NET.MAUI, l'ajout d'une cible Windows à un projet échouait soit à la compilation, soit nécessitait des stubs spécifiques à la plateforme, car l'implémentation Windows n'avait jamais été écrite. Avec IronBarcode, le même code qui fonctionne sur iOS et Android se compile et s'exécute sur Windows sans modification.
Approche ZXing .NET.MAUI :
// 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
Approche IronBarcode :
// NuGet: dotnet add package IronBarcode
// Non platform 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
// Non platform 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
' Non platform 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
Sur Windows, MediaPicker.CapturePhotoAsync() se mappe au sélecteur de fichiers de Windows, permettant à l'utilisateur de sélectionner un fichier image — un comportement approprié pour un environnement de bureau. Le guide des codes-barres MAUI pour ordinateur de bureau couvre en détail la configuration de MAUI sous Windows et macOS.
Lecture des codes-barres PDF (Nouvelle fonctionnalité)
ZXing .NET.MAUI ne dispose pas d'API pour la lecture des codes-barres dans les documents PDF. S'il s'agit d'une nouvelle exigence permise par la migration, le modèle suivant s'applique :
Approche ZXing .NET.MAUI :
// 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
Approche IronBarcode :
// 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
Le flux de travail complet de lecture des codes-barres PDF — y compris les documents multipages, les métadonnées de numéro de page et les documents de format mixte — est documenté dans le guide de lecture des codes-barres PDF .
Référence de mappage de l'API ZXing .NET.MAUI vers IronBarcode
| ZXing.Net.MAUI | Code-barres IronBarcode | Notes |
|---|---|---|
builder.UseBarcodeReader() |
Non requis | Supprimez de MauiProgram.cs |
using ZXing.Net.Maui; |
using IronBarCode; |
remplacement d'espace de noms |
using ZXing.Net.Maui.Controls; |
Non requis | Retirer |
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;..." |
Non requis | Supprimer du XAML |
<zxing:CameraBarcodeReaderView> |
<Button> + MediaPicker.CapturePhotoAsync() |
Remplacement architectural |
Options="{Binding ReaderOptions}" |
Non requis | Retirer la reliure |
BarcodesDetected="OnBarcodesDetected" |
Valeur de retour de BarcodeReader.Read() |
Événement → retour asynchrone |
new BarcodeReaderOptions { Formats = BarcodeFormats.X \N| ... } |
Non requis | La détection automatique remplace les listes de format. |
BarcodeDetectionEventArgs e |
IEnumerable<BarcodeResult> |
Résultats différents |
e.Results |
Valeur de retour de BarcodeReader.Read() |
|
barcode.Value |
result.Value |
Même nom de propriété |
barcode.Format |
result.Format |
Même nom de propriété |
BarcodeFormats.QRCode |
BarcodeEncoding.QRCode |
renommer l'énumération |
BarcodeFormats.Code128 |
BarcodeEncoding.Code128 |
renommer l'énumération |
BarcodeFormats.Ean13 |
BarcodeEncoding.EAN13 |
renommer l'énumération |
BarcodeFormats.UpcA |
BarcodeEncoding.UPCA |
renommer l'énumération |
CameraView.IsDetecting = false |
Non requis | Supprimez de OnDisappearing |
CameraView.IsDetecting = true |
Non requis | Supprimez de OnAppearing |
| API sans fichier | BarcodeReader.Read("path/to/image.png") |
Nouvelle capacité |
| API d'entrée PDF indisponible | BarcodeReader.Read("document.pdf") |
Nouvelle capacité |
| iOS et Android uniquement | iOS, Android, Windows, macOS, serveur | Extension de la plateforme |
Problèmes de migration courants et solutions
Problème n° 1 : Absence d'équivalent en mode viseur électronique
ZXing.Net.MAUI : La CameraBarcodeReaderView affiche un flux continu de la caméra dans la mise en page de la page, montrant à l'utilisateur un aperçu en direct avec un retour de numérisation superposé.
Solution : Code-barres IronBarcode ne propose pas de commande de visée en direct. Le modèle de remplacement utilise MediaPicker.CapturePhotoAsync(), qui ouvre l'interface utilisateur de l'appareil photo système de la plateforme. La caméra système offre sa propre prévisualisation en direct et un indicateur de mise au point. Après que l'utilisateur a capturé l'image et confirmé, le résultat est transmis à BarcodeReader.Read(). Si un viseur intégré persistant dans l'application est un élément UX requis qui ne peut pas être remplacé par l'interface utilisateur de l'appareil photo système, la couche d'intégration de la caméra doit être construite séparément en utilisant Microsoft.Maui.Media ou les API de caméra de la plateforme, avec Code-barres IronBarcode gérant l'étape de décodage.
Problème n° 2 : Déclarations d'autorisation de prise de vue
ZXing .NET.MAUI : Les autorisations d'accès à la caméra ont peut-être été déclarées dans le projet dans le cadre des instructions d'installation de ZXing .NET.MAUI.
Solution : Les autorisations de caméra restent nécessaires pour l'appel MediaPicker.CapturePhotoAsync() que le modèle MAUI d'IronBarcode utilise. Vérifiez que NSCameraUsageDescription est présent dans Info.plist pour iOS et que <uses-permission android:name="android.permission.CAMERA" /> est présent dans AndroidManifest.xml pour Android. Code-barres IronBarcode lui-même n'accède pas directement à la caméra — il traite les images — mais l'appel MediaPicker qui lui fournit des images nécessite une autorisation de la caméra. La configuration des autorisations est abordée dans le tutoriel sur le lecteur de codes-barres .NET MAUI .
Problème n° 3 : La compilation Windows réussit désormais là où elle échouait auparavant.
ZXing .NET.MAUI : Les projets qui tentaient d'inclure une cible Windows avec ZXing .NET.MAUI rencontraient généralement des erreurs de compilation ou nécessitaient que la bibliothèque soit exclue de la compilation Windows via une logique MSBuild conditionnelle.
Solution : Après avoir supprimé ZXing .NET.MAUI et installé IronBarcode, la compilation de MAUI pour Windows réussit sans aucune condition de plateforme. Supprimez tout #if ANDROID || Les gardes d'iOS qui entouraient les appels ZXing .NET.MAUI étaient destinés à les exclure de la compilation Windows. L'appel BarcodeReader.Read() d'IronBarcode se compile et s'exécute sur tous les frameworks cibles. Si MediaPicker.CapturePhotoAsync() a été exclu des builds Windows, cette exclusion peut également être supprimée — la méthode est prise en charge sur Windows MAUIet se mappe au sélecteur de fichiers. Vérifiez que la solution complète se compile correctement pour tous les frameworks cibles après la suppression des conditions.
Problème 4 : Références à l'énumération BarcodeFormats
ZXing.Net.MAUI : L'énumération BarcodeFormats de ZXing.Net.Maui est largement utilisée dans les configurations BarcodeReaderOptions. Une fois le paquet supprimé, toute référence restante provoque des erreurs de compilation.
Solution : Supprimez tous les blocs d'initialisation BarcodeReaderOptions qui étaient utilisés pour configurer les listes de formats. Code-barres IronBarcode ne nécessite pas de spécification de format pour fonctionner correctement. Si un code restant fait référence à des valeurs BarcodeFormats pour les besoins de journalisation, d'affichage ou de comparaison, remplacez-les par des valeurs BarcodeEncoding de l'espace de noms IronBarCode. Exécutez grep -rn "BarcodeFormats\." --include="*.cs" . pour trouver toutes les références restantes après la suppression du package.
Liste de contrôle de migration ZXing .NET.MAUI
Tâches préalables à la migration
Avant d'apporter des modifications, vérifiez l'ensemble des utilisations de ZXing .NET.MAUI dans le code source :
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" .
Documentez toutes les pages numérisées identifiées par l'audit. Notez quelles surcharges OnAppearing et OnDisappearing contiennent uniquement une gestion IsDetecting (à supprimer) par rapport à celles qui contiennent d'autres logiques (à modifier partiellement). Notez toutes les instances BarcodeReaderOptions qui peuvent contenir des listes de formats utilisées au-delà de la configuration de détection.
Tâches de mise à jour du code
- Supprimez le package NuGet
ZXing.Net.Maui.Controlsdu fichier de projet - Supprimez
builder.UseBarcodeReader()deMauiProgram.cs - Supprimez les importations d'espaces de noms
using ZXing.Net.Maui;etusing ZXing.Net.Maui.Controls;de tous les fichiers - Installez le package NuGet
IronBarcode - Ajoutez
using IronBarCode;à tous les fichiers qui utiliseront la lecture des codes-barres - Ajoutez
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";au démarrage de l'application - Supprimez la déclaration d'espace de noms
xmlns:zxingde tous les fichiers XAML - Supprimez tous les éléments
<zxing:CameraBarcodeReaderView>des fichiers XAML - Remplacez la vue de l'appareil photo supprimée par un contrôle
<Button>dans chaque fichier XAML - Ajoutez
Clicked="ScanButton_Clicked"à chaque bouton de numérisation - Supprimez les méthodes de gestion d'événements
OnBarcodesDetectedde tous les fichiers de code-behind - Ajoutez des méthodes
async void ScanButton_ClickedimplémentantMediaPicker.CapturePhotoAsync()+BarcodeReader.Read()à chaque page - Supprimez tous les blocs d'initialisation
BarcodeReaderOptions - Supprimez toutes les surcharges
OnDisappearingetOnAppearingqui existent uniquement pour la gestion deIsDetecting - Supprimez les lignes
IsDetectingde toute surchargeOnDisappearingetOnAppearingqui contiennent d'autres logiques - Supprimez toute directive
#if ANDROID|| Les mécanismes de compilation conditionnelle d'iOS qui isolaient ZXing .NET.MAUI des compilations Windows - Remplacez toutes les références d'énumération
BarcodeFormats.Xrestantes par leurs équivalentsBarcodeEncoding.X
Test de post-migration
Une fois la migration compilée sans problème, vérifiez les points suivants :
- Android MAUI : le bouton de scan ouvre l'appareil photo du système, prend une photo et affiche un code-barres correct ; veuillez vérifier avec le guide de scan Android.
- iOS MAUI : le même processus fonctionne sur iOS, y compris sur l'iPhone 15 Pro où le problème de mise au point automatique s'était produit auparavant.
- Windows MAUI : la version Windows se compile sans erreur et le bouton de numérisation ouvre le sélecteur de fichiers et renvoie un résultat correct à partir d'une image sélectionnée.
- Formats : testez la numérisation de codes-barres dans des formats qui n'étaient pas inclus dans l'ancienne liste
BarcodeFormatspour confirmer la détection automatique - Navigation entre les pages : naviguez plusieurs fois entre la page de numérisation et la page précédente et vérifiez qu'aucun problème de mémoire ou d'initialisation de l'appareil photo ne survient.
- Lecture de PDF : si la migration ajoute la lecture des codes-barres PDF comme nouvelle fonctionnalité, vérifiez que les PDF multipages renvoient des résultats avec des métadonnées de numéro de page correctes.
Principaux avantages de la migration vers IronBarcode
Couverture étendue des plateformes : après la migration, l'application prend en charge les cibles MAUI Windows et macOS en plus d'iOS et d'Android, le tout à partir du même package et du même modèle d'analyse. Les projets qui nécessitaient auparavant des modules spécifiques à chaque plateforme ou qui excluaient Windows des fonctionnalités de codes-barres bénéficient désormais d'une couverture complète sans code supplémentaire.
Fiabilité du matériel de dernière génération : L'approche de capture d'image par MediaPicker et BarcodeReader.Read() n'est pas affectée par le modèle de mise au point automatique CameraBarcodeReaderView qui échoue sur le matériel iPhone 15 Pro et Pro Max. La caméra du système gère la mise au point indépendamment, et Code-barres IronBarcode traite l'image capturée après que l'utilisateur a confirmé la prise de vue.
Élimination de la gestion des ressources de la caméra : Supprimer CameraBarcodeReaderView supprime toute catégorie de bugs de fuite des ressources de la caméra. Il n'y a pas d'état IsDetecting à suivre, ni de modèle standard OnAppearing et OnDisappearing à maintenir sur chaque page de numérisation, et aucune accumulation de ressources de la caméra à travers les cycles de navigation. L'API sans état rend les pages analysées indiscernables de n'importe quelle autre page en termes de cycle de vie des ressources.
Couverture des formats sans configuration : tout format de code-barres rencontré sur le terrain est détecté automatiquement. Les échecs de numérisation causés par des entrées manquantes dans une liste BarcodeFormats sont éliminés. Les demandes d'assistance des utilisateurs dont les codes-barres ont été ignorés sans explication parce qu'un fournisseur a modifié le format de ses étiquettes cessent.
Traitement des fichiers et des documents : La migration permet de lire les codes-barres des documents PDF, des fichiers image et des flux d'octets sans bibliothèque supplémentaire. Les flux de travail qui étaient auparavant hors du cadre de ZXing.Net.MAUI — lire les codes-barres à partir de factures téléchargées, traiter des billets numériques, numériser par lots des répertoires d'images — deviennent disponibles via le même appel BarcodeReader.Read() utilisé pour les captures par caméra.
Stabilité de niveau production : Code-barres IronBarcode est livré en tant que version commerciale stable avec un rythme de développement actif, un support commercial et des mises à jour régulières suivant les versions de .NET . Les audits de dépendances, l'analyse de la composition logicielle et les processus d'approbation Enterprise utilisent une bibliothèque prise en charge avec un engagement de maintenance documenté plutôt qu'un package de pré-version communautaire.
Questions Fréquemment Posées
Pourquoi devrais-je migrer de ZXing.Net.MAUI vers IronBarcode ?
Les raisons les plus courantes sont la simplification des licences (suppression de la complexité du SDK + de la clé d'exécution), l'élimination des limites de débit, la prise en charge native des PDF, l'amélioration du déploiement Docker/CI/CD et la réduction de l'API boilerplate dans le code de production.
Comment remplacer les appels à l'API ZXing.Net.MAUI par IronBarcode ?
Remplacer la création d'instance et le modèle de licence par IronBarCode.License.LicenseKey = "key". Remplacer les appels au lecteur par BarcodeReader.Read(path) et les appels à l'écrivain par BarcodeWriter.CreateBarcode(data, encoding). Les méthodes statiques ne nécessitent aucune gestion d'instance.
Quelle quantité de code change lors de la migration de ZXing.Net.MAUI vers IronBarcode ?
La plupart des migrations permettent de réduire le nombre de lignes de code. Les modèles de licence, les constructeurs d'instances et la configuration explicite des formats sont supprimés. Les principales opérations de lecture/écriture sont converties en équivalents plus courts d'IronBarcode avec des objets de résultat plus propres.
Dois-je conserver à la fois ZXing.Net.MAUI et IronBarcode installés pendant la migration ?
Non. La plupart des migrations sont des remplacements directs plutôt que des opérations parallèles. Migrez une classe de service à la fois, remplacez la référence NuGet et mettez à jour les modèles d'instanciation et d'appel d'API avant de passer à la classe suivante.
Quel est le nom du package NuGet pour IronBarcode ?
Le paquet est "IronBarcode" (avec un B et un C majuscules). Installez-le avec "Install-Package IronBarCode" ou "dotnet add package IronBarCode". La directive using dans le code est "using IronBarCode ;".
Comment IronBarcode simplifie-t-il le déploiement de Docker par rapport à ZXing.Net.MAUI ?
IronBarcode est un package NuGet sans fichiers SDK externes ni configuration de licence montée. Dans Docker, définissez la variable d'environnement IRONBARCODE_LICENSE_KEY et le paquetage gère la validation de la licence au démarrage.
IronBarcode détecte-t-il automatiquement tous les formats de codes-barres après avoir migré de ZXing.Net.MAUI ?
Oui. IronBarcode détecte automatiquement la symbologie dans tous les formats pris en charge. L'énumération explicite des BarcodeTypes n'est pas nécessaire. Si le format est déjà connu et que la performance est importante, BarcodeReaderOptions permet de restreindre l'espace de recherche en tant qu'optimisation.
IronBarcode peut-il lire des codes-barres à partir de PDF sans bibliothèque séparée ?
Oui, BarcodeReader.Read("document.pdf") traite les fichiers PDF de manière native. Les résultats incluent le numéro de page, le format, la valeur et la confiance pour chaque code-barres trouvé. Aucune étape de rendu PDF externe n'est requise.
Comment IronBarcode gère-t-il le traitement parallèle des codes-barres ?
Les méthodes statiques d'IronBarcode sont sans état et à l'abri des threads. Utilisez Parallel.ForEach directement sur les listes de fichiers sans gestion d'instance par thread. BarcodeReaderOptions.MaxParallelThreads contrôle le budget interne des threads.
Quelles propriétés de résultat changent lors de la migration de ZXing.Net.MAUI vers IronBarcode ?
Renommages courants : BarcodeValue devient Value, BarcodeType devient Format. Les résultats d'IronBarcode ajoutent également Confidence et PageNumber. Une recherche et un remplacement à l'échelle de la solution gèrent les renommages dans le code existant de traitement des résultats.
Comment configurer l'octroi de licences IronBarcode dans un pipeline CI/CD ?
Stockez IRONBARCODE_LICENSE_KEY en tant que secret de pipeline et attribuez IronBarCode.License.LicenseKey dans le code de démarrage de l'application. Un seul secret couvre tous les environnements, y compris le développement, les tests, la mise en scène et la production.
IronBarcode prend-il en charge la génération de codes QR avec un style personnalisé ?
Oui. QRCodeWriter.CreateQrCode() prend en charge les couleurs personnalisées via ChangeBarCodeColor(), l'intégration de logos via AddBrandLogo(), les niveaux de correction d'erreur configurables et plusieurs formats de sortie, notamment PNG, JPG, PDF et stream.

