IRONSOFTWAREHOME
VIDEOS

Migrating from Google ML KitBarcode Scanning to IronBarcode

Curtis Chau
Curtis Chau
Updated: 20. Juni 2026

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:

dotnet add package BarCode

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

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}")
    }
Text

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

Das 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") }
Text

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);
}

Formatspezifikation: 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 KotlinIronBarcode C#
Barcode.FORMAT_QR_CODEBarcodeEncoding.QRCode
Barcode.FORMAT_CODE_128BarcodeEncoding.Code128
Barcode.FORMAT_CODE_39BarcodeEncoding.Code39
Barcode.FORMAT_CODE_93BarcodeEncoding.Code93
Barcode.FORMAT_EAN_13BarcodeEncoding.EAN13
Barcode.FORMAT_EAN_8BarcodeEncoding.EAN8
Barcode.FORMAT_UPC_ABarcodeEncoding.UPCA
Barcode.FORMAT_UPC_EBarcodeEncoding.UPCE
Barcode.FORMAT_PDF417BarcodeEncoding.PDF417
Barcode.FORMAT_DATA_MATRIXBarcodeEncoding.DataMatrix
Barcode.FORMAT_AZTECBarcodeEncoding.Aztec
Barcode.FORMAT_ITFBarcodeEncoding.ITF
Barcode.FORMAT_CODABARBarcodeEncoding.Codabar
Barcode.FORMAT_ALL_FORMATSLassen 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);

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
Text
// IronBarcode C#— result fields
string value = barcode.Value;
BarcodeEncoding format = barcode.Format;
int page = barcode.PageNumber; // populated for PDF / multi-page input
C#

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;
    });
}

Kein 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}");
}

Kein 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");

QR-Code-Generierung:

using 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");

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");
C#

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

Dieses 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

FeatureGoogle ML KitIronBarcode
.NET NuGet -PaketNoneBarCode
C# / .NET APINoneJa
Barcode-LesungJa (Android/iOS)Ja (alle Plattformen)
Barcode-GenerierungNeinJa
QR-Code-GenerierungNeinJa
QR-Logo-EinbettungNeinJa
PDF-EingabeNeinJa
Unterstützung für mehrseitige DokumenteNeinJa
Kamera-/BildeingabeJaÜber eine Bilddatei
Serverseitige BereitstellungNeinJa
ASP.NET CoreNeinJa
Azure FunctionsNeinJa
Docker/LinuxNeinJa
Google Play-Dienste erforderlichUnbundled-Variante nurNein
Firebase AbhängigkeitNein (eigenständig seit Juni 2020)Nein
Synchrone .NET -APINeinJa
AbhängigkeitsinjektionsfreundlichNeinJa (statische API)
ExpectMultipleBarcodes-OptionÜber die ErgebnislisteBarcodeReaderOptions
FormatspezifikationsetBarcodeFormats()ExpectBarcodeTypes
Kompromiss zwischen Geschwindigkeit und GenauigkeitFest (modellbasiert)ReadingSpeed-Enum
PreisgestaltungKostenlos (on-device, nur mobil)Ab $999 (Lite) unbefristet
PlattformenAndroid, iOSWindows, 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-scanning in Gradle-Dateien → entfernen, BarCode NuGet hinzufügen
  • BarcodeScannerOptions.Builder()new BarcodeReaderOptions { }
  • BarcodeScanning.getClient(options) → entfernen (keine Scanner-Instanz in IronBarcode)
  • InputImage.fromFilePath(context, uri) → Dateipfad-Zeichenfolgenargument
  • InputImage.fromBitmap(bitmap, rotation)BarcodeReader.Read(stream) oder Byte-Array-Überladung
  • scanner.process(inputImage)BarcodeReader.Read(path, options)
  • .addOnSuccessListener { barcodes -> } → Rückgabewert von Read() durchlaufen
  • .addOnFailureListener { e -> } → try/catch um Read()
  • barcode.rawValuebarcode.Value
  • barcode.formatbarcode.Format
  • Barcode.FORMAT_QR_CODEBarcodeEncoding.QRCode
  • Barcode.FORMAT_CODE_128BarcodeEncoding.Code128
  • Barcode.FORMAT_ALL_FORMATS → lassen Sie ExpectBarcodeTypes weg
  • using Google.MLKit.BarcodeScanning; (Xamarin-Bindung) → using IronBarCode;
  • IronBarCode.License.LicenseKey sollte in MauiProgram.cs, Program.cs oder Startup.cs gesetzt 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
Technischer Autor

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.

...
Weiterlesen

Verwandte Artikel

Key in blue circle

Holen Sie sich sofort Ihren kostenlosen 30-Tage-Testschlüssel.

Your trial license will be sent to your email address

Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.

bullet_checkedIhr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
AWS-Logo
Booking Badge

Von Millionen von Ingenieur*innen weltweit vertraut

Azure (WebApps, Funktionen v3)
Erhalten Sie Ihre unverbindliche Beratung
Füllen Sie das Formular unten aus oder senden Sie eine E-Mail an sales@ironsoftware.com
Ihre Daten werden immer vertraulich behandelt.
Von Millionen von Ingenieur*innen weltweit vertraut
Azure (WebApps, Funktionen v3)
Erhalten Sie sofort Ihren kostenlosen 30-Tage-Testschlüssel.
Ihr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.