Altbilgi içeriğine atla
VIDEOLAR

C#'da Hata Düzeltme Nasıl Ayarlanır | IronQR

ZXing.Net.MAUI'den IronBarcode'ye Geçiş

Bu kılavuz, ZXing.Net.MAUI'den IronBarcode için .NET MAUI geliştiricilerine tam bir geçiş yolunu sağlar. Takımların bu göçü üstlenme nedenlerini, kararı çerçevelemek için bir özellik karşılaştırmasını, paketi değiştirme ve proje dosyalarını güncellemek için mekanik adımları, her ana kullanım deseni için önce-sonra kod örneklerini, bir API çeviri referansını, geçiş sırasında ortaya çıkan sorunlar için bir sorun giderme bölümünü, ilerlemenin izlenmesi için bir göç kontrol listesini ve göçün sağladığı sonuçların bir özetini içerir.

Neden ZXing.Net.MAUI'den Göç Edilmeli

ZXing.Net.MAUI'den uzaklaşmaya karar verme genellikle bir veya daha fazla somut proje koşulu ile tetiklenir. Bunlar stilistik tercihler değildir - bunlar, kütüphanenin mimarisi veya bakım durumu nedeniyle bir gereksinimin karşılanmasını engelleyen durumlardır.

Windows MAUI Desteklenmiyor: ZXing.Net.MAUI, Windows kamera uygulaması uygulaması ve bir tane oluşturma için açık bir plan sunmaz. Kütüphane, iOS ve Android platform kamera API'leri etrafında yapılandırılmıştır. Eğer bir MAUI projesi, ilk inşaattan sonra bir Windows hedefi eklerse - mobil öncelikli başlayan takımlarda yaygın bir desen - ZXing.Net.MAUI bu hedefe hiç hizmet edemez. Yedek bir çözüm, geri dönüş veya geçici çözüm yoktur.

iPhone 15 Pro Otomatik Odaklanma Sorunu: Redth/ZXing.Net.Maui için GitHub hata takipçisi, iPhone16,1 ve iPhone16,2 cihazlarının, CameraBarcodeReaderView kullanırken barkod algılama için güvenilir odaklanmayı başaramadığını belgeliyor. Barkod kamera çerçevesinde görünür, ancak otomatik odaklanma sistemi kod çözücü sonuç çıkaracak kadar keskin bir şekilde kilitlenmez. Belgelenen tek hafifletme, kullanıcının cihazla barkod arasındaki mesafeyi elle ayarlamasını istemektir - bu talep, bir görünür UX uzantısı ve kullanıcı sabrı gerektiren bir talimattır ve birincil iş akışı için kabul edilebilir bir üretim sonucu değildir.

Kamera Kaynak Sızıntısı: CameraBarcodeReaderView, IDisposable uygulamıyor. Kullanıcı bir tarama sayfasından uzaklaştığında, kamera kaynakları standart bir atma deseni ile serbest bırakılmaz. Belgelenmiş geçici çözüm, kamerayı resmi olarak serbest bırakmasa da etkisini azaltan IsDetecting = false 'i OnDisappearing() 'de ayarlamaktır. Sıkça tarama sayfalarına gidip gelen uygulamalar, kaynak tüketimi biriktirir ve bu, bellek büyümesi, pil tüketimi ve tarama sayfasına dönüşte aralıklı kamera başlatma hataları olarak kendini gösterebilir.

Format Spesifikasyonu Sessiz Başarısızlık: ZXing.Net.MAUI, tarama başlamadan önce taranacak her barkod formatını beyan etme gereksinimini ZXing.Net'ten devralır. BarcodeReaderOptions.Formats 'den çıkarılan formatlar, kamera çerçevesinde açıkça görülebilir olsa da sessizce göz ardı edilir. Geliştiricinin öngörmediği bir barkod formatına cihazı doğrultan kullanıcı, hiç hata görmez - uygulama basitçe hiçbir şey tespit etmez. Barkod formatlarının dış tedarikçiler, müşteriler veya üçüncü taraf sistemler tarafından kontrol edildiği ortamlarda, bu sessiz eksik kalış, kalıcı bir destek sorununa dönüşür.

