Migrating from Google ML KitBarcode Scanning to IronBarcode
Dieser Leitfaden richtet sich an Teams in einer der folgenden beiden Situationen: Entweder portieren Sie eine Android-Anwendung nach .NET MAUI oder .NET 9 und müssen den Barcode-Scanner von ML Kit durch eine verwaltete Alternative ersetzen, oder Ihnen wurde Google ML Kitin einer Diskussion über plattformübergreifende Barcodes empfohlen und Sie haben beim Hinzufügen des NuGet Pakets festgestellt, dass es nicht existiert.
Google ML Kit Barcode Scanning ist eine native Android- und iOS-Bibliothek. Es wird als Maven-Abhängigkeit (com.google.mlkit:barcode-scanning:17.3.0 gebündelt oder com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 ungebündelt) für Kotlin/Java und als CocoaPod (GoogleMLKit/BarcodeScanning) für Swift geliefert. ML Kit ist seit Juni 2020 ein eigenständiges Produkt und erfordert kein Firebase mehr, aber es gibt kein offizielles .NET SDK, kein dotnet add package google-mlkit-barcode und keine C# API aus erster Hand von Google. Von der Community gepflegte Xamarin/MAUI-Bindungen sind im Laufe der Jahre erschienen, aber sie brechen, wenn ML Kit sein zugrunde liegendes SDK aktualisiert.
IronBarcode ist eine native .NET Bibliothek, die über NuGet installiert wird, sich in Standard .NET Muster integriert und unter Windows, Linux, macOS, Docker, Azure und AWS läuft. Dieser Leitfaden zeigt, wie Sie die in Kotlin oder Java geschriebenen Muster in äquivalenten C#-Code übersetzen können.
Der Portierungskontext
Beim Portieren von ML Kit zu IronBarcode ändern sich einige Dinge strukturell – nicht nur syntaktisch:
Callbacks werden zu Rückgabewerten. ML Kit verwendet die Android-API Task mit addOnSuccessListener und addOnFailureListener. IronBarcode's BarcodeReader.Read() gibt eine Sammlung synchron zurück. Du wiederholst es direkt. Keine Rückrufregistrierung, keine Thread-Koordination.
Kein Scanner-Objekt. ML Kit erfordert, dass Sie ein BarcodeScannerOptions-Objekt erstellen, BarcodeScanning.getClient(options) aufrufen, um eine Scanner-Instanz zu erhalten, und dann scanner.process(inputImage) aufrufen. IronBarcode verwendet statische Methoden — BarcodeReader.Read() ist der Einstiegspunkt. Es gibt keine Instanz, die verwaltet oder entsorgt werden muss.
Keine Konstruktion von InputImage. ML Kit's InputImage muss aus einer Android-spezifischen Quelle konstruiert werden: InputImage.fromFilePath(context, uri), InputImage.fromBitmap(bitmap, rotation) oder InputImage.fromMediaImage(image, rotation). IronBarcode akzeptiert einen Dateipfad als Zeichenfolge, ein Stream, ein byte[] oder ein System.Drawing.Bitmap. Kein Android-Kontext, keine URI, keine Rotationsmetadaten.
Keine Google Play-Dienste. Das ungebündelte ML Kit-Modell läuft über Google Play-Dienste. Die gebündelte Variante liefert das Modell innerhalb der APK (fügt etwa 2,4 MB hinzu) und vermeidet die Play-Dienste-Überprüfung, aber keine der Varianten ist auf .NET-Zielen erhältlich. IronBarcode hat keine solche Abhängigkeit – es läuft identisch auf jeder Plattform, die .NET unterstützt.
Schnellinstallation in .NET
Entfernen Sie alle in Ihrem Projekt vorhandenen Xamarin/MAUI ML Kit-Bindungspakete und installieren Sie anschließend IronBarcode:
Fügen Sie den Lizenzschlüssel beim Start der Anwendung hinzu — in Program.cs, MauiProgram.cs oder Startup.cs, je nach Art Ihrer App:
// NuGet: dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Die Lizenz kann zu jedem Zeitpunkt vor dem ersten BarcodeReader.Read()- oder BarcodeWriter.CreateBarcode()-Aufruf gesetzt werden. Eine kostenlose Testversion ist verfügbar; Im Testmodus werden Wasserzeichen in die Barcodes eingefügt, die Lesbarkeit wird dadurch aber nicht eingeschränkt.
Barcodes lesen: Kotlin zu C#
Einfaches Lesen eines einzelnen Barcodes
Hier ist ein typischer ML Kit-Read in Kotlin, der einen einzelnen QR-Code aus einer Datei-URI scannt:
// 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}")
}
Das Äquivalent in C# mit IronBarcode:
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 TryDas Ergebnis steht sofort als Rückgabewert zur Verfügung. barcode.Value entspricht barcode.rawValue. barcode.Format entspricht barcode.format. Die Fehlerbehandlung verwendet standardmäßige try/catch-Blöcke anstelle eines separaten Fehler-Listeners.
Lesen mehrerer Barcodes
ML Kit scannt einen einzigen InputImage und gibt eine Liste zurück. Bei mehreren Barcodes in einem Bild iterieren Sie die Liste des Erfolgs-Listeners:
// 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") }
Mit IronBarcode setzen Sie ExpectMultipleBarcodes = true in BarcodeReaderOptions und iterieren die Ergebnis-Sammlung:
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)
NextFormatspezifikation: setBarcodeFormats to BarcodeReaderOptions
ML Kit erfordert, dass Sie angeben, welche Formate über setBarcodeFormats() gesucht werden sollen. Wenn Sie es weglassen, durchsucht ML Kit alle Formate. IronBarcode funktioniert nach dem gleichen Prinzip – das Weglassen von Formatbeschränkungen durchsucht alles, aber die Angabe erwarteter Typen verbessert die Leistung.
| 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 | Lassen Sie ExpectBarcodeTypes weg |
Verwendung von Formatierungsflags in IronBarcode:
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)Die bitweise ODER-Verknüpfung funktioniert genauso wie die Vararg-Formatliste von ML Kit.
Ergebniszugriff: Rohwert und Format
ML Kit's Ergebnisobjekt gibt rawValue (ein String?) und format (eine Int-Konstante) frei. Das Ergebnis von IronBarcode gibt Value (ein string) und Format (ein BarcodeEncoding-Enum-Wert) frei.
// 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 ist immer eine nicht-null-Zeichenfolge in IronBarcode — wenn die Erfassung erfolgreich war, ist der Wert vorhanden. barcode.Format ist das BarcodeEncoding-Enum-Mitglied, das Sie direkt vergleichen können: if (barcode.Format == BarcodeEncoding.QRCode).
Was ist anders in .NET?
Synchrone API anstelle von Callbacks. Dies ist die bedeutendste strukturelle Änderung. ML Kit's scanner.process() gibt ein Task<List<Barcode>> im Android-Sinn zurück — Sie verketteten Listener. Das BarcodeReader.Read() von IronBarcode gibt das Ergebnis inline zurück. Wenn Sie es außerhalb des UI-Threads in einer MAUI-App ausführen müssen, umschließen Sie es mit Task.Run():
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)
NextKein Kontextparameter. Jeder ML Kit-Aufruf, der ein InputImage konstruiert, erfordert ein Android Context. IronBarcode benötigt lediglich einen Dateipfad oder einen Datenstrom. Durch das Entfernen des Kontext-Threadings aus der Barcode-Logik wird der Code erheblich vereinfacht.
Keine Google Play Services. Das standardmäßige ML Kit-Modell läuft über Play Services — BarcodeScanning.getClient() überprüft die Verfügbarkeit von Play Services zur Laufzeit und wirft eine Ausnahme, wenn diese nicht verfügbar sind. IronBarcode verfügt über keine Laufzeitdienstprüfung. Es liest entweder das Bild ein oder löst eine Standardausnahme aus.
Standardmäßige Ausnahmebehandlung. ML Kit's addOnFailureListener empfängt eine Java-Exception-Unterklasse. In .NET erscheinen Ausfälle als Standard-System.Exception-Ausnahmen, die auf normale Weise mit try/catch abgefangen werden können.
Lesen von PDF-Dokumenten
ML Kit bietet keine PDF-Unterstützung. InputImage.fromFilePath() mit einer .pdf URI schlägt entweder fehl oder ist auf das Lesen der ersten Seite als gerastertes Bild beschränkt, je nach Android-Version. Wenn Ihr Portierungsszenario Dokumente umfasst – Rechnungsverarbeitung, Logistikmanifeste, Formularscanning – verarbeitet IronBarcode PDFs nativ:
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}")
NextKein Bildextraktionsschritt, keine PDF-Bibliothek von Drittanbietern, keine Seiteniterationsschleife mit separatem Rendering. Übergeben Sie den PDF-Pfad und erhalten Sie alle Barcode-Werte mit ihren Seitenzahlen zurück.
Neue Fähigkeiten: Generation
ML Kit generiert keine Barcodes – es liest sie nur. Falls Ihre portierte Anwendung Etiketten, Tickets oder QR-Codes erzeugen muss, bietet IronBarcode dafür dasselbe Paket an.
Code 128 für Versandetiketten:
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-Code-Generierung:
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")QR-Code mit Logo und Farbe:
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")Gibt den Barcode als Byte-Array für eine HTTP-Antwort zurück:
using IronBarCode;
// In an ASP.NET Corecontroller action
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-7734", BarcodeEncoding.QRCode)
.ToPngBinaryData();
return File(barcodeBytes, "image/png");
Keines dieser Muster hat ein Äquivalent im ML Kit. Es handelt sich um neue Funktionen, die Ihnen zur Verfügung stehen, weil Sie mit einer vollständigen .NET -Barcodebibliothek arbeiten und nicht mit einem rein mobilen Scanner.
Serverseitige Stapelverarbeitung
ML Kit verarbeitet ein Bild pro Aufruf, benötigt eine Android/iOS-Laufzeitumgebung und kennt kein Konzept der serverseitigen Ausführung. IronBarcode verarbeitet Dateien in einer Schleife, läuft in ASP.NET Coreund skaliert normal:
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}")
NextDieses Vorgehen – das Einlesen eines Ordners mit Bildern, das Extrahieren von Barcodes und das Zusammenführen der Ergebnisse – ist mit ML Kit nicht möglich. Es handelt sich um einen Standard-Workflow von IronBarcode .
Funktionsvergleich
| Feature | Google ML Kit | IronBarcode |
|---|---|---|
| .NET NuGet -Paket | None | BarCode |
| C# / .NET API | None | Ja |
| Barcode-Lesung | Ja (Android/iOS) | Ja (alle Plattformen) |
| Barcode-Generierung | Nein | Ja |
| QR-Code-Generierung | Nein | Ja |
| QR-Logo-Einbettung | Nein | Ja |
| PDF-Eingabe | Nein | Ja |
| Unterstützung für mehrseitige Dokumente | Nein | Ja |
| Kamera-/Bildeingabe | Ja | Über eine Bilddatei |
| Serverseitige Bereitstellung | Nein | Ja |
| ASP.NET Core | Nein | Ja |
| Azure Functions | Nein | Ja |
| Docker/Linux | Nein | Ja |
| Google Play-Dienste erforderlich | Unbundled-Variante nur | Nein |
| Firebase Abhängigkeit | Nein (eigenständig seit Juni 2020) | Nein |
| Synchrone .NET -API | Nein | Ja |
| Abhängigkeitsinjektionsfreundlich | Nein | Ja (statische API) |
ExpectMultipleBarcodes-Option | Über die Ergebnisliste | BarcodeReaderOptions |
| Formatspezifikation | setBarcodeFormats() | ExpectBarcodeTypes |
| Kompromiss zwischen Geschwindigkeit und Genauigkeit | Fest (modellbasiert) | ReadingSpeed-Enum |
| Preisgestaltung | Kostenlos (on-device, nur mobil) | Ab $999 (Lite) unbefristet |
| Plattformen | Android, iOS | Windows, Linux, macOS, Docker, Azure, AWS |
Migrations-Checkliste
Wenn Sie eine Android-Codebasis portieren oder eine inoffizielle Xamarin ML Kit-Bindung ersetzen, suchen Sie in Ihrem Projekt nach diesen Mustern und wenden Sie die oben genannten Übersetzungen an:
com.google.mlkit:barcode-scanningin Gradle-Dateien → entfernen,BarCodeNuGet hinzufügenBarcodeScannerOptions.Builder()→new BarcodeReaderOptions { }BarcodeScanning.getClient(options)→ entfernen (keine Scanner-Instanz in IronBarcode)InputImage.fromFilePath(context, uri)→ Dateipfad-ZeichenfolgenargumentInputImage.fromBitmap(bitmap, rotation)→BarcodeReader.Read(stream)oder Byte-Array-Überladungscanner.process(inputImage)→BarcodeReader.Read(path, options).addOnSuccessListener { barcodes -> }→ Rückgabewert vonRead()durchlaufen.addOnFailureListener { e -> }→ try/catch umRead()barcode.rawValue→barcode.Valuebarcode.format→barcode.FormatBarcode.FORMAT_QR_CODE→BarcodeEncoding.QRCodeBarcode.FORMAT_CODE_128→BarcodeEncoding.Code128Barcode.FORMAT_ALL_FORMATS→ lassen SieExpectBarcodeTypeswegusing Google.MLKit.BarcodeScanning;(Xamarin-Bindung) →using IronBarCode;IronBarCode.License.LicenseKeysollte inMauiProgram.cs,Program.csoderStartup.csgesetzt werden
Die Hauptarbeit besteht in der strukturellen Umstellung von Callback-basiertem auf synchronen Code. Die Formatkonstanten und Ergebnisfeldnamen sind direkte Zuordnungen. PDF- und Generierungsunterstützung sind rein additiv – sie erfordern keine Migration, nur neuen Code.

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.