Passer de Kit ML de GoogleBarcode Scanning à IronBarcode
Ce guide s'adresse aux équipes se trouvant dans l'une des deux situations suivantes : soit vous portez une application Android vers .NET MAUI ou .NET 9 et devez remplacer le lecteur de codes-barres de ML Kit par une alternative gérée, soit on vous a recommandé Kit ML de Googlelors d'une discussion sur les codes-barres multiplateformes et vous avez découvert — en voulant ajouter le package NuGet — qu'il n'existe pas.
Google ML Kit Barcode Scanning est une bibliothèque native pour Android et iOS. Il est fourni comme une dépendance Maven (com.google.mlkit:barcode-scanning:17.3.0 intégré ou com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 non intégré) pour Kotlin/Java et comme un CocoaPod (GoogleMLKit/BarcodeScanning) pour Swift. ML Kit est un produit autonome depuis juin 2020 et ne nécessite plus Firebase, mais il n'y a pas de SDK .NET officiel, pas de dotnet add package google-mlkit-barcode, et pas d'API C# de Google. Des liaisons Xamarin/MAUI maintenues par la communauté sont apparues au fil des ans, mais elles se cassent lorsque ML Kit met à jour son SDK sous-jacent.
IronBarcode est une bibliothèque .NET native qui s'installe depuis NuGet, s'intègre aux modèles .NET standard et fonctionne sous Windows, Linux, macOS, Docker, Azure et AWS. Ce guide explique comment traduire les modèles que vous avez écrits en Kotlin ou Java en code C# équivalent.
Le contexte du portage
Lors du passage de ML Kit à IronBarcode, plusieurs éléments changent structurellement, et pas seulement syntaxiquement :
Les callbacks deviennent des valeurs de retour. ML Kit utilise l'API Task d'Android avec addOnSuccessListener et addOnFailureListener. Le BarcodeReader.Read() d'IronBarcode retourne une collection de manière synchrone. Vous l'itérez directement. Aucun enregistrement de rappel, aucune coordination des threads.
Pas d'objet scanner. ML Kit vous oblige à construire un objet BarcodeScannerOptions, à appeler BarcodeScanning.getClient(options) pour obtenir une instance de scanner, puis à appeler scanner.process(inputImage). Code-barres IronBarcode utilise des méthodes statiques — BarcodeReader.Read() est le point d'entrée. Il n'y a aucune instance à gérer ou à supprimer.
Pas de construction InputImage. Le InputImage de ML Kit doit être construit à partir d'une source spécifique à Android : InputImage.fromFilePath(context, uri), InputImage.fromBitmap(bitmap, rotation) ou InputImage.fromMediaImage(image, rotation). Code-barres IronBarcode accepte une chaîne de chemin de fichier, un Stream, un byte[] ou un System.Drawing.Bitmap. Aucun contexte Android, aucune URI, aucune métadonnée de rotation.
Pas de Google Play Services. Le modèle non groupé de ML Kit fonctionne via les Google Play Services. La variante groupée embarque le modèle dans l'APK (ajoutant environ 2,4 Mo) et évite la vérification des Play Services, mais aucune des variantes n'est disponible sur les cibles .NET. Code-barres IronBarcode ne présente aucune dépendance de ce type ; il fonctionne de manière identique sur toutes les plateformes prises en charge par .NET .
Configuration rapide en .NET
Supprimez tous les packages de liaison Xamarin/MAUI ML Kit présents dans votre projet, puis installez IronBarcode:
Ajoutez la clé de licence au démarrage de l'application — dans Program.cs, MauiProgram.cs ou Startup.cs selon le type de votre application :
// NuGet: dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"La licence peut être définie à tout moment avant le premier appel BarcodeReader.Read() ou BarcodeWriter.CreateBarcode(). Un essai gratuit est disponible ; Le mode d'essai génère des filigranes pour les codes-barres, mais n'en restreint pas la lecture.
Lecture des codes-barres : Kotlin vers C#
Lecture de code-barres unique de base
Voici un exemple typique de lecture ML Kit en Kotlin, scannant un seul code QR à partir d'un URI de fichier :
// 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}")
}
L'équivalent en C# avec 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 TryLe résultat est immédiatement disponible en tant que valeur de retour. barcode.Value correspond à barcode.rawValue. barcode.Format correspond à barcode.format. La gestion des erreurs utilise un bloc try/catch standard au lieu d'un écouteur d'erreurs séparé.
Lecture de plusieurs codes-barres
ML Kit scanne un seul InputImage et retourne une liste. Pour plusieurs codes-barres dans une image, vous itérez la liste du listener de succès :
// 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") }
Avec IronBarcode, définissez ExpectMultipleBarcodes = true dans BarcodeReaderOptions et itérez la collection de résultats :
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)
NextSpécification du format : définir BarcodeFormats sur BarcodeReaderOptions
ML Kit vous oblige à spécifier les formats de recherche via setBarcodeFormats(). Si vous l'omettez, ML Kit effectue une recherche dans tous les formats. Code-barres IronBarcode fonctionne de la même manière : omettre les contraintes de format permet de tout rechercher, mais spécifier les types attendus améliore les performances.
| Kit ML Kotlin | Code-barres 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 | Omettez ExpectBarcodeTypes |
Utilisation des indicateurs de format dans 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)La combinaison OU bit à bit fonctionne de la même manière que la liste de format vararg de ML Kit.
Accès au résultat : valeur brute et format
L'objet résultat de ML Kit expose rawValue (un String?) et format (une constante Int). Le résultat d'IronBarcode expose Value (un string) et Format (une valeur énumérée BarcodeEncoding).
// Kit ML Kotlin — result fields
val rawValue: String? = barcode.rawValue
val format: Int = barcode.format
val boundingBox: Rect? = barcode.boundingBox
val displayValue: String? = barcode.displayValue
// Code-barres IronBarcode C#— result fields
string value = barcode.Value;
BarcodeEncoding format = barcode.Format;
int page = barcode.PageNumber; // populated for PDF / multi-page input
barcode.Value est toujours une chaîne non nulle dans Code-barres IronBarcode — si la lecture a réussi, la valeur est présente. barcode.Format est le membre énuméré BarcodeEncoding, que vous pouvez comparer directement : if (barcode.Format == BarcodeEncoding.QRCode).
Qu'est-ce qui change dans .NET ?
Une API synchrone remplace les fonctions de rappel. Il s'agit du changement structurel le plus important. Le scanner.process() de ML Kit retourne un Task<List<Barcode>> au sens Android — vous chaînez les listeners. Le BarcodeReader.Read() d'IronBarcode retourne le résultat en ligne. Si vous avez besoin de l'exécuter hors du thread UI dans une application MAUI, enveloppez-le dans 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)
NextPas de paramètre de contexte. Chaque appel de ML Kit qui construit un InputImage nécessite un Context Android. Code-barres IronBarcode n'a besoin que d'un chemin de fichier ou d'un flux. Supprimer le contexte d'exécution des codes-barres simplifie considérablement le code.
Pas de Google Play Services. Le modèle standard de ML Kit fonctionne via Play Services — BarcodeScanning.getClient() vérifie la disponibilité de Play Services à l'exécution et lève une exception si non disponible. Code-barres IronBarcode n'effectue aucun contrôle de service en cours d'exécution. Soit elle lit l'image, soit elle lève une exception standard.
Gestion standard des exceptions. Le addOnFailureListener de ML Kit reçoit une sous-classe de Exception Java. En .NET, les échecs apparaissent sous la forme d'exceptions System.Exception standard, capturables de manière classique avec try/catch.
Lecture de documents PDF
ML Kit ne prend pas en charge le format PDF. InputImage.fromFilePath() avec un URI .pdf échoue soit ou ne lit que la première page en tant qu'image rasterisée, selon la version Android. Si votre scénario de migration implique des documents (traitement de factures, manifestes logistiques, numérisation de formulaires), Code-barres IronBarcode gère nativement les PDF :
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}")
NextAucune étape d'extraction d'image, aucune bibliothèque PDF tierce, aucune boucle d'itération de page avec rendu séparé. Indiquez le chemin d'accès au PDF et récupérez toutes les valeurs des codes-barres ainsi que leurs numéros de page.
Nouvelles capacités : Génération
ML Kit ne génère pas de codes-barres — il ne fait que les lire. Si votre application portée a besoin de produire des étiquettes, des tickets ou des codes QR, Code-barres IronBarcode couvre ces besoins avec le même package.
Code 128 pour les étiquettes d'expédition :
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")Génération de code QR :
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")Code QR avec logo et couleur :
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")Renvoyer le code-barres sous forme de tableau d'octets pour une réponse HTTP :
using IronBarCode;
// In an ASP.NET Corecontroller action
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-7734", BarcodeEncoding.QRCode)
.ToPngBinaryData();
return File(barcodeBytes, "image/png");
Aucun de ces modèles n'a d'équivalent dans ML Kit. Ce sont de nouvelles fonctionnalités disponibles car vous travaillez avec une bibliothèque de codes-barres .NET complète plutôt qu'avec un scanner uniquement mobile.
Traitement par lots côté serveur
ML Kit traite une image par appel, nécessite un environnement d'exécution Android/iOS et ne prend pas en charge l'exécution côté serveur. Code-barres IronBarcode traite les fichiers en boucle, s'exécute sous ASP.NET Coreet s'adapte normalement :
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}")
NextCe schéma — lecture d'un dossier d'images, extraction des codes-barres, agrégation des résultats — n'est pas possible avec ML Kit. Il s'agit d'un flux de travail standard Code-barres IronBarcode .
Comparaison des fonctionnalités
| Fonction | Kit ML de Google | Code-barres IronBarcode |
|---|---|---|
| Package NuGet .NET | None | BarCode |
| API C# / .NET | None | Oui |
| Lecture de codes-barres | Oui (Android/iOS) | Oui (toutes les plateformes) |
| génération de codes-barres | Non | Oui |
| génération de code QR | Non | Oui |
| Intégration de logo QR | Non | Oui |
| Entrée PDF | Non | Oui |
| Prise en charge des documents multipages | Non | Oui |
| Entrée caméra/image | Oui | Via fichier image |
| Déploiement côté serveur | Non | Oui |
| ASP.NET Core | Non | Oui |
| Azure Functions | Non | Oui |
| Docker / Linux | Non | Oui |
| Services Google Play requis | Variante non groupée uniquement | Non |
| Dépendance Firebase | Non (autonome depuis juin 2020) | Non |
| API .NET synchrone | Non | Oui |
| Compatible avec l'injection de dépendances | Non | Oui (API statique) |
Option ExpectMultipleBarcodes | Liste de résultats via | BarcodeReaderOptions |
| Spécification du format | setBarcodeFormats() | ExpectBarcodeTypes |
| Compromis vitesse/précision | Fixe (basé sur un modèle) | enum ReadingSpeed |
| Tarifs | Gratuit (sur l'appareil, uniquement mobile) | À partir de 749 $ (Lite) perpétuel |
| Plateformes | Android, iOS | Windows, Linux, macOS, Docker, Azure, AWS |
Liste de contrôle de la migration
Si vous portez un code source Android ou remplacez une liaison non officielle du kit Xamarin ML, recherchez ces modèles dans votre projet et appliquez les traductions ci-dessus :
com.google.mlkit:barcode-scanningdans les fichiers Gradle → supprimer, ajouterBarCodeNuGetBarcodeScannerOptions.Builder()→new BarcodeReaderOptions { }BarcodeScanning.getClient(options)→ retirer (pas d'instance de scanner dans IronBarcode)InputImage.fromFilePath(context, uri)→ argument de chaîne de chemin de fichierInputImage.fromBitmap(bitmap, rotation)→BarcodeReader.Read(stream)ou surcharge de tableau d'octetsscanner.process(inputImage)→BarcodeReader.Read(path, options).addOnSuccessListener { barcodes -> }→ itérer la valeur de retour deRead().addOnFailureListener { e -> }→ try/catch autour deRead()barcode.rawValue→barcode.Valuebarcode.format→barcode.FormatBarcode.FORMAT_QR_CODE→BarcodeEncoding.QRCodeBarcode.FORMAT_CODE_128→BarcodeEncoding.Code128Barcode.FORMAT_ALL_FORMATS→ omettreExpectBarcodeTypesusing Google.MLKit.BarcodeScanning;(liaison Xamarin) →using IronBarCode;IronBarCode.License.LicenseKeydoit être défini dansMauiProgram.cs,Program.csouStartup.cs
Le principal travail consiste à passer d'un code basé sur des rappels à un code synchrone. Les constantes de format et les noms des champs de résultat sont des correspondances directes. La prise en charge des fichiers PDF et de la génération est purement additive ; elle ne nécessite aucune migration, seulement du nouveau code.

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes et créer des manuels bien structurés et visuellement attrayants.