IRONSOFTWAREHOME
VIDÉOS

Passer de Dynamsoft Barcode Reader à IronBarcode

Curtis Chau
Curtis Chau
Updated: 1 août 2026

La plupart des développeurs qui migrent de Dynamsoft Barcode Reader à IronBarcode se divisent en deux groupes: ceux qui ont choisi Dynamsoft pour sa réputation et ont ensuite découvert que l'API centrée sur la caméra ne correspondait pas à un cas d'utilisation de traitement de documents, et ceux qui fonctionnent dans des environnements isolés ou Docker où la dépendance au serveur de licences a causé des incidents de production.

Si vous faites partie du premier groupe, la migration supprime la bibliothèque de rendu PDF externe, la boucle de rendu par page et le modèle de licence par code d'erreur. Si vous êtes dans le deuxième groupe, la migration supprime l'appel réseau InitLicense, le paquet de contenu de la licence hors ligne et le cycle de rafraîchissement, ainsi que la politique réseau sortante de votre configuration Docker ou VPC. Dans les deux cas, la base de code est raccourcie après cette migration.

Ce guide est honnête sur ce que vous perdez: si votre application traite les frames de caméra en temps réel, le pipeline Capture Vision de Dynamsoft est ajusté pour cette charge de travail et IronBarcode n'est pas le bon remplacement. Ce guide de migration est destiné au traitement des fichiers côté serveur, aux flux de travail documentaires et aux environnements où l'accès au serveur de licences pose problème.

Étape 1 : Remplacer les packages NuGet

dotnet remove package Dynamsoft.DotNet.BarcodeReader.Bundle
dotnet add package BarCode
SHELL

Si votre projet comporte également une bibliothèque de rendu PDF ajoutée spécifiquement pour Dynamsoft (PdfiumViewer étant la plus courante), celle-ci peut également être supprimée :

# Remove if added only for Dynamsoft PDF support
dotnet remove package PdfiumViewer
dotnet remove package PdfiumViewer.Native.x86_64.v8-xfa
SHELL

Étape 2 : Remplacer l'initialisation de la licence

C'est là que la simplification est la plus immédiate. Le modèle Dynamsoft exige une vérification du code d'erreur et une gestion des exceptions à chaque démarrage :

Avant — Dynamsoft :

using Dynamsoft.License;
using Dynamsoft.Core;

