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
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
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
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();
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
.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;
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"
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>
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
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>
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
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
}
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)
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
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.
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
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
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
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
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" .
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
ZXing.Net.Maui.ControlsNuGet paketini proje dosyasından kaldırınMauiProgram.cs'denbuilder.UseBarcodeReader()kaldırın- Tüm dosyalardan
using ZXing.Net.Maui;veusing ZXing.Net.Maui.Controls;ad alanı içe aktarımlarını kaldırın IronBarcodeNuGet paketini yükleyin- Barkod okuma kullanacak olan tüm dosyalara
using IronBarCode;ekleyin - Uygulama başlangıcına
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";ekleyin - Tüm XAML dosyalarından
xmlns:zxingad alanı bildirimini kaldırın - XAML dosyalarındaki tüm
<zxing:CameraBarcodeReaderView>öğelerini kaldırın - Her bir XAML dosyasında kaldırılan kamera görünümünün yerine bir
<Button>kontrolü ekleyin - Her tarama düğmesine
Clicked="ScanButton_Clicked"ekleyin - Tüm arka plan dosyalarından
OnBarcodesDetectedolay işleyici metodlarını silin - Her sayfaya
MediaPicker.CapturePhotoAsync()+BarcodeReader.Read()uygulayanasync void ScanButton_Clickedmetodlarını ekleyin - Tüm
BarcodeReaderOptionsbaşlatma bloklarını silin - Yalnızca
IsDetectingyönetimi için var olan tümOnDisappearingveOnAppearinggeçersiz kılmaları silin - Diğer mantığı içeren herhangi bir
OnDisappearingveOnAppearinggeçersiz kılmalarındanIsDetectingsatırlarını kaldırın - ZXing.Net.MAUI'yi Windows derlemesinden izole eden hiçbir
#if ANDROID|| IOSkoşullu derleme kontrolü kalmasın - Kalan tüm
BarcodeFormats.Xenum referanslarınıBarcodeEncoding.Xeş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
BarcodeFormatslistesine 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.
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.