1.0 Öncesi Kararlılık: ZXing.Net.MAUI, v0.7.4'te yayınlanmıştır — NuGet üzerinde kararlı bir sürüm, ancak hala semantik versiyonlama altında 1.0 öncesi. 1.0 öncesinde küçük versiyon API değişiklikleri olasıdır, hata düzeltme hızı, topluluk bakıcısının kullanılabilirliğine bağlıdır ve ticari destek SLA'sı yoktur. Bağımlılık denetimlerine veya yazılım kompozisyon analizine tabi kurumsal uygulamalar için, ticari destek olmadan topluluk 1.0 öncesi bir kütüphane, onay sürecini geçemeyebilir.

Temel Sorun

Yapısal sorun, geliştiriciyi manuel yaşam döngüsü yönetimi ve sabit bir format listesi ile kamera merkezli bir olay döngüsüne kilitleyen CameraBarcodeReaderView 'dir. Tanınmış barkod formatları ile iOS ve Android üzerinde temel kamera taramasının ötesine geçen her şey için mimari, sınırına ulaşır:

// 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, olay döngüsünü bir düğme dokunuşunda tek bir eşzamanlı çağrı ile değiştirir, format yapılandırmasını tamamen kaldırır ve sayfadan yaşam döngüsü yönetimini ortadan kaldırır:

// 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";
    }
    //HayırOnAppearing / 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";
    }
    //HayırOnAppearing / 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 = 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
    'HayırOnAppearing / OnDisappearing needed
End Class
$vbLabelText   $csharpLabel

IronBarcode ile ZXing.Net.MAUI: Özellik Karşılaştırması

Özellik ZXing.Net.MAUI IronBarcode
Sürüm durumu Kararlı, 1.0 öncesi (v0.7.4) Kararlı, ticari sürüm
iOS MAUI Evet (iPhone 15 Pro odaklanma bozukluğu) Evet
Android MAUI Evet (Kamera 1.5.0 derleme sorunları) Evet
Windows MAUI Desteklenmiyor Evet
macOS MAUI Desteklenmiyor Evet
Sunucu tarafı / ASP.NET Core Hayır Evet
Canlı kamera vizörü Evet Hayır (MediaPicker sistem UI)
Format spesifikasyonu gerekli Evet Hayır (otomatik algılama, 50'den fazla format)
Kamera yaşam döngüsü yönetimi El ile (IsDetecting) Uygulanamaz
Dispose() uygulaması Hayır Uygulanamaz — durumsuz
iPhone 15 Pro otomatik odaklanma Bozuk (belgelendi) Uygulanamaz
PDF barkod çıkarımı Hayır Evet
Dosya yolu girişi Hayır (sadece kamera) Evet
Hasarlı barkod kurtarma Yalnızca TryHarder Evet (ML destekli)
Barkod oluşturma Evet (ZXing.Net üzerinden) Evet
Ticari destek None Evet
Lisans MIT (ücretsiz) Ticari

Hızlı Başlangıç

Adım 1: ZXing.Net.Maui.Controls'u Kaldırın ve MauiProgram.cs'i Temizleyin

ZXing.Net.MAUI NuGet paketini kaldırın:

dotnet remove package ZXing.Net.Maui.Controls
dotnet remove package ZXing.Net.Maui.Controls
SHELL

ZXing.Net.MAUI, MauiProgram.cs 'de bir defaya mahsus olmak üzere kayıt çağrısı gerektirir. Bu satırı mevcutsa kaldırın.

//Kaldırthis line from MauiProgram.cs
builder.UseBarcodeReader();
//Kaldırthis line from MauiProgram.cs
builder.UseBarcodeReader();
$vbLabelText   $csharpLabel

Bu çağrıyı destekleyen using ZXing.Net.Maui; 'nin içe aktarımı, MauiProgram.cs 'den de kaldırılabilir.

2. Adım: IronBarcode'u Kurun

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

.NET MAUI barkod tarayıcı öğreticisi, iOS için Info.plist kamera izin girişleri ve Android için AndroidManifest.xml izin bildirimleri de dahil olmak üzere tam proje yapılandırmasını kapsar.

Adım 3: İsim Alanlarını Güncelleme ve Lisansı Başlatma

Tüm dosyalardan ZXing.Net.MAUI ad alanı ithalatlarını kaldırın:

//Kaldırthese from every .cs file that imported them
using ZXing.Net.Maui;
using ZXing.Net.Maui.Controls;
//Kaldırthese from every .cs file that imported them
using ZXing.Net.Maui;
using ZXing.Net.Maui.Controls;
$vbLabelText   $csharpLabel

Uygulama başlangıcında IronBarcode ad alanını ekleyin ve lisans anahtarını başlatın. Uygun yer MauiProgram.cs veya App.xaml.cs 'dir; barkod işlemleri yapılmadan önce:

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

Kod Göç Örnekleri

XAML Kamera Kontrolünü ve Kod-Kapalısını Değiştirme

CameraBarcodeReaderView XAML kontrolü ve destek kodu geçişin ana hedefidir. Değişiklik, sayfa düzeninden kameranın görünümünü kaldırır ve olaya dayalı tarama desenini, bir düğme tetkiklemeli asenkron yakalama ile değiştirir.

ZXing.Net.MAUI Yaklaşımı:

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

Kod-kapalısı:

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

IronBarcode Yaklaşımı:

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

Kod-kapalısı:

// 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";
    }

    //HayırOnAppearing 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";
    }

    //HayırOnAppearing or OnDisappearing required — no camera state exists between scans
}
Imports IronBarCode
Imports System.IO
Imports System.Linq
Imports Xamarin.Essentials

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())
                Dim first = results.FirstOrDefault()
                ResultLabel.Text = If(first IsNot Nothing, $"{first.Format}: {first.Value}", "No barcode found")
            End Using
        End Using
    End Sub

    'HayırOnAppearing or OnDisappearing required — no camera state exists between scans
End Class
$vbLabelText   $csharpLabel

zxing: XAML ad alanı, BarcodeReaderOptions format listesi, MainThread.BeginInvokeOnMainThread() sarmalayıcı ve her iki yaşam döngüsü geçersiz kılmaları tamamen kaldırılır. async metodunun devamı, çağıran bağlamda — bir UI olay işleyicisi için ana iş parçacığı — çalışır, bu nedenle açık iş parçacığı geçişi gerekli değildir.

Format Belirlemesini Kaldırma

Kod tabanındaki birden fazla sayfada veya tarama senaryosunda dağılmış durumdaki herhangi bir BarcodeReaderOptions yapılandırma bloğu silinir. IronBarcode, tüm 50+ desteklenen formata karşı otomatik format tespiti gerçekleştirir, ön yapılandırma gerekmeden.

ZXing.Net.MAUI Yaklaşımı:

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

IronBarcode Yaklaşımı:

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

Performans-sensitif senaryolar için IronBarcode'da format ipuçları mevcuttur, ancak bunlar isteğe bağlıdır. Bir seçenek nesnesinde listelenmeyen bir formattaki barkod, yine de tespit edilir ve geri döndürülür.

IsDetecting Yaşam Döngüsü Yönetimini Kaldırma

OnAppearing ve OnDisappearing 'yı geçersiz kılan ve CameraView.IsDetecting 'yi değiştirmek için var olan her bir çağrı kaldırılır. Bu metod geçersiz kılmalarında başka sayfa yaşam döngüsü mantığı varsa, sadece IsDetecting satırlarını kaldırın ve diğer mantığı koruyun.

ZXing.Net.MAUI Yaklaşımı:

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

IronBarcode Yaklaşımı:

// Delete both methods if they contain only IsDetecting management.
// If they contain other logic, remove only the IsDetecting lines and keep the rest.
//IronBarcode is stateless — there is no camera view running between button taps.
// Delete both methods if they contain only IsDetecting management.
// If they contain other logic, remove only the IsDetecting lines and keep the rest.
//IronBarcode is stateless — there is no camera view running between button taps.
' Delete both methods if they contain only IsDetecting management.
' If they contain other logic, remove only the IsDetecting lines and keep the rest.
' IronBarcode is stateless — there is no camera view running between button taps.
$vbLabelText   $csharpLabel

