IRONSOFTWAREHOME
VÍDEOS

Migrating from Dynamsoft Barcode Reader to IronBarcode

Curtis Chau
Curtis Chau
Updated: 1 de agosto de 2026

A maioria dos desenvolvedores que migra do Dynamsoft Barcode Reader para o IronBarcode se enquadra em um dos dois grupos: aqueles que escolheram Dynamsoft por sua reputação e depois descobriram que a API centrada na câmera não correspondia a um caso de uso de processamento de documentos, e aqueles que operam em ambientes isolados ou em Docker onde a dependência do servidor de licença causou incidentes de produção.

Se você pertence ao primeiro grupo, a migração remove a biblioteca externa de renderização de PDF, o loop de renderização por página e o padrão de licenciamento por código de erro. Se você está no segundo grupo, a migração remove a chamada de rede InitLicense, o pacote de conteúdo da licença offline e o ciclo de atualização, e a política de rede de saída da sua configuração Docker ou VPC. De qualquer forma, a base de código fica mais curta após essa migração.

Este guia é honesto sobre o que você perde: se seu aplicativo processa quadros de câmera em tempo real, o pipeline Capture Vision do Dynamsoft é ajustado para esse tipo de carga de trabalho e o IronBarcode não é o substituto adequado. Este guia de migração destina-se ao processamento de arquivos no servidor, fluxos de trabalho de documentos e ambientes onde o acesso ao servidor de licenças representa um problema.

Passo 1: Trocar os pacotes NuGet

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

Se o seu projeto também tiver uma biblioteca de renderização de PDF adicionada especificamente para o Dynamsoft (PdfiumViewer é a mais comum), ela também pode ser removida:

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

Etapa 2: Substituir a inicialização da licença

É aqui que ocorre a simplificação mais imediata. O padrão Dynamsoft exige uma verificação de código de erro e tratamento de exceções em cada inicialização:

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

Depois — IronBarcode:

// NuGet: dotnet add package BarCode
using IronBarCode;

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

Em uma aplicação ASP.NET Core, adicione isto a Program.cs antes de builder.Build():

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

Em um ambiente Docker ou Kubernetes, defina a variável de ambiente IRONBARCODE_KEY em seu manifesto de implantação. Nenhuma regra de rede de saída é necessária.

Etapa 3: Substitua as importações de namespace

Localizar e substituir em todos os arquivos de origem:

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

Substitua cada ocorrência:

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

// After
using IronBarCode;

Exemplos de migração de código

Leitura básica de arquivos

A operação mais fundamental — ler um código de barras a partir de um arquivo de imagem.

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

Depois — IronBarcode:

// NuGet: dotnet add package BarCode
using IronBarCode;

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

A instância do roteador desapareceu. BarcodeReader.Read é estático. BarcodeResultItem.GetText() torna-se .Value. A verificação nula em results é mais limpa com LINQ.

Leitura de múltiplos 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;
}

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

Leitura de bytes (imagens na memória)

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

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

Se o seu aplicativo anteriormente convertia bytes de imagem em um buffer de pixels brutos para o Dynamsoft, você pode passar os bytes de imagem codificados originais (PNG, JPEG, BMP) diretamente para o IronBarcode sem precisar decodificá-los para pixels brutos primeiro.

Leitura de código de barras em PDF — Remova o loop de renderização

Essa é normalmente a maior redução de código na migração. Remova todo o loop de renderização do PdfiumViewer e substitua-o por uma única chamada.

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

Depois — IronBarcode:

using IronBarCode;

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

O loop de páginas, o PdfDocument, o passo de renderização de 300 DPI, o MemoryStream, e a chamada Capture por página desaparecem. O IronBarcode processa páginas PDF internamente.

Se você precisar ler um PDF com opções (para códigos de barras densos ou complexos):

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

Implantação offline/isolada da internet

Se o seu código atual inclui o padrão de licenciamento offline, remova-o completamente:

Antes — Licença offline da 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}");

Depois — IronBarcode:

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

Nenhum pacote de conteúdo de licença para buscar e atualizar. Nenhum passo de bootstrap de máquina conectada. A chave valida localmente.

Configuração do Docker

Se você anteriormente tinha regras de egressão de rede ou configuração de proxy para permitir HTTPS de saída para os pontos de licença do 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

Limpeza do gerenciamento de instâncias

Dynamsoft usa uma API baseada em instância construída em torno de CaptureVisionRouter. Se seu código cria instâncias de roteador em classes de serviço, inicializadores de campo, ou registros DI, tudo isso desaparece:

Antes — Gerenciamento de instâncias do 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();
    }
}

Após — API estática do 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();
    }
}

A classe perde seu construtor, sua implementação IDisposable, e seu campo _router. Se este serviço estava registrado em DI como um serviço singleton ou com escopo para gerenciar o ciclo de vida do roteador, esse registro pode ser simplificado ou o serviço pode se tornar um conjunto de métodos estáticos.

Mapeamento de velocidade de leitura versus tempo limite

Dynamsoft usa um Timeout em milissegundos otimizado para taxas de quadros de câmera. IronBarcode usa um enum ReadingSpeed:

Configuração DynamsoftEquivalente ao IronBarcode
settings.Timeout = 100 (caminho da câmera)Speed = ReadingSpeed.Faster
Tempo limite baixo (priorizar a velocidade)Speed = ReadingSpeed.Balanced
Tempo limite maior (priorizar a precisão)Speed = ReadingSpeed.Detailed
Máxima precisão, sem pressão de tempo.Speed = ReadingSpeed.ExtremeDetail

Para a maioria dos fluxos de trabalho de processamento de documentos onde a vazão é mais importante que o tempo de resposta inferior a 100ms, ReadingSpeed.Balanced é o padrão correto:

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

Problemas comuns de migração

BarcodeResultItem.GetText() vs result.Value

O acessador muda de um método para uma propriedade:

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

// After
string value = result.Value;

BarcodeResultItem.GetFormatString() vs result.Format

Dynamsoft retorna o formato como uma string via GetFormatString(). IronBarcode o expõe como um enum BarcodeEncoding em 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 vs. Coleção vazia

O GetDecodedBarcodesResult() da Dynamsoft pode retornar null quando não forem encontrados códigos de barras. IronBarcode retorna uma coleção vazia. Atualizar verificações de valores nulos:

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

O padrão GetSimplifiedSettings / UpdateSettings torna-se BarcodeReaderOptions passado para 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 verificação para migração

Execute estas pesquisas para encontrar todas as referências do Dynamsoft que precisam ser atualizadas:

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

Analise cada partida:

  • using Dynamsoft.*using IronBarCode
  • LicenseManager.InitLicense(key, out errorMsg) + verificação de erro → IronBarCode.License.LicenseKey = "key"
  • new CaptureVisionRouter() → remover (API estática, sem instância)
  • router.Capture(path, PresetTemplate.PT_READ_BARCODES)BarcodeReader.Read(path)
  • router.Capture(imageData, ...) (buffer de pixel cru) → BarcodeReader.Read(imageBytes)
  • Loop de renderização 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() → remover
  • LicenseManager.InitLicenseFromLicenseContent(...) → remover completamente
  • Remova os pacotes NuGet do PdfiumViewer se eles foram adicionados apenas para dar suporte ao processamento de PDFs da Dynamsoft.
  • Remova as regras de egressão de rede Docker/Kubernetes para os pontos de licença do Dynamsoft
  • Defina a variável de ambiente IRONBARCODE_KEY na configuração de implantação
Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.

...
Leia mais

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua demonstração ao vivo gratuita.
Booking Badge

Aprovado por milhões de engenheiros em todo o mundo.

Logotipos dos clientes da Iron Software
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.