IRONSOFTWAREHOME
VIDEOS

Migrating from Dynamsoft Barcode Reader to IronBarcode

Curtis Chau
Curtis Chau
Updated: 1 de agosto de 2026

La mayoría de los desarrolladores que migran de Dynamsoft Barcode Reader a IronBarcode caen en uno de dos grupos: aquellos que eligieron Dynamsoft por su reputación y luego descubrieron que la API centrada en la cámara no coincidía con un caso de uso de procesamiento de documentos, y aquellos que se ejecutan en entornos aislados o Docker donde la dependencia del servidor de licencias causó incidentes de producción.

Si perteneces al primer grupo, la migración elimina la biblioteca externa de renderizado de PDF, el bucle de renderizado por página y el patrón de licencia de código de error. Si estás en el segundo grupo, la migración elimina la llamada de red InitLicense, el paquete de contenido de la licencia offline y el ciclo de actualización, y la política de red saliente de tu configuración de Docker o VPC. En cualquier caso, el código fuente se acorta tras esta migración.

Esta guía es honesta sobre lo que pierdes: si tu aplicación procesa cuadros de cámara en tiempo real, la tubería de Capture Vision de Dynamsoft está optimizada para esa carga de trabajo y IronBarcode no es el reemplazo adecuado. Esta guía de migración está destinada al procesamiento de archivos del lado del servidor, flujos de trabajo de documentos y entornos donde el acceso al servidor de licencias supone un problema.

Paso 1: Intercambiar los paquetes NuGet

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

Si su proyecto también tiene una biblioteca de renderizado de PDF agregada específicamente para Dynamsoft (PdfiumViewer es la más común), también puede eliminarla:

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

Paso 2: Reemplazar la inicialización de la licencia

Aquí es donde se produce la simplificación más inmediata. El patrón Dynamsoft requiere una comprobación del código de error y un manejo de excepciones en cada inicio:

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

Después — IronBarcode:

// NuGet: dotnet add package BarCode
using IronBarCode;

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

En una aplicación ASP.NET Core, agrega esto a Program.cs antes de builder.Build():

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

En un entorno Docker o Kubernetes, establece la variable de entorno IRONBARCODE_KEY en tu manifiesto de implementación. No se requieren reglas de red saliente.

Paso 3: Reemplazar las importaciones de espacios de nombres

Buscar y reemplazar en todos los archivos fuente:

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

Reemplazar cada aparición:

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

// After
using IronBarCode;

Ejemplos de migración de código

Lectura básica de archivos

La operación más fundamental: leer un código de barras a partir de un archivo de imagen.

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

Después — IronBarcode:

// NuGet: dotnet add package BarCode
using IronBarCode;

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

La instancia del router ha desaparecido. BarcodeReader.Read es estático. BarcodeResultItem.GetText() se convierte en .Value. La comprobación de nulidad en results es más limpia con LINQ.

Lectura de múltiples códigos de barras

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

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

Lectura desde bytes (imágenes en memoria)

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

Despué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 su aplicación convertía previamente los bytes de la imagen en un búfer de píxeles sin procesar para Dynamsoft, puede pasar los bytes de la imagen codificada original (PNG, JPEG, BMP) directamente a IronBarcode sin decodificarlos primero a píxeles sin procesar.

Lectura de códigos de barras PDF: Eliminar el bucle de renderizado

Esta suele ser la mayor reducción de código en la migración. Elimine todo el bucle de renderizado de PdfiumViewer y reemplácelo con una sola llamada.

Antes — Dynamsoft con 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;
}

Después — IronBarcode:

using IronBarCode;

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

El bucle de página, el PdfDocument, el paso de renderizado a 300 DPI, el MemoryStream y la llamada Capture por página desaparecen. IronBarcode gestiona internamente las páginas PDF.

Si necesita leer un PDF con opciones (para códigos de barras densos o difíciles):

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

Implementación sin conexión / aislada de la red

Si su código actual incluye el patrón de licencia sin conexión, elimínelo por completo:

Antes — Licencia sin conexión de 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}");

Después — IronBarcode:

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

No hay paquete de contenido de licencia para buscar y actualizar. No hay paso de inicialización de máquina conectada. La clave se valida localmente.

Configuración de Docker

Si anteriormente tenías reglas de egreso de red o configuración de proxy para permitir HTTPS saliente a los puntos finales de licencia 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

Limpieza de la administración de instancias

Dynamsoft utiliza una API basada en instancias construida alrededor de CaptureVisionRouter. Si tu código crea instancias de enrutadores en clases de servicio, inicializadores de campo o registros DI, todo eso desaparece:

Antes — Gestión de instancias de 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();
    }
}

Después — API estática de 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 clase pierde su constructor, su implementación de IDisposable y su campo _router. Si este servicio estaba registrado en DI como un servicio singleton o con alcance para gestionar el ciclo de vida del enrutador, ese registro puede simplificarse o el servicio puede convertirse en un conjunto de métodos estáticos.

Mapeo de velocidad de lectura frente a tiempo de espera

Dynamsoft utiliza un Timeout en milisegundos optimizado para las tasas de fotogramas de las cámaras. IronBarcode utiliza un ReadingSpeed enum:

Configuración de DynamsoftEquivalente de IronBarcode
settings.Timeout = 100 (pipeline de cámara)Speed = ReadingSpeed.Faster
Tiempo de espera bajo (priorizar la velocidad)Speed = ReadingSpeed.Balanced
Mayor tiempo de espera (priorizar la precisión)Speed = ReadingSpeed.Detailed
Máxima precisión, sin presión de tiempo.Speed = ReadingSpeed.ExtremeDetail

Para la mayoría de los flujos de trabajo de procesamiento de documentos donde el rendimiento es más importante que el tiempo de respuesta inferior a 100ms, ReadingSpeed.Balanced es la opción predeterminada adecuada:

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

Problemas comunes de migración

BarcodeResultItem.GetText() vs result.Value

El accesor cambia de un método a una propiedad:

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

// After
string value = result.Value;

BarcodeResultItem.GetFormatString() vs result.Format

Dynamsoft devuelve el formato como una cadena a través de GetFormatString(). IronBarcode lo expone como un BarcodeEncoding enum en 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}");

Resultados nulos frente a colección vacía

El GetDecodedBarcodesResult() de Dynamsoft puede devolver null cuando no se encuentran códigos de barras. IronBarcode devuelve una colección vacía. Actualizar comprobaciones nulas:

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

El patrón GetSimplifiedSettings / UpdateSettings se convierte en BarcodeReaderOptions pasado a 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);

Lista de comprobación de la migración

Ejecute estas búsquedas para encontrar todas las referencias de Dynamsoft que necesitan actualizarse:

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

Analiza cada partido:

  • using Dynamsoft.*using IronBarCode
  • LicenseManager.InitLicense(key, out errorMsg) + comprobación de error → IronBarCode.License.LicenseKey = "key"
  • new CaptureVisionRouter() → eliminar (API estática, no instancia)
  • router.Capture(path, PresetTemplate.PT_READ_BARCODES)BarcodeReader.Read(path)
  • router.Capture(imageData, ...) (búfer de píxeles sin procesar) → BarcodeReader.Read(imageBytes)
  • Bucle de renderización de PDF por página + router.Capture(pageBytes, ...)BarcodeReader.Read(pdfPath)
  • BarcodeResultItem.GetText()result.Value
  • BarcodeResultItem.GetFormatString()result.Format
  • GetSimplifiedSettings(...) + UpdateSettings(...)new BarcodeReaderOptions { ... }
  • router.Dispose() → eliminar
  • LicenseManager.InitLicenseFromLicenseContent(...) → eliminar completamente
  • Elimine los paquetes NuGet de PdfiumViewer si se agregaron únicamente para admitir el procesamiento de PDF de Dynamsoft.
  • Elimina las reglas de egreso de red de Docker/Kubernetes para los puntos finales de licencia de Dynamsoft
  • Establecer la variable de entorno IRONBARCODE_KEY en la configuración de implementación
Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien estructurados y visualmente atractivos.

...
Leer más

Artículos Relacionados

Key in blue circle

Obtenga su clave de prueba gratuita de 30 días al instante.

Your trial license will be sent to your email address

Sin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.

bullet_checkedNo se requiere tarjeta de crédito ni creación de cuentaSin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Reserve su Demostración en Vivo gratuita
Booking Badge

Confiado por millones de ingenieros en todo el mundo

Logos de clientes de Iron Software
Obtén tu Consulta Sin Compromiso
Completa el formulario a continuación o envía un correo a sales@ironsoftware.com
Tus detalles siempre serán mantenidos confidenciales.
Confiado por millones de ingenieros en todo el mundo
Logos de clientes de Iron Software
Obtenga su Clave de Prueba de 30 días gratis al instante.
No se requiere tarjeta de crédito ni creación de cuenta