Windows MAUI: Aynı Kod, Koşullu Derleme Yok

ZXing.Net.MAUI ile, projeye bir Windows hedefi eklemek ya derlenirken başarısız oldu ya da platforma özgü parçalara ihtiyaç duydu çünkü Windows uygulaması hiç yazılmamıştı.IronBarcode ile, iOS ve Android'de çalışan aynı kod, Windows'ta herhangi bir değişiklik yapmadan derlenir ve çalışır.

ZXing.Net.MAUI Yaklaşımı:

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

IronBarcode Yaklaşımı:

// NuGet: dotnet add package IronBarcode
//Hayırplatform 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
//Hayırplatform 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
' 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

Windows'ta, MediaPicker.CapturePhotoAsync(), kullanıcıya bir resim dosyası seçme imkanı sağlayan Windows dosya seçici ile eşleştirilir — masaüstü ortamı için uygun bir davranış. MAUI masaüstü barkod kılavuzu, Windows vemacOS MAUIyapılandırmasını detaylı bir şekilde kapsar.

PDF Barkod Okuma (Yeni Yetenek)

ZXing.Net.MAUI, PDF dökümanlarından barkod okumak için bir API'ye sahip değildir. Bu, geçişin sağladığı yeni bir gereksinimse, aşağıdaki desen uygulanır:

ZXing.Net.MAUI Yaklaşımı:

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

IronBarcode Yaklaşımı:

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

Tam PDF barkod okuma iş akışı — çok sayfalı belgeler, sayfa numarası meta verileri ve karma format belgeler içerir — PDF'den barkod okuyun kılavuzunda belgelenmiştir.

ZXing.Net.MAUI API'sinden IronBarcode'ye Geçiş Haritası

ZXing.Net.MAUI IronBarcode Notlar
builder.UseBarcodeReader() Gerekli değil MauiProgram.cs 'den çıkarın
using ZXing.Net.Maui; using IronBarCode; Ad alanı değişikliği
using ZXing.Net.Maui.Controls; Gerekli değil Kaldır
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;..." Gerekli değil XAML'den Kaldır
<zxing:CameraBarcodeReaderView> <Button> + MediaPicker.CapturePhotoAsync() Mimari değişim
Options="{Binding ReaderOptions}" Gerekli değil Bağlamayı kaldır
BarcodesDetected="OnBarcodesDetected" BarcodeReader.Read() dönüş değeri Olay → async dönüş
new BarcodeReaderOptions { Formats = BarcodeFormats.X \| ... } Gerekli değil Otomatik tespit, format listesini değiştirir
BarcodeDetectionEventArgs e IEnumerable<BarcodeResult> Farklı sonuç teslimi
e.Results BarcodeReader.Read() 'in dönüş değeri
barcode.Value result.Value Aynı özellik adı
barcode.Format result.Format Aynı özellik adı
BarcodeFormats.QRCode BarcodeEncoding.QRCode Enum yeniden adlandırma
BarcodeFormats.Code128 BarcodeEncoding.Code128 Enum yeniden adlandırma
BarcodeFormats.Ean13 BarcodeEncoding.EAN13 Enum yeniden adlandırma
BarcodeFormats.UpcA BarcodeEncoding.UPCA Enum yeniden adlandırma
CameraView.IsDetecting = false Gerekli değil OnDisappearing 'dan çıkarın
CameraView.IsDetecting = true Gerekli değil OnAppearing 'dan çıkarın
Dosya girişi API'si yok BarcodeReader.Read("path/to/image.png") Yeni özellik
PDF giriş API'si yok BarcodeReader.Read("document.pdf") Yeni özellik
Sadece iOS ve Android iOS, Android, Windows, macOS, sunucu Platform genişletme

Yaygın Göç Sorunları ve Çözümleri

Sorun 1: Canlı Vizör Eşdeğeri Yok

ZXing.Net.MAUI: CameraBarcodeReaderView, sayfa düzeninde sürekli bir kamera yayını gösterir ve kullanıcıya tarama geri bildirimleri ile canlı bir önizleme sunar.

Çözüm:IronBarcode bir canlı vizör kontrolü sağlamaz. Yerine kullanılan desen, platform sistem kamera UI'sını açan MediaPicker.CapturePhotoAsync() 'yi kullanır. Sistem kamera kendi canlı önizlemesini ve odak göstergesini sağlar. Kullanıcı resmi çekip onayladıktan sonra sonuç BarcodeReader.Read() 'ye gönderilir. Sürekli bir uygulama içi bakış açısı elemanı, sistem kamera UI'sı ile değiştirilemeyen zorunlu bir UX elemanı ise, kamera entegrasyon katmanı ayrı olarak Microsoft.Maui.Media ya da platform kamera API'ları ile inşa edilmelidir;IronBarcode ise kod çözme adımını yönetir.

Sorun 2: Kamera İzin Bildirimleri

ZXing.Net.MAUI: Kamera izinleri, ZXing.Net.MAUI kurulum talimatlarının bir parçası olarak projede bildirilmiş olabilir.

Çözüm: IronBarcode'ın MAUI deseni kullandığı MediaPicker.CapturePhotoAsync() çağrısı için kamera izinleri gereklidir. iOS için NSCameraUsageDescription 'nun Info.plist 'de bulunduğunu ve Android için <uses-permission android:name="android.permission.CAMERA" /> 'nun AndroidManifest.xml 'de bulunduğunu doğrulayın. IronBarcode'ın kendisi kameraya doğrudan erişmez — görüntüleri işler — ancak ona görüntü sağlayan MediaPicker çağrısı kamera izni gerektirir. İzin kurulumu .NET MAUI barkod tarayıcı öğreticisine kapsanmıştır.

Sorun 3: Windows Build Şimdi Başarısız Olmadığı Yerlerde Başarılı Oluyor

ZXing.Net.MAUI: ZXing.Net.MAUI ile bir Windows hedefi eklemeye çalışan projeler genellikle derleme hataları ile karşılaştı veya kütüphanenin Windows derlemesinden koşullu MSBuild mantığıyla hariç tutulmasını gerektirdi.

Çözüm: ZXing.Net.MAUI kaldırıldıktan ve IronBarcode yüklendikten sonra,Windows MAUIderlemesi herhangi bir platform koşullu olmadan başarılı olur. Herhangi bir #if ANDROID|| IOS korumasını, Windows derlemesinden ZXing.Net.MAUI çağrılarını dışlamak için yerleştirilmiş herhangi IronBarcodeBarcodeReader.Read() çağrısı tüm hedef çerçevelerde derlenir ve çalıştırılır. Windows yapılarından MediaPicker.CapturePhotoAsync() hariç tutulduysa, bu dışlama da kaldırılabilir — metotWindows MAUIüzerinde desteklenir ve dosya seçici ile eşleştirilir. Koşulları kaldırdıktan sonra, tüm hedef çerçeveler için tam çözümün temiz derlenmesini doğrulayın.

Sorun 4: BarcodeFormats Enum Referansları

ZXing.Net.MAUI: ZXing.Net.Maui 'den BarcodeFormats enum'u, BarcodeReaderOptions yapılandırmalarında yaygın olarak kullanılır. Paket kaldırıldıktan sonra, kalan referanslar derleme hataları üretir.

Çözüm: Format listelerini yapılandırmak için kullanılan tüm BarcodeReaderOptions başlatma bloklarını silin. IronBarcode, doğru çalışması için format belirtimine ihtiyaç duymaz. Herhangi bir kalan kod, günlük, görüntüleme veya karşılaştırma amaçları için BarcodeFormats değerlerine referans veriyorsa, bunları IronBarCode ad alanından BarcodeEncoding değerleri ile değiştirin. Paket kaldırıldıktan sonra kalan tüm referansları bulmak için grep -rn "BarcodeFormats\." --include="*.cs" . çalıştırın.

ZXing.Net.MAUI Geçiş Kontrol Listesi

Geçiş Öncesi Görevler

Kod tabanındaki tüm ZXing.Net.MAUI kullanımını değişiklik yapmadan önce denetleyin:

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

Denetimle belirlenen tüm tarama sayfalarını belgeleyin. Hangi OnAppearing ve OnDisappearing geçersiz kılmalarının sadece silinecek IsDetecting yönetimi içerdiğini ve hangilerinin diğer mantık içerdiğini (kısmen değiştirilecek) not edin. Yalnızca tespit yapılandırması dışında yollarla kullanılan format listelerini içeren BarcodeReaderOptions örneklerini not edin.

Kod Güncelleme Görevleri

  1. ZXing.Net.Maui.Controls NuGet paketini proje dosyasından kaldırın
  2. MauiProgram.cs 'den builder.UseBarcodeReader() kaldırın
  3. Tüm dosyalardan using ZXing.Net.Maui; ve using ZXing.Net.Maui.Controls; ad alanı içe aktarımlarını kaldırın
  4. IronBarcode NuGet paketini yükleyin
  5. Barkod okuma kullanacak olan tüm dosyalara using IronBarCode; ekleyin
  6. Uygulama başlangıcına IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; ekleyin
  7. Tüm XAML dosyalarından xmlns:zxing ad alanı bildirimini kaldırın
  8. XAML dosyalarındaki tüm <zxing:CameraBarcodeReaderView> öğelerini kaldırın
  9. Her bir XAML dosyasında kaldırılan kamera görünümünün yerine bir <Button> kontrolü ekleyin
  10. Her tarama düğmesine Clicked="ScanButton_Clicked" ekleyin
  11. Tüm arka plan dosyalarından OnBarcodesDetected olay işleyici metodlarını silin
  12. Her sayfaya MediaPicker.CapturePhotoAsync() + BarcodeReader.Read() uygulayan async void ScanButton_Clicked metodlarını ekleyin
  13. Tüm BarcodeReaderOptions başlatma bloklarını silin
  14. Yalnızca IsDetecting yönetimi için var olan tüm OnDisappearing ve OnAppearing geçersiz kılmaları silin
  15. Diğer mantığı içeren herhangi bir OnDisappearing ve OnAppearing geçersiz kılmalarından IsDetecting satırlarını kaldırın
  16. ZXing.Net.MAUI'yi Windows derlemesinden izole eden hiçbir #if ANDROID|| IOS koşullu derleme kontrolü kalmasın
  17. Kalan tüm BarcodeFormats.X enum referanslarını BarcodeEncoding.X eşdeğerleri ile değiştirin

Geçiş Sonrası Testler

Geçiş temiz bir şekilde derlendikten sonra, aşağıdakileri doğrulayın:

  • Android MAUI: tarama düğmesi sistem kamerayı açar, bir fotoğraf çeker ve doğru bir barkod sonucu döndürür — Android tarama kılavuzuyla teyit edin
  • iOS MAUI: Aynı akış, iPhone 15 Pro donanımındaki otomatik odaklanma sorununu içeren iOS üzerinde çalışır
  • Windows MAUI: Windows derleme hatasız derlenir ve tarama düğmesi dosya seçiciyi açar ve seçilen bir resimden doğru bir sonuç döndürür
  • Formatlar: otomatik algılamayı doğrulamak için eski BarcodeFormats listesine dahil edilmeyen formatlarda barkod taramayı test edin
  • Sayfa gezinmesi: Tarama sayfasına birden çok kez gidip dönün ve bellek artışı veya kamera başlatma hatası oluşmadığını doğrulayın
  • PDF okuma: geçişin yeni bir yetenek olarak PDF barkod okuması eklemesi durumunda, çok sayfalı PDF'lerin doğru sayfa numarası meta verileriyle sonuçlar döndürdüğünü doğrulayın

IronBarcode'a Geçmenin Temel Faydaları

Genişletilmiş Platform Kapsamı: Geçişten sonra, uygulama, iOS ve Android'e ek olarak Windows vemacOS MAUIhedeflerini destekler — hepsi aynı paketten ve aynı tarama deseniyle. Daha önce platforma özgü parçalar gerektiren veya Windows'u barkod işlevselliğinden dışlayan projeler, ek kod olmaksızın tam kapsama alanı sağlar.

Mevcut Nesil Donanım Güvenilirliği: MediaPicker ve BarcodeReader.Read() yoluyla görüntü yakalama yaklaşımı, iPhone 15 Pro ve Pro Max donanımında başarısız olan CameraBarcodeReaderView otomatik odak modeli tarafından etkilenmez. Sistem kamera, odağı bağımsız olarak yönetir ve IronBarcode, kullanıcı çekimi onayladıktan sonra yakalanan görüntüyü işler.

Kamera Kaynağı Yönetiminin Ortadan Kaldırılması: CameraBarcodeReaderView 'nin kaldırılması, kamera kaynak sızıntı hataları kategorisini tamamen ortadan kaldırır. Takip edilecek herhangi bir IsDetecting durumu yoktur, her tarama sayfasında korunacak OnAppearing ve OnDisappearing şablonu yoktur ve gezinme döngüleri boyunca kamera kaynaklarının birikimi yoktur. Durumsuz API, tarama sayfalarını, kaynak yaşam döngüsü açısından diğer herhangi bir sayfadan ayırt edilemez hale getirir.

Konfigürasyon Olmadan Format Kapsamı: Saha karşılaşılan herhangi bir barkod formatı otomatik olarak tespit edilir. BarcodeFormats listesinde eksik girişlerden kaynaklanan tarama hataları ortadan kaldırılır. Etiket formatını değiştiren bir tedarikçiden dolayı barkodları sessizce göz ardı edilen kullanıcıların destek talepleri son bulur.

Dosya ve Belge İşleme: Geçiş, ek bir kütüphaneye gerek kalmadan PDF belgelerinden, resim dosyalarından ve bayt akışlarından barkod okuma yeteneğini açar. Daha önce ZXing.Net.MAUI kapsamı dışında kalan iş akışları — yüklenmiş faturalar üzerinden barkod okuma, dijital biletleri işleme, görüntü dizinlerini toplu tarama — aynı BarcodeReader.Read() çağrısı kullanılarak kamera yakalamaları için kullanılabilir hale gelir.

Üretim Düzeyinde Kararlılık: IronBarcode, aktif bir geliştirme süresi, ticari destek ve .NET sürüm güncellemelerini izleyen düzenli güncellemelerle, istikrarlı bir ticari sürüm olarak sunulur. Bağımlılık denetimleri, yazılım bileşimi analizi ve kurumsal onay süreçleri, belgelenmiş bir bakım taahhüdü ile bir desteklenen kütüphane ile karşılaşır, bir topluluk ön sürümü paketiyle değil.

Lütfen dikkate alınZXing.NET, ilgili sahibinin tescilli ticaret markasıdır. Bu site, ZXing.NET ile bağlı, onaylanmış veya sponsorlu değildir. Tüm ürün adları, logolar ve markalar kendi sahiplerine aittir. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır.

Sıkça Sorulan Sorular

Neden ZXing.Net.MAUI'dan IronBarcode'a göç etmeliyim?

Yaygın nedenler arasında lisanslamanın basitleştirilmesi (SDK + runtime anahtar karmaşıklığının kaldırılması), veri geçiş limitlerinin ortadan kaldırılması, yerel PDF desteği kazanılması, Docker/CI/CD dağıtımının iyileştirilmesi ve üretim kodunda API tekrarlama azalması yer alır.

ZXing.Net.MAUI API çağrılarını IronBarcode ile nasıl değiştirebilirim?

Örnek oluşturma ve lisanslama tekrarlamalarını IronBarCode.License.LicenseKey = "anahtar" ile değiştirin. Okuyucu çağrılarını BarcodeReader.Read(yol) ile ve yazıcı çağrılarını BarcodeWriter.CreateBarcode(veri, kodlama) ile değiştirin. Statik yöntemler örnek yönetimi gerektirmez.

ZXing.Net.MAUI'dan IronBarcode'a geçerken kodda ne kadar değişiklik oluyor?

Çoğu geçiş daha az kod satırıyla sonuçlanır. Lisanslama tekrarlamaları, örnek oluşturucular ve açık format yapılandırması kaldırılır. Temel okuma/yazma işlemleri, daha temiz sonuç nesneleriyle daha kısa IronBarcode eşdeğerlerine dönüştürülür.

Geçiş sırasında ZXing.Net.MAUI ve IronBarcode'u bir arada tutmam gerekiyor mu?

Hayır. Çoğu geçiş doğrudan değişim yapılır, paralel bir işletim yerine geçer. Bir hizmet sınıfını bir seferde geçirin, NuGet referansını değiştirin ve sonraki sınıfa geçmeden önce başlatma ve API çağrı desenlerini güncelleyin.

IronBarcode için NuGet paketi adı nedir?

Paket 'IronBarCode' (büyük B ve C harfleriyle). 'Install-Package IronBarCode' veya 'dotnet add package IronBarCode' ile kurun. Kodda kullanılan yönerge 'using IronBarCode;' şeklindedir.

IronBarcode, Docker dağıtımını ZXing.Net.MAUI'ye kıyasla nasıl kolaylaştırır?

IronBarcode, harici SDK dosyaları veya montajlı lisans yapılandırması olmayan bir NuGet paketidir. Docker'da, IRONBARCODE_LICENSE_KEY ortam değişkenini ayarlayın ve paket lisans doğrulamasını başlangıçta kendi kendine yapar.

ZXing.Net.MAUI'dan geçiş yaptıktan sonra IronBarcode tüm barkod formatlarını otomatik olarak algılar mı?

Evet. IronBarcode, desteklenen tüm formatlardaki sembolojiyi otomatik olarak algılar. Açık BarcodeTypes sayımı gerekli değildir. Format zaten biliniyorsa ve performans önemliyse, BarcodeReaderOptions arama alanını optimize etmek için sınırlamayı sağlar.

IronBarcode, ayrı bir kütüphane olmadan PDF'lerden barkod okuyabiliyor mu?

Evet. BarcodeReader.Read("document.pdf") PDF dosyalarını yerel olarak işlemler. Sonuçlar her barkod için SayfaNumarası, Format, Değer ve Güven içerir. Harici bir PDF render adımı gerekmez.

IronBarcode, paralel barkod işlemeyi nasıl yönetiyor?

IronBarcode'un statik yöntemleri durumsuz ve thread-safe'dir. Dağıtılmış dosya listeleri üzerinde per-thread örnek yönetimi olmadan doğrudan Parallel.ForEach kullanın. BarcodeReaderOptions.MaxParallelThreads, iç thread bütçesini kontrol eder.

ZXing.Net.MAUI'dan IronBarcode'a geçerken hangi sonuç özellikleri değişir?

Yaygın yeniden adlandırmalar: BarcodeValue, Value olur; BarcodeType, Format olur. IronBarcode sonuçları ayrıca Güven ve SayfaNumarası ekler. Çözüm çapında arama-değiştirme, mevcut sonuç işleme kodundaki yeniden adlandırmaları ele alır.

Bir CI/CD hattında IronBarcode lisanslamasını nasıl ayarlayabilirim?

IRONBARCODE_LICENSE_KEY'i bir boru hattı sırrı olarak saklayın ve uygulama başlangıç kodunda IronBarCode.License.LicenseKey olarak atayın. Bir sır, geliştirme, test, aşama ve üretim dahil olmak üzere tüm ortamları kapsar.

IronBarcode, özel biçimlendirmeye sahip QR kodu üretimini destekliyor mu?

Evet. QRCodeWriter.CreateQrCode() özelleştirilmiş renkler için ChangeBarCodeColor(), logo yerleştirme için AddBrandLogo(), yapılandırılabilir hata düzeltme seviyeleri ve PNG, JPG, PDF ve akış dahil birden çok çıktı formatını destekler.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara