IRONSOFTWAREHOME
VIDEOS

Migrating from Dynamsoft Barcode Reader to IronBarcode

Curtis Chau
Curtis Chau
Updated: 1. August 2026

Die meisten Entwickler, die vom Dynamsoft Barcode Reader zu IronBarcode migrieren, gehören zu einer von zwei Gruppen: diejenigen, die Dynamsoft aufgrund seines Rufs gewählt haben und dann feststellten, dass die kamerazentrierte API nicht zu einem Dokumentverarbeitungs-Anwendungsfall passt, und diejenigen, die in luftgeschützten oder Docker-Umgebungen betrieben, wo die Lizenzserverabhängigkeit Produktionsvorfälle verursachte.

Wenn Sie zur ersten Gruppe gehören, entfernt die Migration die externe PDF-Rendering-Bibliothek, die seitenweise Rendering-Schleife und das Fehlercode-Lizenzmuster. Wenn Sie zur zweiten Gruppe gehören, entfernt die Migration den InitLicense Netzwerkanruf, das Offline-Lizenzinhaltsbündel und den Aktualisierungszyklus sowie die ausgehende Netzwerkrichtlinie aus Ihrer Docker- oder VPC-Konfiguration. In jedem Fall wird die Codebasis nach dieser Migration kürzer.

Dieses Handbuch ist ehrlich darüber, was Sie verlieren: Wenn Ihre Anwendung Echtzeit-Kamerarahmen verarbeitet, ist Dynamsofts Capture Vision-Bearbeitung für diese Arbeitslast abgestimmt und IronBarcode ist nicht der richtige Ersatz. Dieser Migrationsleitfaden ist für die serverseitige Dateiverarbeitung, Dokumentenworkflows und Umgebungen gedacht, in denen der Zugriff auf den Lizenzserver ein Problem darstellt.

Schritt 1: Tausche die NuGet Pakete aus

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

Falls Ihrem Projekt außerdem eine speziell für Dynamsoft hinzugefügte PDF-Rendering-Bibliothek (PdfiumViewer ist die gängigste) hinzugefügt wurde, kann diese ebenfalls entfernt werden:

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

Schritt 2: Lizenzinitialisierung ersetzen

Hier findet die unmittelbarste Vereinfachung statt. Das Dynamsoft-Muster erfordert eine Fehlercodeprüfung und Ausnahmebehandlung bei jedem Startvorgang:

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

Nach — IronBarcode:

// NuGet: dotnet add package BarCode
using IronBarCode;

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

In einer ASP.NET Core-Anwendung fügen Sie dies vor builder.Build() zu Program.cs hinzu:

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

In einer Docker- oder Kubernetes-Umgebung setzen Sie die IRONBARCODE_KEY Umgebungsvariable in Ihrem Bereitstellungsmanifest. Keine ausgehenden Netzwerkregeln erforderlich.

Schritt 3: Namespace-Importe ersetzen

Suchen und Ersetzen in allen Quelldateien:

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

Ersetzen Sie jedes Vorkommen:

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

// After
using IronBarCode;

Beispiele für die Code-Migration

Grundlegendes Lesen von Dateien

Die grundlegendste Operation – das Auslesen eines Barcodes aus einer Bilddatei.

Vorher — 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();
}

Nach — IronBarcode:

// NuGet: dotnet add package BarCode
using IronBarCode;

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

Die Router-Instanz ist weg. BarcodeReader.Read ist statisch. BarcodeResultItem.GetText() wird zu .Value. Die Null-Überprüfung von results ist mit LINQ sauberer.

Lesen mehrerer Barcodes

Vorher — 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;
}

Nach — 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();
}

Lesen von Bytes (In-Memory-Images)

Vorher — 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();
}

Nach — 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;
}

Wenn Ihre Anwendung zuvor Bildbytes in einen Rohpixelpuffer für Dynamsoft konvertiert hat, können Sie die ursprünglichen codierten Bildbytes (PNG, JPEG, BMP) direkt an IronBarcode übergeben, ohne sie vorher in Rohpixel zu decodieren.

PDF-Barcode-Lesen – Render-Schleife entfernen

Dies ist typischerweise die größte Codereduzierung bei der Migration. Entfernen Sie die gesamte PdfiumViewer-Rendering-Schleife und ersetzen Sie sie durch einen einzigen Aufruf.

Vorher — Dynamsoft mit 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;
}

Nach — IronBarcode:

using IronBarCode;

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

Die Seiten-Schleife, das PdfDocument, der 300 DPI-Render-Schritt, der MemoryStream und der pro-Seite-Capture-Aufruf verschwinden alle. IronBarcode verarbeitet PDF-Seiten intern.

Falls Sie eine PDF-Datei mit Optionen lesen müssen (für dichte oder schwierige Barcodes):

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

Offline-/Air-Gapped-Bereitstellung

Falls Ihr aktueller Code das Offline-Lizenzierungsmuster enthält, entfernen Sie es vollständig:

Vorher — Dynamsoft Offline-Lizenz:

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

Nach — IronBarcode:

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

Kein Lizenz-Inhaltsbündel zum Abrufen und Aktualisieren. Kein verbundenes Maschinen-Bootstrap. Der Schlüssel wird lokal validiert.

Docker-Konfiguration

Wenn Sie zuvor ausgehende Netzwerkregeln oder Proxy-Konfigurationen hatten, um ausgehendes HTTPS zu Dynamsofts Lizenzendpunkten zuzulassen:

# 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

Bereinigung der Instanzverwaltung

Dynamsoft verwendet eine instanzbasierte API, die um CaptureVisionRouter aufgebaut ist. Wenn Ihr Code Router-Instanzen in Dienstklassen, Feldinitialisierern oder DI-Registrierungen erstellt, verschwindet dies alles:

Vorher — Dynamsoft-Instanzverwaltung:

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

Nachher — IronBarcode statische API:

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

Die Klasse verliert ihren Konstruktor, ihre IDisposable Implementierung und ihr _router Feld. Wenn dieser Dienst in DI als Singleton oder Bereichs-Dienst registriert wurde, um den Router-Zyklus zu verwalten, kann jene Registrierung vereinfacht werden oder der Dienst kann zu einer Reihe statischer Methoden werden.

Lesegeschwindigkeit vs. Timeout-Zuordnung

Dynamsoft verwendet einen Timeout in Millisekunden, der für Kamerabildraten optimiert ist. IronBarcode verwendet einen ReadingSpeed enum:

Dynamsoft-EinstellungIronBarcode Äquivalent
settings.Timeout = 100 (Kamerapipeline)Speed = ReadingSpeed.Faster
Niedriges Timeout (Geschwindigkeit priorisieren)Speed = ReadingSpeed.Balanced
Höheres Timeout (Genauigkeit priorisieren)Speed = ReadingSpeed.Detailed
Höchste Genauigkeit, kein ZeitdruckSpeed = ReadingSpeed.ExtremeDetail

Für die meisten Dokumentenverarbeitungs-Workflows, bei denen der Durchsatz wichtiger ist als eine Antwortzeit unter 100 ms, ist ReadingSpeed.Balanced die richtige Voreinstellung:

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

Gängige Probleme bei der Migration

BarcodeResultItem.GetText() vs result.Value

Der Zugriff ändert sich von einer Methode in eine Eigenschaft:

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

// After
string value = result.Value;

BarcodeResultItem.GetFormatString() vs result.Format

Dynamsoft gibt das Format als String über GetFormatString() zurück. IronBarcode stellt es als BarcodeEncoding enum auf result.Format bereit:

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

Null-Ergebnisse vs. leere Sammlung

Dynamsoft's GetDecodedBarcodesResult() kann null zurückgeben, wenn keine Barcodes gefunden werden. IronBarcode gibt eine leere Sammlung zurück. Nullprüfungen aktualisieren:

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

VereinfachteCaptureVisionSettings zu BarcodeReaderOptions

Das GetSimplifiedSettings / UpdateSettings Muster wird zu BarcodeReaderOptions, das an Read übergeben wird:

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

Migrations-Checkliste

Führen Sie diese Suchvorgänge durch, um alle Dynamsoft-Referenzen zu finden, die aktualisiert werden müssen:

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

Arbeiten Sie jedes Spiel einzeln durch:

  • using Dynamsoft.*using IronBarCode
  • LicenseManager.InitLicense(key, out errorMsg) + Fehlerüberprüfung → IronBarCode.License.LicenseKey = "key"
  • new CaptureVisionRouter() → entfernen (statische API, keine Instanz)
  • router.Capture(path, PresetTemplate.PT_READ_BARCODES)BarcodeReader.Read(path)
  • router.Capture(imageData, ...) (roher Pixelpuffer) → BarcodeReader.Read(imageBytes)
  • Pro-Seite PDF-Render-Schleife + router.Capture(pageBytes, ...)BarcodeReader.Read(pdfPath)
  • BarcodeResultItem.GetText()result.Value
  • BarcodeResultItem.GetFormatString()result.Format
  • GetSimplifiedSettings(...) + UpdateSettings(...)new BarcodeReaderOptions { ... }
  • router.Dispose() → entfernen
  • LicenseManager.InitLicenseFromLicenseContent(...) → vollständig entfernen
  • Entfernen Sie die PdfiumViewer NuGet -Pakete, falls diese nur zur Unterstützung der Dynamsoft-PDF-Verarbeitung hinzugefügt wurden.
  • Entfernen Sie Docker/Kubernetes Netzwerk-Ausgangsregeln für Dynamsofts Lizenzendpunkte
  • Setzen Sie die IRONBARCODE_KEY Umgebungsvariable in der Bereitstellungskonfiguration
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.