// Must run before any barcode operations
int errorCode = LicenseManager.InitLicense("YOUR-DYNAMSOFT-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
    throw new InvalidOperationException($"License validation failed [{errorCode}]: {errorMsg}");

Après — IronBarcode:

// NuGet: dotnet add package BarCode
using IronBarCode;

// Local validation — no network call, no error code
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

Dans une application ASP.NET Core, ajoutez ceci à Program.cs avant builder.Build() :

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_KEY")
    ?? "YOUR-LICENSE-KEY";

Dans un environnement Docker ou Kubernetes, définissez la variable d'environnement IRONBARCODE_KEY dans votre manifeste de déploiement. Aucune règle réseau sortante requise.

Étape 3 : Remplacer les importations d'espace de noms

Rechercher et remplacer dans tous les fichiers sources :

grep -r "using Dynamsoft\." --include="*.cs" .
SHELL

Remplacez chaque occurrence :

// Before
using Dynamsoft.CVR;
using Dynamsoft.DBR;
using Dynamsoft.License;
using Dynamsoft.Core;

// After
using IronBarCode;

Exemples de migration de code

Lecture de fichiers de base

L'opération la plus fondamentale : la lecture d'un code-barres à partir d'un fichier image.

Avant — Dynamsoft :

using Dynamsoft.CVR;
using Dynamsoft.DBR;

public string ReadBarcodeFromFile(CaptureVisionRouter router, string imagePath)
{
    CapturedResult result = router.Capture(imagePath, PresetTemplate.PT_READ_BARCODES);
    BarcodeResultItem[] items = result.GetDecodedBarcodesResult()?.GetItems();
    if (items == null || items.Length == 0)
        return null;

    return items[0].GetText();
}

Après — IronBarcode:

// NuGet: dotnet add package BarCode
using IronBarCode;

public string ReadBarcodeFromFile(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results?.FirstOrDefault()?.Value;
}

L'instance de routeur a disparu. BarcodeReader.Read est statique. BarcodeResultItem.GetText() devient .Value. La vérification de nullité sur results est plus propre avec LINQ.

Lecture de plusieurs codes-barres

Avant — Dynamsoft :

using Dynamsoft.CVR;
using Dynamsoft.DBR;

public List<string> ReadAllBarcodes(CaptureVisionRouter router, string imagePath)
{
    SimplifiedCaptureVisionSettings settings = router.GetSimplifiedSettings(
        PresetTemplate.PT_READ_BARCODES);
    settings.BarcodeSettings.ExpectedBarcodesCount = 0; // 0 = find all
    router.UpdateSettings(PresetTemplate.PT_READ_BARCODES, settings);

    CapturedResult result = router.Capture(imagePath, PresetTemplate.PT_READ_BARCODES);
    BarcodeResultItem[] items = result.GetDecodedBarcodesResult()?.GetItems();
    var values = new List<string>();

    if (items != null)
    {
        foreach (var item in items)
            values.Add(item.GetText());
    }

    return values;
}

Après — IronBarcode:

using IronBarCode;

public List<string> ReadAllBarcodes(string imagePath)
{
    var options = new BarcodeReaderOptions
    {
        ExpectMultipleBarcodes = true,
        MaxParallelThreads = 4
    };

    return BarcodeReader.Read(imagePath, options)
        .Select(r => r.Value)
        .ToList();
}

Lecture à partir d'octets (images en mémoire)

Avant — Dynamsoft :

using Dynamsoft.CVR;
using Dynamsoft.Core;
using Dynamsoft.DBR;

// Requires width, height, stride, and pixel format — low-level buffer API
public string ReadFromBuffer(CaptureVisionRouter router, byte[] rawPixels, int width, int height)
{
    var imageData = new ImageData
    {
        Bytes = rawPixels,
        Width = width,
        Height = height,
        Stride = width * 3, // assuming 24bpp RGB
        Format = EnumImagePixelFormat.IPF_RGB_888
    };

    CapturedResult result = router.Capture(imageData, PresetTemplate.PT_READ_BARCODES);
    return result.GetDecodedBarcodesResult()?.GetItems()?.FirstOrDefault()?.GetText();
}

Après — IronBarcode:

using IronBarCode;

// Pass PNG/JPEG/BMP bytes directly — no pixel format or stride calculation
public string ReadFromImageBytes(byte[] imageBytes)
{
    return BarcodeReader.Read(imageBytes)?.FirstOrDefault()?.Value;
}

Si votre application convertissait auparavant les octets d'image en un tampon de pixels bruts pour Dynamsoft, vous pouvez transmettre directement les octets d'image encodés d'origine (PNG, JPEG, BMP) à IronBarcode sans décodage préalable en pixels bruts.

Lecture de codes-barres PDF — Supprimer la boucle de rendu

Il s'agit généralement de la plus grande réduction de code lors de la migration. Supprimez l'intégralité de la boucle de rendu PdfiumViewer et remplacez-la par un seul appel.

Avant — Dynamsoft avec PdfiumViewer :

// Requires: Dynamsoft.DotNet.BarcodeReader.Bundle + PdfiumViewer + PdfiumViewer.Native.*
using Dynamsoft.CVR;
using Dynamsoft.DBR;
using PdfiumViewer;
using System.Drawing.Imaging;

public List<string> ReadBarcodesFromPdf(CaptureVisionRouter router, string pdfPath)
{
    var allBarcodes = new List<string>();

    using (var pdfDoc = PdfDocument.Load(pdfPath))
    {
        for (int page = 0; page < pdfDoc.PageCount; page++)
        {
            using var image = pdfDoc.Render(page, 300, 300, true);
            using var ms = new MemoryStream();
            image.Save(ms, ImageFormat.Png);

            CapturedResult result = router.Capture(ms.ToArray(),
                PresetTemplate.PT_READ_BARCODES);
            var items = result.GetDecodedBarcodesResult()?.GetItems();
            if (items != null)
            {
                foreach (var item in items)
                    allBarcodes.Add(item.GetText());
            }
        }
    }

    return allBarcodes;
}

Après — IronBarcode:

using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    return BarcodeReader.Read(pdfPath)
        .Select(r => r.Value)
        .ToList();
}

La boucle de page, le PdfDocument, l'étape de rendu à 300 DPI, le MemoryStream, et l'appel par page Capture disparaissent tous. IronBarcode gère les pages PDF en interne.

Si vous devez lire un PDF avec des options (pour les codes-barres denses ou difficiles) :

using IronBarCode;

public List<string> ReadBarcodesFromPdfAccurate(string pdfPath)
{
    var options = new BarcodeReaderOptions
    {
        Speed = ReadingSpeed.Balanced,
        ExpectMultipleBarcodes = true
    };

    return BarcodeReader.Read(pdfPath, options)
        .Select(r => r.Value)
        .ToList();
}

Déploiement hors ligne / isolé du réseau

Si votre code actuel inclut le modèle de licence hors ligne, supprimez-le entièrement :

Avant — Licence hors ligne Dynamsoft :

using Dynamsoft.License;
using Dynamsoft.Core;

// Dynamsoft offline: fetch license bundle on a connected machine, persist it,
// then replay it on the offline machine via InitLicenseFromLicenseContent.
int errorCode = LicenseManager.InitLicenseFromLicenseContent(
    licenseContent,
    out string errorMsg);

if (errorCode != (int)EnumErrorCode.EC_OK)
    throw new InvalidOperationException($"Offline license failed: {errorMsg}");

Après — IronBarcode:

// Remove all of the above. Replace with:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

Aucun bundle de contenu de licence à récupérer et rafraîchir. Aucune étape de bootstrap de machine connectée. La clé est validée localement.

Configuration Docker

Si vous aviez précédemment des règles réseau d'e-régress ou une configuration de proxy pour autoriser HTTPS sortant vers les points de terminaison de licence de Dynamsoft :

# Before: Docker or Kubernetes egress policy
# Required: Allow outbound HTTPS to Dynamsoft licence endpoints

# After: Remove that egress rule.
# IronBarcode does not require outbound network access for license validation.

# Set license via environment variable
env:
  - name: IRONBARCODE_KEY
    valueFrom:
      secretKeyRef:
        name: ironbarcode-license
        key: key
Text

Nettoyage de la gestion des instances

Dynamsoft utilise une API basée sur des instances construite autour de CaptureVisionRouter. Si votre code crée des instances de routeur dans les classes de service, les initialiseurs de champs, ou les enregistrements DI, tout cela disparaît :

Avant — Gestion des instances Dynamsoft :

using Dynamsoft.CVR;
using Dynamsoft.DBR;
using Dynamsoft.License;
using Dynamsoft.Core;

public class BarcodeService : IDisposable
{
    private readonly CaptureVisionRouter _router;

    public BarcodeService()
    {
        int errorCode = LicenseManager.InitLicense("KEY", out string errorMsg);
        if (errorCode != (int)EnumErrorCode.EC_OK)
            throw new InvalidOperationException(errorMsg);

        _router = new CaptureVisionRouter();

        var settings = _router.GetSimplifiedSettings(PresetTemplate.PT_READ_BARCODES);
        settings.BarcodeSettings.ExpectedBarcodesCount = 0;
        _router.UpdateSettings(PresetTemplate.PT_READ_BARCODES, settings);
    }

    public string[] ReadFile(string path)
    {
        CapturedResult result = _router.Capture(path, PresetTemplate.PT_READ_BARCODES);
        var items = result.GetDecodedBarcodesResult()?.GetItems();
        return items?.Select(i => i.GetText()).ToArray() ?? Array.Empty<string>();
    }

    public void Dispose()
    {
        _router?.Dispose();
    }
}

Après — API statique IronBarcode :

// NuGet: dotnet add package BarCode
using IronBarCode;

public class BarcodeService
{
    // No constructor initialization — license set once at app startup
    // No Dispose — no instance to clean up

    public string[] ReadFile(string path)
    {
        var options = new BarcodeReaderOptions { ExpectMultipleBarcodes = true };
        return BarcodeReader.Read(path, options)
            .Select(r => r.Value)
            .ToArray();
    }
}

La classe perd son constructeur, son implémentation IDisposable, et son champ _router. Si ce service était enregistré dans DI en tant que service singleton ou scoped pour gérer le cycle de vie du router, cet enregistrement peut être simplifié ou le service peut devenir un ensemble de méthodes statiques.

Cartographie de la vitesse de lecture et du délai d'attente

Dynamsoft utilise un Timeout en millisecondes optimisé pour les taux de trame de caméra. IronBarcode utilise un enum ReadingSpeed :

Paramètres Dynamsoftéquivalent IronBarcode
settings.Timeout = 100 (pipeline de caméra)Speed = ReadingSpeed.Faster
Délai d'attente faible (prioriser la vitesse)Speed = ReadingSpeed.Balanced
Délai d'attente plus long (privilégier la précision)Speed = ReadingSpeed.Detailed
Précision maximale, sans contrainte de tempsSpeed = ReadingSpeed.ExtremeDetail

Pour la plupart des flux de travail de traitement de documents où le débit est plus important que le temps de réponse inférieur à 100 ms, ReadingSpeed.Balanced est le bon choix par défaut :

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

Problèmes de migration courants

BarcodeResultItem.GetText() vs result.Value

L'accesseur change d'une méthode à une propriété :

// Before
string value = item.GetText();

// After
string value = result.Value;

BarcodeResultItem.GetFormatString() vs result.Format

Dynamsoft renvoie le format sous forme de chaîne via GetFormatString(). IronBarcode l'expose sous forme de enum BarcodeEncoding sur result.Format :

// Before
if (item.GetFormatString() == "QR_CODE")
    Console.WriteLine("Found QR code");

// After
if (result.Format == BarcodeEncoding.QRCode)
    Console.WriteLine("Found QR code");

// For logging without enum comparison — .ToString() works on both
Console.WriteLine($"Format: {result.Format}");

Résultats nuls vs Collection vide

Le GetDecodedBarcodesResult() de Dynamsoft peut renvoyer null lorsqu'aucun code-barres n'est trouvé. IronBarcode renvoie une collection vide. Mise à jour des vérifications nulles :

// Before: null check required
CapturedResult result = router.Capture(path, PresetTemplate.PT_READ_BARCODES);
var items = result.GetDecodedBarcodesResult()?.GetItems();
if (items != null && items.Length > 0)
    Process(items[0].GetText());

// After: null-safe but also correct to check Count
var results = BarcodeReader.Read(path);
if (results.Any())
    Process(results.First().Value);

SimplifiedCaptureVisionSettings to BarcodeReaderOptions

Le schéma GetSimplifiedSettings / UpdateSettings devient BarcodeReaderOptions passé à Read :

// Before
var settings = router.GetSimplifiedSettings(PresetTemplate.PT_READ_BARCODES);
settings.BarcodeSettings.ExpectedBarcodesCount = 0;
settings.Timeout = 500;
router.UpdateSettings(PresetTemplate.PT_READ_BARCODES, settings);
var result = router.Capture(path, PresetTemplate.PT_READ_BARCODES);

// After
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read(path, options);

Liste de contrôle de la migration

Exécutez ces recherches pour trouver toutes les références Dynamsoft qui nécessitent une mise à jour :

grep -r "using Dynamsoft\." --include="*.cs" .
grep -r "LicenseManager.InitLicense\|EnumErrorCode\|EC_OK" --include="*.cs" .
grep -r "new CaptureVisionRouter\|router\.Capture\|PresetTemplate" --include="*.cs" .
grep -r "BarcodeResultItem\|GetDecodedBarcodesResult\|GetFormatString" --include="*.cs" .
grep -r "GetSimplifiedSettings\|UpdateSettings\|SimplifiedCaptureVisionSettings" --include="*.cs" .
grep -r "router\.Dispose\|InitLicenseFromLicenseContent" --include="*.cs" .
SHELL

Analysez chaque match :

  • using Dynamsoft.*using IronBarCode
  • LicenseManager.InitLicense(key, out errorMsg) + vérification d'erreur → IronBarCode.License.LicenseKey = "key"
  • new CaptureVisionRouter() → supprimer (API statique, aucune instance)
  • router.Capture(path, PresetTemplate.PT_READ_BARCODES)BarcodeReader.Read(path)
  • router.Capture(imageData, ...) (tampon de pixels brut) → BarcodeReader.Read(imageBytes)
  • Boucle de rendu PDF par page + router.Capture(pageBytes, ...)BarcodeReader.Read(pdfPath)
  • BarcodeResultItem.GetText()result.Value
  • BarcodeResultItem.GetFormatString()result.Format
  • GetSimplifiedSettings(...) + UpdateSettings(...)new BarcodeReaderOptions { ... }
  • router.Dispose() → supprimer
  • LicenseManager.InitLicenseFromLicenseContent(...) → supprimer entièrement
  • Supprimez les packages NuGet PdfiumViewer s'ils ont été ajoutés uniquement pour prendre en charge le traitement PDF avec Dynamsoft.
  • Supprimer les règles de sortie réseau Docker/Kubernetes pour les points de terminaison de licence Dynamsoft
  • Définissez la variable d'environnement IRONBARCODE_KEY dans la configuration de déploiement
Curtis Chau
Rédacteur technique

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.

...
Lire la suite

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise