Passer au contenu du pied de page
VIDéOS

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
SHELL

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();
$vbLabelText   $csharpLabel

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
SHELL

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;
$vbLabelText   $csharpLabel

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"
$vbLabelText   $csharpLabel

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>
XML

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
$vbLabelText   $csharpLabel

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>
XML

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
$vbLabelText   $csharpLabel

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
}
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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.
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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" .
SHELL

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

  1. Supprimez le package NuGet ZXing.Net.Maui.Controls du fichier de projet
  2. Supprimez builder.UseBarcodeReader() de MauiProgram.cs
  3. Supprimez les importations d'espaces de noms using ZXing.Net.Maui; et using ZXing.Net.Maui.Controls; de tous les fichiers
  4. Installez le package NuGet IronBarcode
  5. Ajoutez using IronBarCode; à tous les fichiers qui utiliseront la lecture des codes-barres
  6. Ajoutez IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; au démarrage de l'application
  7. Supprimez la déclaration d'espace de noms xmlns:zxing de tous les fichiers XAML
  8. Supprimez tous les éléments <zxing:CameraBarcodeReaderView> des fichiers XAML
  9. Remplacez la vue de l'appareil photo supprimée par un contrôle <Button> dans chaque fichier XAML
  10. Ajoutez Clicked="ScanButton_Clicked" à chaque bouton de numérisation
  11. Supprimez les méthodes de gestion d'événements OnBarcodesDetected de tous les fichiers de code-behind
  12. Ajoutez des méthodes async void ScanButton_Clicked implémentant MediaPicker.CapturePhotoAsync() + BarcodeReader.Read() à chaque page
  13. Supprimez tous les blocs d'initialisation BarcodeReaderOptions
  14. Supprimez toutes les surcharges OnDisappearing et OnAppearing qui existent uniquement pour la gestion de IsDetecting
  15. Supprimez les lignes IsDetecting de toute surcharge OnDisappearing et OnAppearing qui contiennent d'autres logiques
  16. Supprimez toute directive #if ANDROID || Les mécanismes de compilation conditionnelle d'iOS qui isolaient ZXing .NET.MAUI des compilations Windows
  17. Remplacez toutes les références d'énumération BarcodeFormats.X restantes par leurs équivalents BarcodeEncoding.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 BarcodeFormats pour 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.

Veuillez noterZXing.NET est une marque déposée de son propriétaire respectif. Ce site n'est pas affilié à, approuvé par ou parrainé par ZXing.NET. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.

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.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi