C# ve IronBarcode Kullanarak .NET 5 için Barkodları Nasıl Okursunuz?
#Google ML KitBarkod Tarama'dan IronBarcode'a Geçiş
Bu kılavuz, iki durumdan birinde olan ekipler içindir: bir Android uygulamasını .NET MAUI veya .NET 9'a aktarıyorsunuz ve ML Kit'in barkod okuyucusunu yönetilen bir alternatifle değiştirmeniz gerekiyor veya çapraz platform barkod tartışmasındaGoogle ML Kitönerildi ve NuGet paketini eklemeye gittiğinizde, onun mevcut olmadığını keşfettiniz.
Google ML Kit Barkod Taraması yerel bir Android ve iOS kütüphanesidir. Kotlin/Java için Maven bağımlılığı olarak (com.google.mlkit:barcode-scanning:17.3.0 paketli veya com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 paketsiz) ve Swift için CocoaPod olarak (GoogleMLKit/BarcodeScanning) sunulur. ML Kit, Haziran 2020'den beri bağımsız bir üründür ve artık Firebase gerektirmez, ancak resmi bir .NET SDK'sı, dotnet add package google-mlkit-barcode ve Google'dan gelen birinci taraf C# API yoktur. Yıllar içinde topluluk tarafından sürdürülen Xamarin/MAUI bağlamaları ortaya çıkmıştır ancak ML Kit temel SDK'sını güncellediğinde bozulmaktadırlar.
IronBarcode, NuGet'ten kurulan, standart .NET desenleriyle entegre olan ve Windows, Linux, macOS, Docker, Azure ve AWS üzerinde çalışan yerel bir .NET kütüphanesidir. Bu kılavuz, Kotlin veya Java'da yazdığınız desenleri eşdeğer C# koduna nasıl çevireceğinizi gösterir.
Geçiş Bağlamı
ML Kit'ten IronBarcode'a geçerken, sadece sözdizimsel değil, yapısal olarak birkaç değişiklik olur:
Geri çağrılar dönüş değerlerine dönüşür. ML Kit, Android'in Task API'sini addOnSuccessListener ve addOnFailureListener ile kullanır. IronBarcode'un BarcodeReader.Read() senkron bir şekilde bir koleksiyon döndürüyor. Onu doğrudan yineleyin. Geri çağırma kaydı yok, iş parçacığı koordinasyonu yok.
Tarayıcı nesnesi yok. ML Kit, bir BarcodeScannerOptions nesnesi oluşturmanızı, bir tarayıcı örneği almak için BarcodeScanning.getClient(options) çağırmanızı ve ardından scanner.process(inputImage) çağırmanızı gerektirir. IronBarcode, statik yöntemler kullanır — BarcodeReader.Read() giriş noktasıdır. Yönetilecek veya atılacak bir örnek yok.
InputImage yapısı yok. ML Kit'in InputImage nesnesi, Android'e özgü bir kaynaktan oluşturulmalı: InputImage.fromFilePath(context, uri), InputImage.fromBitmap(bitmap, rotation) veya InputImage.fromMediaImage(image, rotation). IronBarcode, bir dosya yolu dizesi, Stream, byte[] veya System.Drawing.Bitmap kabul eder. Android bağlamı yok, URI yok, döndürme meta verisi yok.
Google Play Hizmetleri yok. Paketlenmemiş ML Kit modeli Google Play Hizmetleri üzerinden çalışır. Paketlenmiş varyant, modeli APK içine gönderir (yaklaşık 2,4 MB ekleyerek) ve Play Hizmetleri kontrolünü atlayarak çalışır, ancak hiçbiri .NET hedeflerinde mevcut değildir.IronBarcode böyle bir bağımlılığa sahip değil — .NET'in desteklediği herhangi bir platformda aynı şekilde çalışır.
.NET'te Hızlı Kurulum
Projenizde varsa herhangi bir Xamarin/MAUI ML Kit bağlama paketini kaldırın, ardından IronBarcode'u kurun:
Lisans anahtarını uygulama başlangıcında, uygulama türünüze bağlı olarak Program.cs, MauiProgram.cs veya Startup.cs içinde ekleyin:
// NuGet: dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Lisans, ilk BarcodeReader.Read() veya BarcodeWriter.CreateBarcode() çağrısından önce herhangi bir noktada ayarlanabilir. Ücretsiz deneme mevcuttur; deneme modundaki su işareti üretilen barkodlara su işareti uygular, ancak okumayı kısıtlamaz.
Barkod Okuma: Kotlin'den C#'a
Temel Tek Barkod Okuma
İşte Kotlin'de ML Kit ile tipik bir okuma, bir dosya URI'sinden tek bir QR kodu tarama:
// Android Kotlin — ML Kit
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(Barcode.FORMAT_QR_CODE)
.build()
val scanner = BarcodeScanning.getClient(options)
val inputImage = InputImage.fromFilePath(context, imageUri)
scanner.process(inputImage)
.addOnSuccessListener { barcodes ->
val barcode = barcodes.firstOrNull()
if (barcode != null) {
Log.d("MLKit", "Value: ${barcode.rawValue}")
Log.d("MLKit", "Format: ${barcode.format}")
}
}
.addOnFailureListener { e ->
Log.e("MLKit", "Scan failed: ${e.message}")
}
IronBarcode ile C#'ta eşdeğeri:
using IronBarCode;
try
{
var results = BarcodeReader.Read("captured-image.jpg");
var barcode = results.FirstOrDefault();
if (barcode != null)
{
Console.WriteLine($"Value: {barcode.Value}");
Console.WriteLine($"Format: {barcode.Format}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Scan failed: {ex.Message}");
}Imports IronBarCode
Try
Dim results = BarcodeReader.Read("captured-image.jpg")
Dim barcode = results.FirstOrDefault()
If barcode IsNot Nothing Then
Console.WriteLine($"Value: {barcode.Value}")
Console.WriteLine($"Format: {barcode.Format}")
End If
Catch ex As Exception
Console.WriteLine($"Scan failed: {ex.Message}")
End TrySonuç, doğrudan bir dönüş değeri olarak hemen mevcuttur. barcode.Value, barcode.rawValue ile uyuşur. barcode.Format, barcode.format ile uyuşur. Hata yönetimi, ayrı bir arıza dinleyicisi yerine standart try/catch kullanır.
Çoklu Barkod Okuma
ML Kit, tek bir InputImage tarar ve bir liste döndürür. Bir görüntüde birden fazla barkod varsa, başarı dinleyicisinin listesini yineleyin:
// Android Kotlin — ML Kit, multiple barcodes
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(Barcode.FORMAT_ALL_FORMATS)
.build()
val scanner = BarcodeScanning.getClient(options)
val inputImage = InputImage.fromFilePath(context, imageUri)
scanner.process(inputImage)
.addOnSuccessListener { barcodes ->
for (barcode in barcodes) {
val rawValue = barcode.rawValue
val format = barcode.format
processBarcode(rawValue, format)
}
}
.addOnFailureListener { e -> Log.e("MLKit", e.message ?: "Unknown error") }
IronBarcode ile, ExpectMultipleBarcodes = true 'i BarcodeReaderOptions içinde ayarlayın ve sonuç koleksiyonunu yineleyin:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read("warehouse-shelf.jpg", options);
foreach (var barcode in results)
{
Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}");
ProcessBarcode(barcode.Value, barcode.Format);
}Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read("warehouse-shelf.jpg", options)
For Each barcode In results
Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}")
ProcessBarcode(barcode.Value, barcode.Format)
NextFormat Özellikleri: setBarcodeFormats'ten BarcodeReaderOptions'a
ML Kit, hangi formatları arayacağınızı setBarcodeFormats() ile belirtmenizi gerektirir. Onu atlamazsanız, ML Kit tüm formatları arar.IronBarcode aynı şekilde çalışır — format kısıtlamalarını atlamak her şeyi arar, ancak beklenen türleri belirtmek performansı artırır.
| ML Kit Kotlin | IronBarcode C# |
|---|---|
Barcode.FORMAT_QR_CODE | BarcodeEncoding.QRCode |
Barcode.FORMAT_CODE_128 | BarcodeEncoding.Code128 |
Barcode.FORMAT_CODE_39 | BarcodeEncoding.Code39 |
Barcode.FORMAT_CODE_93 | BarcodeEncoding.Code93 |
Barcode.FORMAT_EAN_13 | BarcodeEncoding.EAN13 |
Barcode.FORMAT_EAN_8 | BarcodeEncoding.EAN8 |
Barcode.FORMAT_UPC_A | BarcodeEncoding.UPCA |
Barcode.FORMAT_UPC_E | BarcodeEncoding.UPCE |
Barcode.FORMAT_PDF417 | BarcodeEncoding.PDF417 |
Barcode.FORMAT_DATA_MATRIX | BarcodeEncoding.DataMatrix |
Barcode.FORMAT_AZTEC | BarcodeEncoding.Aztec |
Barcode.FORMAT_ITF | BarcodeEncoding.ITF |
Barcode.FORMAT_CODABAR | BarcodeEncoding.Codabar |
Barcode.FORMAT_ALL_FORMATS | ExpectBarcodeTypes 'i atlayın |
IronBarcode'da format bayraklarını kullanma:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128 | BarcodeEncoding.EAN13
};
var results = BarcodeReader.Read("product-image.jpg", options);Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128 Or BarcodeEncoding.EAN13
}
Dim results = BarcodeReader.Read("product-image.jpg", options)Bitwise OR kombinasyonu, ML Kit'in vararg format listesi ile aynı şekilde çalışır.
Sonuç Erişimi: rawValue ve format
ML Kit'in sonuç nesnesi rawValue (bir String?) ve format (bir Int sabit değeri) sunar. IronBarcode'un sonuç nesnesi Value (bir string) ve Format (bir BarcodeEncoding enum değeri) sunar.
//ML Kit Kotlin— result fields
val rawValue: String? = barcode.rawValue
val format: Int = barcode.format
val boundingBox: Rect? = barcode.boundingBox
val displayValue: String? = barcode.displayValue
//IronBarcode C#— result fields
string value = barcode.Value;
BarcodeEncoding format = barcode.Format;
int page = barcode.PageNumber; // populated for PDF / multi-page input
barcode.Value, IronBarcode'da her zaman null olmayan bir dizedir - okuma başarılıysa, değer mevcuttur. barcode.Format, doğrudan karşılaştırabileceğiniz BarcodeEncoding enum üyesidir: if (barcode.Format == BarcodeEncoding.QRCode).
.NET'te Ne Farklı
Geri çağırma yerine senkron API. Bu en önemli yapısal değişikliktir. ML Kit'in scanner.process(), Android anlamında bir Task<List<Barcode>> döndürür — dinleyicileri zincirlersiniz. IronBarcode'un BarcodeReader.Read(), sonucu satır içinde döndürür. Bir MAUI uygulamasında UI iş parçacığından uzak çalıştırmanız gerekiyorsa, Task.Run() içinde sarın:
using IronBarCode;
// In a MAUI ViewModel or page code-behind
var results = await Task.Run(() => BarcodeReader.Read(imagePath));
foreach (var barcode in results)
{
// update UI on main thread
MainThread.BeginInvokeOnMainThread(() =>
{
ResultLabel.Text = barcode.Value;
});
}Imports IronBarCode
Imports System.Threading.Tasks
Imports Microsoft.Maui.Dispatching
' In a MAUI ViewModel or page code-behind
Dim results = Await Task.Run(Function() BarcodeReader.Read(imagePath))
For Each barcode In results
' update UI on main thread
MainThread.BeginInvokeOnMainThread(Sub()
ResultLabel.Text = barcode.Value
End Sub)
NextBağlam parametresi yok. Bir InputImage oluşturan her ML Kit çağrısı, bir Android Context gerektirir.IronBarcode yalnızca bir dosya yolu veya akışa ihtiyaç duyar. Barkod mantığından bağlam iş parçacığı yönetimini kaldırmak, kodu önemli ölçüde basitleştirir.
Google Play Hizmetleri yok. Standart ML Kit modeli Play Hizmetleri aracılığıyla çalışır - BarcodeScanning.getClient(), Çalışma zamanında Play Hizmetleri kullanılabilirliğini kontrol eder ve kullanılamıyorsa hata verir. IronBarcode'da çalışma zamanı hizmeti kontrolü yoktur. Ya resmi okur ya da standart bir hata fırlatır.
Standart istisna işlemesi. ML Kit'in addOnFailureListener, bir Java Exception alt sınıfı alır. .NET'te, hatalar standart System.Exception hataları olarak yüzeye çıkar, normal yolla try/catch ile yakalanabilir.
PDF Belgelerden Okuma
ML Kit'in PDF desteği yoktur. Bir InputImage.fromFilePath() URI'si ya başarısız olur ya da Android sürümüne bağlı olarak yalnızca ilk sayfayı rasterleştirilmiş bir görüntü olarak okur. Aktarma senaryonuz belgeleri içeriyorsa — fatura işleme, lojistik manifestolar, form tarama —IronBarcode PDF'leri yerel olarak işler:
using IronBarCode;
// Read all barcodes from all pages of a PDF
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read("invoice-batch.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");
}Imports IronBarCode
' Read all barcodes from all pages of a PDF
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read("invoice-batch.pdf", options)
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}")
NextGörüntü çıkartma adımı yok, üçüncü taraf PDF kütüphanesi yok, ayrı render ile sayfa yineleme döngüsü yok. PDF yolunu geçin, sayfalarıyla birlikte tüm barkod değerlerini geri alın.
Yeni Yetenekler: Üretim
ML Kit barkod üretmez — yalnızca okur. Aktardığınız uygulamanız etiketi, bileti veya QR kodları üretmesi gerekiyorsa,IronBarcode aynı pakette bu kapsamı içerir.
Gönderi etiketleri için Code 128:
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-2024-98341", BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.SaveAsPng("shipping-label.png");Imports IronBarCode
BarcodeWriter.CreateBarcode("SHIP-2024-98341", BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.SaveAsPng("shipping-label.png")QR kod oluşturma:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/track/98341", 500)
.SaveAsPng("tracking-qr.png");Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com/track/98341", 500) _
.SaveAsPng("tracking-qr.png")Logo ve renk içeren QR kod:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500)
.AddBrandLogo("company-logo.png")
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue)
.SaveAsPng("product-qr.png");Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500) _
.AddBrandLogo("company-logo.png") _
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue) _
.SaveAsPng("product-qr.png")HTTP yanıtı için bayt dizisi olarak barkodu döndürme:
using IronBarCode;
// In anASP.NET Corecontroller action
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-7734", BarcodeEncoding.QRCode)
.ToPngBinaryData();
return File(barcodeBytes, "image/png");
Bu desenlerin ML Kit eşdeğerleri yoktur. Tam .NET barkod kütüphanesinde çalışarak kullanılabilir yeni kapasiteler.
Sunucu Tarafı Yığın İşleme
ML Kit, çağrı başına bir görüntü işler, Android/iOS çalışma zamanı gerektirir ve sunucu tarafı yürütme kavramına sahip değildir. IronBarcode, dosyaları bir döngüde işler, ASP.NET Core'da çalışır ve normal olarak ölçeklenir:
using IronBarCode;
// Process a folder of scanned document images
var imageFiles = Directory.GetFiles("/data/scans", "*.jpg");
var allResults = new List<(string File, string Value, BarcodeEncoding Format)>();
foreach (var file in imageFiles)
{
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Faster,
ExpectMultipleBarcodes = false
};
var results = BarcodeReader.Read(file, options);
foreach (var barcode in results)
{
allResults.Add((file, barcode.Value, barcode.Format));
}
}
// Write results to CSV, database, etc.
foreach (var (file, value, format) in allResults)
{
Console.WriteLine($"{file}: [{format}] {value}");
}Imports IronBarCode
Imports System.IO
' Process a folder of scanned document images
Dim imageFiles = Directory.GetFiles("/data/scans", "*.jpg")
Dim allResults = New List(Of (File As String, Value As String, Format As BarcodeEncoding))()
For Each file In imageFiles
Dim options = New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Faster,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read(file, options)
For Each barcode In results
allResults.Add((file, barcode.Value, barcode.Format))
Next
Next
' Write results to CSV, database, etc.
For Each result In allResults
Console.WriteLine($"{result.File}: [{result.Format}] {result.Value}")
NextBu desen — görüntüleri bir klasörden okuma, barkodları çıkarma, sonuçları toplama — ML Kit ile mümkün değildir. Bu, standart bir IronBarcode iş akışıdır.
Özellik Karşılaştırması
| Özellik | Google ML Kit | IronBarcode |
|---|---|---|
| .NET NuGet paketi | None | BarCode |
| C# / .NET API | None | Evet |
| Barkod okuma | Evet (Android/iOS) | Evet (tüm platformlar) |
| Barkod oluşturma | Hayır | Evet |
| QR kod üretimi | Hayır | Evet |
| QR logo yerleştirme | Hayır | Evet |
| PDF girdisi | Hayır | Evet |
| Çok sayfalı belge desteği | Hayır | Evet |
| Kamera/kare girdisi | Evet | Görüntü dosyası üzerinden |
| Sunucu tarafı dağıtım | Hayır | Evet |
| ASP.NET Core | Hayır | Evet |
| Azure Functions | Hayır | Evet |
| Docker / Linux | Hayır | Evet |
| Google Play Hizmetleri gerekli | Yalnızca paketlenmemiş varyant | Hayır |
| Firebase bağımlılığı | Hayır (Haziran 2020'den beri bağımsız) | Hayır |
| Senkron .NET API | Hayır | Evet |
| Bağımlılık enjeksiyon dostu | Hayır | Evet (statik API) |
ExpectMultipleBarcodes seçeneği | Sonuç listesi üzerinden | BarcodeReaderOptions |
| Biçim belirtimi | setBarcodeFormats() | ExpectBarcodeTypes |
| Hız/doğruluk takası | Sabit (model tabanlı) | ReadingSpeed enum |
| Fiyatlandırma | Ücretsiz (cihaz üzerinde, yalnızca mobil) | $999'dan itibaren (Lite) süresiz |
| Platformlar | Android, iOS | Windows, Linux, macOS, Docker, Azure, AWS |
Geçiş Kontrol Listesi
Android kod tabanını aktarıyorsanız veya gayri resmi bir Xamarin ML Kit bağlama değiştiriyorsanız, projeinizde bu desenleri arayın ve yukarıdaki çevirileri uygulayın:
- Gradle dosyalarındaki
com.google.mlkit:barcode-scanning→ kaldırın,BarCodeNuGet ekleyin BarcodeScannerOptions.Builder()→new BarcodeReaderOptions { }BarcodeScanning.getClient(options)→ kaldır (IronBarcode'da tarayıcı örneği yok)InputImage.fromFilePath(context, uri)→ dosya yolu dizisi argümanıInputImage.fromBitmap(bitmap, rotation)→BarcodeReader.Read(stream)veya bayt dizisi aşırı yüklemesiscanner.process(inputImage)→BarcodeReader.Read(path, options).addOnSuccessListener { barcodes -> }→Read()dönüş değerini yineleyin.addOnFailureListener { e -> }→Read()etrafında try/catch kullanınbarcode.rawValue→barcode.Valuebarcode.format→barcode.FormatBarcode.FORMAT_QR_CODE→BarcodeEncoding.QRCodeBarcode.FORMAT_CODE_128→BarcodeEncoding.Code128Barcode.FORMAT_ALL_FORMATS→ExpectBarcodeTypes'i atlayınusing Google.MLKit.BarcodeScanning;(Xamarin bağlama) →using IronBarCode;IronBarCode.License.LicenseKey,MauiProgram.cs,Program.csveyaStartup.csiçinde ayarlanmalıdır
Geri çağırma tabanlı koddan senkron koda yapısal değişim ana çalışmadır. Format sabitleri ve sonuç alanı adları doğrudan eşlemelerdir. PDF ve üretim desteği tamamen eklentiseldir — hiçbir geçiş gerektirmez, sadece yeni kod.

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ılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.