Migrating from MessagingToolkit.Barcode to IronBarcode
MessagingToolkit.Barcode publicou sua versão final — versão 1.7.0.2 — em 2013 e não recebeu atualizações desde então. Este guia abrange todo o processo de migração para o IronBarcode: por que a migração é necessária, quais alterações são feitas no código e como verificar se a migração foi concluída. Este guia destina-se tanto a equipes que migram a funcionalidade de código de barras de forma isolada quanto a equipes que realizam uma atualização mais ampla do .NET Framework, para a qual o MessagingToolkit.Barcode é uma dependência essencial.
Por que migrar do MessagingToolkit.Barcode?
Bloqueador de compatibilidade de framework: MessagingToolkit.Barcode é compatível com o .NET Framework 3.5, 4.0 e 4.5. Não possui compatibilidade com o .NET Standard nem com o .NET Core . Quando qualquer arquivo de projeto que faça referência a este pacote estiver configurado para uma versão moderna do .NET Framework — .NET 6, .NET 7, .NET 8 ou .NET 9 — a operação de restauração do NuGet falha com um erro de compatibilidade de framework. A compilação não prossegue. Isto não é um aviso nem uma degradação em tempo de execução; Trata-se de uma falha em tempo de compilação que impede completamente a construção do projeto. A remoção do MessagingToolkit.Barcode é um pré-requisito para qualquer atualização do .NET Framework , e não uma etapa de limpeza opcional.
Vulnerabilidade à segurança: Passaram-se doze anos desde a última alteração no código. Qualquer vulnerabilidade descoberta após 2014 na lógica de análise de imagens da biblioteca, na sua implementação de decodificação derivada do ZXing ou nas suas dependências transitivas não possui correção, aviso ou mantenedor para contato. As ferramentas de verificação de segurança sinalizam o pacote como abandonado. Os padrões de conformidade — PCI DSS, HIPAA, SOC 2, ISO 27001 — exigem o gerenciamento ativo de patches em softwares de terceiros. Um pacote abandonado falha nessas auditorias por questões de processo, independentemente de uma CVE específica ter sido identificada.
Plataformas de destino descontinuadas: Os metadados do pacote NuGet listam o Silverlight 3, 4 e 5 como plataformas de destino; Os três foram descontinuados em 2021. Estão listados os Windows Phone 7.0, 7.5, 7.8 e 8.0; O suporte para essas plataformas terminou entre 2014 e 2017. A biblioteca nunca foi atualizada para ser compatível com nenhuma plataforma que sucedeu esses ambientes descontinuados.
Lacunas de Capacidade: MessagingToolkit.Barcode aceitava apenas entradas System.Drawing.Bitmap, que é apenas Windows no .NET 6 e posterior. O programa retornava um único resultado por chamada de decodificação, sem suporte para imagens com múltiplos códigos de barras. Não possuía capacidade de leitura de PDF — os aplicativos que precisavam ler códigos de barras de documentos PDF exigiam uma etapa de extração separada antes de acessar a biblioteca. A geração de saída retornou um Bitmap, exigindo uma importação System.Drawing.Imaging e impedindo a implantação multiplataforma.
O problema fundamental
MessagingToolkit.Barcode impõe uma dependência de System.Drawing e um fluxo de trabalho baseado em instância que é incompatível com o .NET moderno:
// MessagingToolkit.Barcode: only compiles on .NET Framework 4.5 or earlier
// System.Drawing.Bitmap throws PlatformNotSupportedException on Linux/.NET 6+
using MessagingToolkit.Barcode;
using System.Drawing;
var decoder = new BarcodeDecoder();
using (var bitmap = new Bitmap("barcode.png")) // Windows-only in .NET 6+
{
var result = decoder.Decode(bitmap); // Single result or null
if (result != null)
{
Console.WriteLine(result.Text);
}
}Imports MessagingToolkit.Barcode
Imports System.Drawing
Dim decoder As New BarcodeDecoder()
Using bitmap As New Bitmap("barcode.png") ' Windows-only in .NET 6+
Dim result = decoder.Decode(bitmap) ' Single result or Nothing
If result IsNot Nothing Then
Console.WriteLine(result.Text)
End If
End UsingIronBarcode remove completamente a dependência de System.Drawing e funciona identicamente no Windows, Linux, macOS e em contêineres Docker:
// IronBarcode: runs on .NET 6, 7, 8, 9 — Windows, Linux, macOS, Docker
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("barcode.png"); // Não Bitmap, no System.Drawing
foreach (var result in results)
{
Console.WriteLine(result.Value);
}
##IronBarcode vs MessagingToolkit.Barcode: Comparação de Recursos
| Recurso | MessagingToolkit.Barcode | IronBarcode |
|---|---|---|
| Última atualização | 2014 | 2026 (ativo) |
| Versão NuGet | 1.7.0.2 (final) | Atualizado regularmente. |
| Suporte para .NET 6 / 7 / 8 / 9 | Não | Sim |
| .NET Framework 4.6.2+ | Não | Sim |
| .NET Framework 3.5–4.5 | Sim | Não |
| Suporte ao .NET Core | Não | Sim |
| ASP.NET Core | Não | Sim |
| .NET MAUI | Não | Sim |
| Blazor | Não | Sim |
| Multiplataforma (Linux, macOS) | Não | Sim |
| Suporte a Docker/containers | Não | Sim |
| Tipos de entrada para leitura de código de barras | Somente bitmap | Caminho, fluxo, matriz de bytes, PDF |
| Leitura de código de barras em PDF | Não | Sim (nativo) |
| Vários códigos de barras por imagem | Não | Sim |
| Detecção automática de formato | Não | Sim |
| Formatos de saída para geração de código de barras | Somente bitmap | PNG, JPEG, SVG, PDF, matriz de bytes |
| Dependência de desenho do sistema | Obrigatório | None |
| atualizações de segurança | Nenhum desde 2014 | Patches regulares |
| Suporte comercial | None | Suporte profissional disponível |
| Resultado da auditoria de conformidade | Sinalizado como abandonado | Aprovado em auditorias padrão |
Guia de Início Rápido: Migração do MessagingToolkit.Barcode para o IronBarcode
Passo 1: Substitua o pacote NuGet
Remova o pacote MessagingToolkit.Barcode:
dotnet remove package MessagingToolkit.Barcode
Se o projeto fizer referência a MessagingToolkit.Barcode.dll diretamente através de uma entrada <HintPath> no arquivo .csproj, remova essa referência também.
Instale o IronBarcode:
dotnet add package IronBarcode
O IronBarcode é compatível com o .NET Framework 4.6.2 até o .NET 9. Ele é instalado como um pacote único com todas as dependências incluídas — nenhuma biblioteca gráfica separada ou referência ZXing é necessária.
Etapa 2: Atualizar Namespaces
Substitua o namespace MessagingToolkit pelo namespace IronBarcode em cada arquivo que referencia a biblioteca antiga:
// Remove this
using MessagingToolkit.Barcode;
using System.Drawing; // if used only for Bitmap input to MessagingToolkit
// Add this
using IronBarCode;Imports IronBarCodeArquivos que importaram System.Drawing apenas para o tipo Bitmap usado com MessagingToolkit.Barcode podem ter essa importação removida uma vez que o IronBarcode esteja em vigor.
Etapa 3: Inicializar a licença
Adicione a inicialização da licença uma vez no início da aplicação — em Program.cs, Startup.cs ou no ponto de entrada equivalente. É necessária uma chave de licença para uso em produção; A biblioteca opera em modo de avaliação sem um.
// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";' Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Exemplos de migração de código
Leitura de códigos de barras a partir de arquivos de imagem
A abordagem antiga exigia a construção de um Bitmap a partir do caminho do arquivo e passá-lo para uma instância BarcodeDecoder. O IronBarcode aceita o caminho do arquivo diretamente.
MessagingToolkit.Abordagem de código de barras:
using MessagingToolkit.Barcode;
using System.Drawing;
public string ReadBarcodeValue(string imagePath)
{
var decoder = new BarcodeDecoder();
using (var bitmap = new Bitmap(imagePath))
{
var result = decoder.Decode(bitmap);
return result?.Text;
}
}Imports MessagingToolkit.Barcode
Imports System.Drawing
Public Function ReadBarcodeValue(imagePath As String) As String
Dim decoder As New BarcodeDecoder()
Using bitmap As New Bitmap(imagePath)
Dim result = decoder.Decode(bitmap)
Return If(result IsNot Nothing, result.Text, Nothing)
End Using
End FunctionAbordagem do IronBarcode:
using IronBarCode;
public string ReadBarcodeValue(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value;
}Imports IronBarCode
Public Function ReadBarcodeValue(imagePath As String) As String
Dim results = BarcodeReader.Read(imagePath)
Return results.FirstOrDefault()?.Value
End FunctionA versão do IronBarcode remove a construção Bitmap e o padrão condicional nulo em um único objeto. BarcodeReader.Read() retorna uma coleção — uma coleção vazia quando nada é encontrado — então .FirstOrDefault() substitui a verificação de nulo no antigo valor de retorno de resultado único.
Acessando informações de formato a partir dos resultados
MessagingToolkit.Barcode expôs o formato detectado através de result.BarcodeFormat.IronBarcode expõe isso através de result.Format. Ambos são valores de enumeração no objeto de resultado, com nomes de tipo de enumeração diferentes.
MessagingToolkit.Abordagem de código de barras:
using MessagingToolkit.Barcode;
using System.Drawing;
var decoder = new BarcodeDecoder();
using (var bitmap = new Bitmap("barcode.png"))
{
var result = decoder.Decode(bitmap);
if (result != null)
{
Console.WriteLine($"Value: {result.Text}");
Console.WriteLine($"Format: {result.BarcodeFormat}");
}
}Imports MessagingToolkit.Barcode
Imports System.Drawing
Dim decoder As New BarcodeDecoder()
Using bitmap As New Bitmap("barcode.png")
Dim result = decoder.Decode(bitmap)
If result IsNot Nothing Then
Console.WriteLine($"Value: {result.Text}")
Console.WriteLine($"Format: {result.BarcodeFormat}")
End If
End UsingAbordagem do IronBarcode:
using IronBarCode;
var results = BarcodeReader.Read("barcode.png");
var first = results.FirstOrDefault();
if (first != null)
{
Console.WriteLine($"Value: {first.Value}");
Console.WriteLine($"Format: {first.Format}");
}Imports IronBarCode
Dim results = BarcodeReader.Read("barcode.png")
Dim first = results.FirstOrDefault()
If first IsNot Nothing Then
Console.WriteLine($"Value: {first.Value}")
Console.WriteLine($"Format: {first.Format}")
End IfO nome da propriedade muda de .Text para .Value e de .BarcodeFormat para .Format. O tipo enum muda de BarcodeFormat (MessagingToolkit) para BarcodeEncoding (IronBarcode), embora .Format.ToString() produza uma string comparável, legível por humanos, para exibição ou fins de registro.
Gerando Códigos de Barra
MessagingToolkit.Barcode usava um BarcodeEncoder baseado em instância com um formato de conjunto de propriedades antes de chamar .Encode().IronBarcode utiliza um método estático com o tipo de codificação como parâmetro.
MessagingToolkit.Abordagem de código de barras:
using MessagingToolkit.Barcode;
public void GenerateQrCode(string data, string outputPath)
{
var encoder = new BarcodeEncoder();
encoder.Format = BarcodeFormat.QrCode;
var bitmap = encoder.Encode(data);
bitmap.Save(outputPath);
}Imports MessagingToolkit.Barcode
Public Sub GenerateQrCode(data As String, outputPath As String)
Dim encoder As New BarcodeEncoder()
encoder.Format = BarcodeFormat.QrCode
Dim bitmap = encoder.Encode(data)
bitmap.Save(outputPath)
End SubAbordagem do IronBarcode:
using IronBarCode;
public void GenerateQrCode(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateQrCode(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
.SaveAsPng(outputPath)
End SubPara criar códigos de barras Code 128 e outros códigos de barras 1D , o mesmo padrão estático se aplica, porém com uma constante de codificação diferente:
// Code 128
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("code128.png");
// EAN-13
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("ean13.png");' Code 128
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.SaveAsPng("code128.png")
' EAN-13
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
.SaveAsPng("ean13.png")Atualizando a estrutura de destino
Após a remoção do MessagingToolkit.Barcode e a substituição de todas as referências, o framework de destino do arquivo de projeto poderá ser atualizado. Essa alteração estava bloqueada pela dependência antiga e só será possível após a sua remoção:
MessagingToolkit.Barcode Approach (arquivo de projeto):
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>
Abordagem IronBarcode(arquivo do projeto):
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
O IronBarcode é compatível com o .NET Framework 4.6.2 até o .NET 9, portanto, pode ser instalado antes da conclusão da atualização do framework. Isso permite que a migração seja feita em etapas: instale o IronBarcode juntamente com o MessagingToolkit.Barcode, substitua todas as ocorrências, verifique o novo código, remova o pacote antigo e, por fim, altere a estrutura de destino.
Leitura de códigos de barras em documentos PDF
O MessagingToolkit.Barcode não tinha suporte para PDF. A leitura de códigos de barras em um PDF exigia a extração de imagens de cada página por meio de uma biblioteca separada antes de chamar o decodificador de código de barras. O IronBarcode lê arquivos PDF diretamente, utilizando o mesmo método usado para imagens.
MessagingToolkit.Abordagem de código de barras:
// Not supported — required external PDF page extraction before decode
// Não equivalent exists in MessagingToolkit.Barcode
Abordagem do IronBarcode:
using IronBarCode;
// Read all barcodes from every page of a PDF document
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})");
}Imports IronBarCode
' Read all barcodes from every page of a PDF document
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})")
NextAplicações que processam documentos digitalizados, manifestos de remessa ou lotes de faturas com várias páginas ganham essa capacidade como parte da migração, sem necessidade de biblioteca ou configuração adicional.
Referência de mapeamento da API MessagingToolkit.Barcode para IronBarcode
| MessagingToolkit.Barcode | IronBarcode | Notas |
|---|---|---|
new BarcodeDecoder() | Estático — BarcodeReader.Read() | Nenhuma instância necessária |
barcodeReader.Decode(bitmap) | BarcodeReader.Read(path) | Aceita caminho, fluxo, matriz de bytes ou PDF. |
result.Text | result.Value | Propriedade renomeada |
result.BarcodeFormat | result.Format | Propriedade renomeada; tipo enum é BarcodeEncoding |
new BarcodeEncoder() | Estático — BarcodeWriter.CreateBarcode() | Nenhuma instância necessária |
barcodeWriter.Format = BarcodeFormat.QrCode | BarcodeEncoding.QRCode (parâmetro) | Formato passado como parâmetro, não como propriedade. |
barcodeWriter.Encode("data") retorna Bitmap | BarcodeWriter.CreateBarcode("data", BarcodeEncoding.QRCode) | Retorna um resultado fluente, não um Bitmap. |
bitmap.Save("path.png") | .SaveAsPng("path.png") | Método fluente no objeto de resultado |
BarcodeFormat.QrCode | BarcodeEncoding.QRCode | O namespace e o valor da enumeração foram renomeados. |
BarcodeFormat.Code128 | BarcodeEncoding.Code128 | Mesmo nome simbólico, espaço de nomes diferente |
BarcodeFormat.Ean13 | BarcodeEncoding.EAN13 | A capitalização difere |
| Retorna nulo se não for encontrado. | Retorna uma coleção vazia | Verifique .Any() ou .FirstOrDefault() |
| Entrada somente de bitmap | Caminho, fluxo, matriz de bytes, PDF | Não é necessário nenhum desenho do sistema. |
| Somente para o.NET Framework 3.5–4.5 | .NET 4.6.2 até .NET 9 | Suporte completo para .NET moderno |
Problemas e soluções comuns em migrações
Problema 1: Namespace não encontrado após atualização do pacote
Problema: Após remover MessagingToolkit.Barcode e adicionar IronBarcode, a compilação falha com CS0246: The type or namespace name 'BarcodeDecoder' could not be found.
Solução: O antigo namespace using MessagingToolkit.Barcode; deve ser substituído por using IronBarCode; (note o C maiúsculo) em todos os arquivos que referenciam a biblioteca antiga. Uma busca em todo o projeto pela string de namespace antiga localizará todos os arquivos afetados:
grep -r "using MessagingToolkit.Barcode" --include="*.cs" .
grep -r "BarcodeDecoder\|BarcodeEncoder" --include="*.cs" .
Problema 2: Ambiguidade do Leitor de Código de Barras entre Namespaces
Problema: Se um projeto referenciar tanto MessagingToolkit.Barcode quanto IronBarcode durante uma migração escalonada, BarcodeReader pode ser ambíguo entre os dois namespaces.
Solução: Qualificar explicitamente a referência durante o período de transição:
// Use the fully qualified name while both packages are installed
var results = IronBarCode.BarcodeReader.Read("barcode.png");Imports IronBarCode
Dim results = BarcodeReader.Read("barcode.png")Uma vez que todas as referências a MessagingToolkit.Barcode tenham sido substituídas e o pacote antigo removido, o qualificador pode ser eliminado e a diretiva using IronBarCode; é suficiente.
Problema 3: Framework de destino ainda definido como net472 após a remoção do pacote
Problema: Após remover MessagingToolkit.Barcode e instalar IronBarcode, o arquivo do projeto ainda tem como alvo net472. Os avisos de compilação indicam que as APIs modernas do .NET não estão disponíveis.
Solução: Atualize o elemento <TargetFramework> no arquivo .csproj uma vez que a dependência tenha sido removida.IronBarcode suporta tanto net472 (via compatibilidade com .NET Framework 4.6.2) quanto alvos modernos. A alteração para net8.0 requer verificar que nenhuma outra dependência legada permaneça no projeto:
<!-- Update this line in the .csproj file -->
<TargetFramework>net8.0</TargetFramework>
Execute dotnet build após a alteração para identificar qualquer dependência legada remanescente que precise ser abordada.
MessagingToolkit.Lista de verificação para migração de código de barras
Tarefas pré-migração
Audite a base de código para identificar todos os locais que fazem referência a MessagingToolkit.Barcode:
# Find all using statements
grep -r "using MessagingToolkit.Barcode" --include="*.cs" .
# Find decoder instantiations
grep -r "BarcodeDecoder" --include="*.cs" .
# Find encoder instantiations
grep -r "BarcodeEncoder" --include="*.cs" .
# Find decode calls
grep -r "\.Decode(" --include="*.cs" .
# Find encode calls
grep -r "\.Encode(" --include="*.cs" .
# Find project file references
grep -r "MessagingToolkit" --include="*.csproj" .
grep -r "MessagingToolkit" --include="packages.config" .
Documente todos os arquivos que precisam de alterações. Observe quaisquer locais onde System.Drawing.Bitmap é usado como entrada para o decodificador — esses usos também precisarão ser atualizados.
Tarefas de atualização de código
- Execute
dotnet remove package MessagingToolkit.Barcodepara remover o pacote - Execute
dotnet add package IronBarcodepara instalar o IronBarcode - Adicione
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";no início da aplicação - Substitua todas as instruções
using MessagingToolkit.Barcode;porusing IronBarCode; - Substitua todos os padrões
new BarcodeDecoder()por chamadas estáticasBarcodeReader.Read() - Substitua todos os padrões
new BarcodeEncoder()por chamadas estáticasBarcodeWriter.CreateBarcode() - Atualize todas as referências
result.Textpararesult.Value - Atualize todas as referências
result.BarcodeFormatpararesult.Format - Atualize todos os padrões
barcodeWriter.Format = BarcodeFormat.Xpara passar a codificação como parâmetro - Substitua
bitmap.Save()por.SaveAsPng()ou o método de saída apropriado no resultado do IronBarcode - Remova importações
using System.Drawing;onde foram usadas apenas para entrada Bitmap no MessagingToolkit - Atualize
<TargetFramework>no arquivo do projeto se uma atualização de framework fizer parte da migração
Testes pós-migração
- Verifique se
dotnet buildcompleta com zero erros e zero referências a MessagingToolkit - Execute
grep -r "MessagingToolkit" --include="*.cs" .e confirme zero resultados - Teste a leitura de código de barras com imagens de códigos de barras reais do seu aplicativo e confirme que
.Valueretorna a string esperada - Teste a leitura de código de barras com imagens de múltiplos códigos de barras e confirme se todos os códigos de barras da coleção foram retornados.
- Testar a geração de código de barras e verificar se o arquivo de saída corresponde ao formato e à codificação esperados.
- Se a leitura de PDF for utilizada, faça um teste com um documento PDF representativo e verifique se os metadados do número da página estão corretos.
- Se a estrutura de destino foi alterada, execute o Suite completo de testes no novo ambiente de execução para identificar quaisquer outros problemas de compatibilidade.
Principais benefícios da migração para o IronBarcode
Atualizações de framework desbloqueadas: após a remoção do MessagingToolkit.Barcode, o framework de destino do arquivo de projeto pode ser atualizado para qualquer versão moderna do .NET . Essa única alteração permite o acesso às melhorias de desempenho do .NET 8, aos recursos da linguagem C# 12, aos padrões assíncronos nativos e a todo o ecossistema de pacotes NuGet que exigem o .NET Standard 2.0 ou posterior.
Implantação Multiplataforma: O pipeline de imagem interno do IronBarcode não depende de System.Drawing, que é apenas Windows no .NET 6 e posterior. Após a migração, aplicativos podem ser implantados em servidores Linux, ambientes de desenvolvimento macOS, contêineres Docker e runtimes de funções em nuvem sem encontrar PlatformNotSupportedException da biblioteca de código de barras.
Constatações de Conformidade Resolvidas: A IronBarcode recebe atualizações de segurança regulares por meio de um processo de manutenção documentado. Substituir uma dependência abandonada por uma que recebe manutenção ativa resolve as constatações de auditoria em conformidade com os padrões PCI DSS, HIPAA, SOC 2 e estruturas semelhantes que exigem o gerenciamento ativo de patches em bibliotecas de terceiros.
Suporte nativo a PDF: BarcodeReader.Read() aceita caminhos de arquivos PDF diretamente, eliminando a necessidade de uma etapa de extração de imagem PDF separada antes da decodificação do código de barras. Aplicações que processam documentos digitalizados ou lotes de faturas se beneficiam dessa funcionalidade sem a necessidade de adicionar novas bibliotecas ou etapas de pipeline.
Opções de Saída Expandida: Códigos de barras gerados estão disponíveis como PNG, JPEG, SVG, PDF ou strings codificadas em base64 através do objeto de resultado fluente retornado por BarcodeWriter.CreateBarcode(). Isso substitui o tipo de retorno System.Drawing.Bitmap do MessagingToolkit.Barcode, removendo a restrição de saída apenas para Windows e permitindo a incorporação direta em respostas web ou armazenamento em banco de dados.

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.