Saltar al pie de página
VIDEOS

Cómo crear Códigos de Barras como Flujos en C# Usando IronBarcode

Transición de Código de barras4NETa IronBarcode

Esta guía de migración explica cómo eliminar una dependencia de Código de barras4NETy reemplazarla por IronBarcode, con instrucciones paso a paso, comparaciones de código y ejemplos prácticos para desarrolladores .NET que realicen esta transición. Código de barras4NETllegó al final de su ciclo de vida sin un anuncio formal: se dejaron de vender nuevas licencias, nunca se publicó ningún paquete NuGet y la biblioteca se ejecuta exclusivamente en .NET Framework. Esta guía es práctica y específica: abarca cómo eliminar la referencia a la DLL, instalar IronBarcode a través de NuGet y convertir el código de generación. También abarca las funciones de lectura y de PDF que estarán disponibles después de la migración, las cuales no estaban disponibles en absoluto a través de Barcode4NET.

¿Por qué migrar desde Barcode4NET?

Los equipos que migran desde Código de barras4NETinforman de estos desencadenantes constantes:

No hay nuevas licencias disponibles: Las licencias de Código de barras4NETya no se venden a través de ComponentSource ni de ningún otro canal. Si un desarrollador se une a un equipo que utiliza Barcode4NET, no existe ningún mecanismo para comprarle una licencia. Un contratista que se incorpore al proyecto o un segundo desarrollador que necesite trabajar en las funciones de código de barras no puede obtener una licencia legal bajo los términos del producto original.

No hay paquete NuGet : Esto no es un inconveniente menor, sino una incompatibilidad fundamental con los flujos de trabajo modernos de .NET . Todo desarrollador que clone el repositorio debe saber dónde se encuentra la DLL. Las canalizaciones de CI/CD deben configurarse manualmente para localizarlo. El comando dotnet restore no hace nada para resolverlo. La DLL se integra en el control de versiones o se mantiene en un repositorio de artefactos privado, lo que requiere un mantenimiento manual continuo en ambos casos.

Sin compatibilidad con .NET 5, 6, 7, 8 o 9: Código de barras4NETestá dirigido exclusivamente a .NET Framework . Cuando una organización actualiza su framework objetivo a net8.0, la compilación falla porque la biblioteca se compiló contra ensamblados de .NET Framework que ya no se referencian. No habrá ningún parche. Si el equipo necesita migrar a .NET moderno por motivos de rendimiento, para la implementación en Linux o Docker, o para obtener soporte a largo plazo de Microsoft, Código de barras4NETsupone un obstáculo insalvable.

Sin parches de seguridad: La biblioteca se encuentra congelada en el estado en que estaba cuando se detuvo su desarrollo. Cualquier problema de seguridad descubierto desde entonces permanece sin resolverse. No hay un sistema de seguimiento de incidencias, ni un responsable de mantenimiento con quien contactar, ni un proceso de respuesta del proveedor.

Sin correcciones de errores: si aparece un problema de representación con una variante de simbología en particular o un caso límite en las dimensiones del código de barras, no hay una solución. La biblioteca no se actualizará.

El problema fundamental

El momento más común para descubrir un problema es cuando un desarrollador actualiza el marco de trabajo de destino durante un proyecto de modernización de .NET . La compilación falla porque la DLL de Código de barras4NETse compiló con ensamblados de .NET Framework que ya no están disponibles en la nueva plataforma de destino. El problema no reside en la API de generación en sí, sino en la dependencia subyacente que impide el avance.

// Código de barras4NET— locked to .NET Framework, no NuGet package
// Requires manual DLL reference in every .csproj:
// <Reference Include="Barcode4NET">
//   <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
// </Reference>
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.Width = 300;
barcode.Height = 100;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
// Código de barras4NET— locked to .NET Framework, no NuGet package
// Requires manual DLL reference in every .csproj:
// <Reference Include="Barcode4NET">
//   <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
// </Reference>
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.Width = 300;
barcode.Height = 100;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
Imports Barcode4NET
Imports System.Drawing
Imports System.Drawing.Imaging

Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.Width = 300
barcode.Height = 100
Dim barcodeImage As Bitmap = barcode.GenerateBarcode()
barcodeImage.Save(outputPath, ImageFormat.Png)
$vbLabelText   $csharpLabel
// IronBarcode — NuGet package, .NET Framework 4.6.2 through .NET 9
// dotnet add package IronBarcode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
// IronBarcode — NuGet package, .NET Framework 4.6.2 through .NET 9
// dotnet add package IronBarcode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

IronBarcode vs Barcode4NET: Comparación de características

Característica Código de barras4NET IronBarcode
Paquete NuGet No — solo DLL manual Sí (IronBarcode)
Compatibilidad con .NET Framework Sí (solo para .NET Framework ) Sí (.NET Framework 4.6.2+)
Compatibilidad con .NET Core / .NET 5+ No Sí (.NET 5, 6, 7, 8, 9)
Compatibilidad con Linux/macOS No
Soporte para Docker No
Azure / AWS Lambda No
Generación de códigos de barras
Lectura/escaneo de códigos de barras No Sí (BarcodeReader.Read())
Lectura de códigos de barras PDF No Sí (nativo, sin biblioteca adicional)
Código QR con logotipo No Sí (AddBrandLogo())
API fluida y encadenable No
Mantenimiento activo No (fin de vida útil)
Nuevas licencias disponibles No Sí — Lite $749, Plus $1,499, Pro $2,999, Unlimited $5,999
parches de seguridad No
Integración de la canalización CI/CD Pasos para copiar manualmente una DLL Estándar dotnet restore

Inicio rápido: Migración de Código de barras4NETa IronBarcode

La migración puede comenzar inmediatamente con estos pasos básicos.

Paso 1: Sustituir el paquete NuGet

Barcode4NET nunca se distribuyó como un paquete NuGet, por lo que no hay comando dotnet remove package. Retíralo manualmente.

Elimine la DLL del control de versiones y prepare la eliminación:

git rm -r ThirdParty/Barcode4NET/
git rm -r ThirdParty/Barcode4NET/
SHELL

Elimina el elemento <Reference> de cada archivo .csproj. Busca en toda la solución para encontrar cada archivo que necesite una actualización:

grep -rl "Barcode4NET" --include="*.csproj" .
grep -rl "Barcode4NET" --include="*.csproj" .
SHELL

Elimina este elemento de cada archivo .csproj que lo contenga:

<Reference Include="Barcode4NET">
  <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
</Reference>
<Reference Include="Barcode4NET">
  <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
</Reference>
XML

Luego instala IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Ese único comando añade IronBarcode y resuelve todas las dependencias. Sin gestión de DLL, sin almacenamiento de artefactos, sin pasos de copia manual.

Paso 2: Actualizar los espacios de nombres

Reemplaza la antigua directiva using en la parte superior de cada archivo que usaba Barcode4NET:

// Before
using Barcode4NET;

// After
using IronBarCode;
// Before
using Barcode4NET;

// After
using IronBarCode;
Imports Barcode4NET

' After
Imports IronBarCode
$vbLabelText   $csharpLabel

Paso 3: Inicializar licencia

Agrega la inicialización de licencia al inicio de la aplicación — en Program.cs, Startup.cs, o donde sea que tu aplicación inicie:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Ejemplos de migración de código

Generación básica de etiquetas

El patrón más común de Barcode4NET: crea un objeto, establece propiedades, llama a GenerateBarcode() para recibir un Bitmap, luego guárdalo.

Enfoque de Barcode4NET:

using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

public void SaveLabel(string sku, string outputPath)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = sku;
    barcode.Width = 400;
    barcode.Height = 120;
    Bitmap barcodeImage = barcode.GenerateBarcode();
    barcodeImage.Save(outputPath, ImageFormat.Png);
}
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

public void SaveLabel(string sku, string outputPath)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = sku;
    barcode.Width = 400;
    barcode.Height = 120;
    Bitmap barcodeImage = barcode.GenerateBarcode();
    barcodeImage.Save(outputPath, ImageFormat.Png);
}
Imports Barcode4NET
Imports System.Drawing
Imports System.Drawing.Imaging

Public Sub SaveLabel(sku As String, outputPath As String)
    Dim barcode As New Barcode4NET.Barcode()
    barcode.Symbology = Symbology.Code128
    barcode.Data = sku
    barcode.Width = 400
    barcode.Height = 120
    Dim barcodeImage As Bitmap = barcode.GenerateBarcode()
    barcodeImage.Save(outputPath, ImageFormat.Png)
End Sub
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;

public void SaveLabel(string sku, string outputPath)
{
    BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .SaveAsPng(outputPath);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

public void SaveLabel(string sku, string outputPath)
{
    BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .SaveAsPng(outputPath);
}
Imports IronBarCode

Public Sub SaveLabel(sku As String, outputPath As String)
    BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
        .ResizeTo(400, 120) _
        .SaveAsPng(outputPath)
End Sub
$vbLabelText   $csharpLabel

El bloque de configuración de propiedades se reduce a una única cadena fluida. La llamada .ResizeTo() reemplaza las asignaciones de propiedades Width y Height. .SaveAsPng() reemplaza tanto GenerateBarcode() como la llamada barcodeImage.Save() separada. Para conocer opciones de generación adicionales, consulte la documentación de generación de códigos de barras de IronBarcode .

Visualización de PictureBox en WinForms

Si tu código de Código de barras4NETasigna directamente el valor de retorno Bitmap a un control PictureBox o similar, cargarás una matriz de bytes a través de un MemoryStream en su lugar.

Enfoque de Barcode4NET:

using Barcode4NET;
using System.Drawing;

private void RefreshBarcodeDisplay(string data)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = data;
    barcode.Width = 300;
    barcode.Height = 100;
    pictureBox1.Image = barcode.GenerateBarcode();
}
using Barcode4NET;
using System.Drawing;

private void RefreshBarcodeDisplay(string data)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = data;
    barcode.Width = 300;
    barcode.Height = 100;
    pictureBox1.Image = barcode.GenerateBarcode();
}
Imports Barcode4NET
Imports System.Drawing

Private Sub RefreshBarcodeDisplay(data As String)
    Dim barcode As New Barcode4NET.Barcode()
    barcode.Symbology = Symbology.Code128
    barcode.Data = data
    barcode.Width = 300
    barcode.Height = 100
    pictureBox1.Image = barcode.GenerateBarcode()
End Sub
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;
using System.Drawing;
using System.IO;

private void RefreshBarcodeDisplay(string data)
{
    byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .ToPngBinaryData();

    using var stream = new MemoryStream(pngBytes);
    pictureBox1.Image = Image.FromStream(stream);
}
using IronBarCode;
using System.Drawing;
using System.IO;

private void RefreshBarcodeDisplay(string data)
{
    byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .ToPngBinaryData();

    using var stream = new MemoryStream(pngBytes);
    pictureBox1.Image = Image.FromStream(stream);
}
Imports IronBarCode
Imports System.Drawing
Imports System.IO

Private Sub RefreshBarcodeDisplay(data As String)
    Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
        .ResizeTo(300, 100) _
        .ToPngBinaryData()

    Using stream As New MemoryStream(pngBytes)
        pictureBox1.Image = Image.FromStream(stream)
    End Using
End Sub
$vbLabelText   $csharpLabel

El paso MemoryStream es la única adición estructural. Todo lo demás es una traducción directa del patrón de asignación de propiedades a la cadena fluida.

Generación de códigos QR

Enfoque de Barcode4NET:

using Barcode4NET;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.QRCode;
barcode.Data = "https://example.com/product/99";
barcode.Width = 300;
barcode.Height = 300;
Bitmap qrImage = barcode.GenerateBarcode();
qrImage.Save("qr.png", System.Drawing.Imaging.ImageFormat.Png);
using Barcode4NET;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.QRCode;
barcode.Data = "https://example.com/product/99";
barcode.Width = 300;
barcode.Height = 300;
Bitmap qrImage = barcode.GenerateBarcode();
qrImage.Save("qr.png", System.Drawing.Imaging.ImageFormat.Png);
Imports Barcode4NET
Imports System.Drawing.Imaging

Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.QRCode
barcode.Data = "https://example.com/product/99"
barcode.Width = 300
barcode.Height = 300
Dim qrImage As Bitmap = barcode.GenerateBarcode()
qrImage.Save("qr.png", ImageFormat.Png)
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/99", 300)
    .SaveAsPng("qr.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/99", 300)
    .SaveAsPng("qr.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com/product/99", 300) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

IronBarcode usa una clase QRCodeWriter dedicada para códigos QR, lo que da acceso a opciones específicas de QR, como el nivel de corrección de errores y la incrustación de logotipos de marca. El segundo parámetro de QRCodeWriter.CreateQrCode() es el tamaño de píxel de la imagen cuadrada.

Agregar lectura de códigos de barras

Barcode4NET no tenía una API de lectura. Si su aplicación procesa documentos escaneados, verifica códigos de barras generados o extrae datos de facturas en formato PDF, esta funcionalidad estará disponible inmediatamente después de la migración sin necesidad de añadir una segunda biblioteca.

Enfoque de Barcode4NET:

// No reading API available in Barcode4NET.
// Required a separate library (e.g., ZXing.Net) to decode barcodes.
// No reading API available in Barcode4NET.
// Required a separate library (e.g., ZXing.Net) to decode barcodes.
' No reading API available in Barcode4NET.
' Required a separate library (e.g., ZXing.Net) to decode barcodes.
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

// Read a barcode from an image file
var results = BarcodeReader.Read("scanned-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Symbology: {result.Format}");
}

// Read all barcodes from a PDF — pages are handled automatically
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
using IronBarCode;

// Read a barcode from an image file
var results = BarcodeReader.Read("scanned-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Symbology: {result.Format}");
}

// Read all barcodes from a PDF — pages are handled automatically
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
Imports IronBarCode

' Read a barcode from an image file
Dim results = BarcodeReader.Read("scanned-label.png")
For Each result In results
    Console.WriteLine($"Value: {result.Value}")
    Console.WriteLine($"Symbology: {result.Format}")
Next

' Read all barcodes from a PDF — pages are handled automatically
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
$vbLabelText   $csharpLabel

Para leer archivos PDF no se necesita ninguna biblioteca adicional. BarcodeReader.Read() maneja entradas de imagen y PDF de forma nativa. Consulte la documentación de lectura de códigos de barras para conocer las opciones de configuración, incluida la velocidad de lectura y la detección de múltiples códigos de barras.

Actualización del marco de destino

Una vez que se elimina Barcode4NET, la restricción de .NET Framework desaparece con él. Actualiza el elemento TargetFramework en tu .csproj:

Enfoque de Barcode4NET:


<PropertyGroup>
  <TargetFramework>net472</TargetFramework>
</PropertyGroup>

<PropertyGroup>
  <TargetFramework>net472</TargetFramework>
</PropertyGroup>
XML

Enfoque de IronBarcode :


<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
</PropertyGroup>

<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
XML

IronBarcode es compatible con .NET Framework desde la .NET hasta la 9, por lo que el framework de destino se puede actualizar a la versión que su organización prefiera sin ninguna restricción en cuanto a la biblioteca de códigos de barras.

Controlador ASP.NET Core : Devolución de código de barras como respuesta de imagen.

Si al mismo tiempo está modernizando una aplicación Web Forms, aquí tiene el patrón de ASP.NET Core para devolver una imagen de código de barras desde una acción del controlador:

Enfoque de Barcode4NET:

// Código de barras4NETwas not compatible with ASP.NET Core.
// Web Forms HttpHandler was required for image delivery.
// Código de barras4NETwas not compatible with ASP.NET Core.
// Web Forms HttpHandler was required for image delivery.
' Código de barras4NETwas not compatible with ASP.NET Core.
' Web Forms HttpHandler was required for image delivery.
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcodes")]
public class BarcodesController : ControllerBase
{
    [HttpGet("{data}")]
    public IActionResult Get(string data)
    {
        byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
            .ResizeTo(400, 120)
            .ToPngBinaryData();

        return File(pngBytes, "image/png");
    }
}
using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcodes")]
public class BarcodesController : ControllerBase
{
    [HttpGet("{data}")]
    public IActionResult Get(string data)
    {
        byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
            .ResizeTo(400, 120)
            .ToPngBinaryData();

        return File(pngBytes, "image/png");
    }
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/barcodes")>
Public Class BarcodesController
    Inherits ControllerBase

    <HttpGet("{data}")>
    Public Function [Get](data As String) As IActionResult
        Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
            .ResizeTo(400, 120) _
            .ToPngBinaryData()

        Return File(pngBytes, "image/png")
    End Function
End Class
$vbLabelText   $csharpLabel

.ToPngBinaryData() devuelve un byte[] directamente, que se acopla al resultado File() sin ninguna conversión intermedia.

Referencia de mapeo de la API de Código de barras4NETa IronBarcode

Código de barras4NET IronBarcode
new Barcode4NET.Barcode() BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128 BarcodeEncoding.Code128 (parámetro para CreateBarcode)
barcode.Data = "ITEM-12345" Primer parámetro de CreateBarcode()
barcode.Width = 300; código de barras.Altura = 100 .ResizeTo(300, 100)
barcode.GenerateBarcode() devuelve Bitmap .SaveAsPng(path) / .ToPngBinaryData()
Symbology.QRCode BarcodeEncoding.QRCode
Symbology.Code39 BarcodeEncoding.Code39
Symbology.EAN13 BarcodeEncoding.EAN13
Symbology.UPCA BarcodeEncoding.UPCA
<Reference Include="Barcode4NET"> | <PackageReference Include="IronBarcode" />
.NET Framework only .NET Framework 4.6.2 through .NET 9
Sólo generación Generación + lectura (BarcodeReader.Read())
Sin soporte para PDF BarcodeReader.Read("doc.pdf") nativo

Problemas comunes de migración y soluciones

Problema 1: No dotnet remove package para referencias de DLL

Barcode4NET: Dado que Código de barras4NETnunca fue un paquete NuGet , no existe ningún comando del administrador de paquetes para eliminarlo. El elemento <Reference Include="Barcode4NET"> debe ser eliminado manualmente de cada archivo .csproj, y el directorio de DLL debe ser eliminado del control de versiones explícitamente.

Solución: Realice una búsqueda para localizar todos los archivos del proyecto que hacen referencia a la DLL y, a continuación, elimine los elementos manualmente:

grep -rn "Barcode4NET" --include="*.csproj" .
grep -rn "Barcode4NET" --include="*.csproj" .
SHELL

No deje la referencia a la DLL junto con la nueva referencia a NuGet ; hacerlo provoca errores de compilación debido a una resolución de tipos ambigua.

Problema 2: Cambio del tipo de retorno de mapa de bits a matriz de bytes

Barcode4NET: GenerateBarcode() returns System.Drawing.Bitmap. El código que asigna el valor de retorno a una variable de tipo Bitmap o lo pasa a cualquier método que espera un Bitmap — como un PictureBox — debe ser actualizado.

Solución: Reemplaza las asignaciones .GenerateBarcode() con .ToPngBinaryData() y carga el arreglo de bytes a través de un MemoryStream en el sitio de la llamada:

byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .ToPngBinaryData();

using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .ToPngBinaryData();

using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
Imports System.IO

Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .ToPngBinaryData()

Using stream As New MemoryStream(pngBytes)
    pictureBox1.Image = Image.FromStream(stream)
End Using
$vbLabelText   $csharpLabel

Buscar .GenerateBarcode() en toda la solución localizará todos los sitios de llamada que necesitan actualización.

Problema 3: Cambio de espacio de nombres de enumeración de simbología

Barcode4NET: Usa Symbology.Code128, Symbology.QRCode, Symbology.Code39, y valores similares del espacio de nombres Barcode4NET.

Solución: Reemplaza con valores de enumeración BarcodeEncoding. Se conservan todos los nombres comunes; solo cambia el nombre del tipo:

// Before
barcode.Symbology = Symbology.Code128;

// After
BarcodeEncoding.Code128  // passed as parameter to CreateBarcode()
// Before
barcode.Symbology = Symbology.Code128;

// After
BarcodeEncoding.Code128  // passed as parameter to CreateBarcode()
' Before
barcode.Symbology = Symbology.Code128

' After
BarcodeEncoding.Code128  ' passed as parameter to CreateBarcode()
$vbLabelText   $csharpLabel

Un reemplazo de búsqueda y reemplazo en toda la solución de Symbology. con BarcodeEncoding. cubre la mayoría de los casos. Revise cada reemplazo para confirmar el contexto.

Problema 4: El ancho y la altura ahora son un método, no propiedades.

Barcode4NET: El tamaño se configuró como dos asignaciones de propiedades separadas: barcode.Width = 300; código de barras.Altura = 100;`

Solución: Usa el método encadenado .ResizeTo(width, height). Esto es lo suficientemente sintácticamente diferente como para que una simple búsqueda y reemplazo no lo detecte — busca .Width = y .Height = en el código relacionado con códigos de barras y actualiza cada ocurrencia:

// Before
barcode.Width = 300;
barcode.Height = 100;

// After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
// Before
barcode.Width = 300;
barcode.Height = 100;

// After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
' Before
barcode.Width = 300
barcode.Height = 100

' After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

Lista de verificación de migración de Barcode4NET

Tareas previas a la migración

Ejecute estas búsquedas en su solución antes de comenzar. Proporcionan una imagen precisa del alcance de la migración:

# Find all Código de barras4NETusages in source files
grep -rn "Barcode4NET" --include="*.cs" .

# Find the using directive
grep -rn "using Barcode4NET" --include="*.cs" .

# Find object creation
grep -rn "new Barcode4NET.Barcode()" --include="*.cs" .

# Find Symbology enum usage
grep -rn "Symbology\." --include="*.cs" .

# Find GenerateBarcode calls
grep -rn "\.GenerateBarcode()" --include="*.cs" .

# Find the DLL reference in project files
grep -rn "Barcode4NET" --include="*.csproj" .

# Find DLL references in build scripts
grep -rn "Barcode4NET" --include="*.yml" .
grep -rn "Barcode4NET" --include="*.yaml" .
grep -rn "ThirdParty/Barcode4NET" .
# Find all Código de barras4NETusages in source files
grep -rn "Barcode4NET" --include="*.cs" .

# Find the using directive
grep -rn "using Barcode4NET" --include="*.cs" .

# Find object creation
grep -rn "new Barcode4NET.Barcode()" --include="*.cs" .

# Find Symbology enum usage
grep -rn "Symbology\." --include="*.cs" .

# Find GenerateBarcode calls
grep -rn "\.GenerateBarcode()" --include="*.cs" .

# Find the DLL reference in project files
grep -rn "Barcode4NET" --include="*.csproj" .

# Find DLL references in build scripts
grep -rn "Barcode4NET" --include="*.yml" .
grep -rn "Barcode4NET" --include="*.yaml" .
grep -rn "ThirdParty/Barcode4NET" .
SHELL

Anote la cantidad de archivos para cada patrón. Documente el código de dibujo basado en coordenadas, los patrones de uso de fuentes y cualquier paso del script de compilación que copie la DLL.

Tareas de actualización de código

  1. Elimina ThirdParty/Barcode4NET/ del control de versiones (git rm -r)
  2. Elimina <Reference Include="Barcode4NET"> de todos los archivos .csproj
  3. Elimine los pasos de copia manual de DLL de los scripts de compilación y los archivos de canalización de CI/CD.
  4. Ejecuta dotnet add package IronBarcode para cada proyecto en la solución
  5. Agrega IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; al inicio de la aplicación
  6. Reemplaza using Barcode4NET; con using IronBarCode; en todos los archivos .cs
  7. Reemplaza bloques de new Barcode4NET.Barcode() con llamadas BarcodeWriter.CreateBarcode()
  8. Reemplaza Symbology.X con BarcodeEncoding.X en todo
  9. Reemplazar barcode.Width = N; barcode.Height = M; with .ResizeTo(N, M)
  10. Reemplaza asignaciones .GenerateBarcode() con .SaveAsPng() o .ToPngBinaryData()
  11. Actualiza asignaciones de control de imagen PictureBox u otro para usar el patrón MemoryStream
  12. Actualiza TargetFramework en archivos .csproj si se actualiza desde net4xx
  13. Ejecuta la compilación completa y corrige cualquier error de compilación restante.

Pruebas posteriores a la migración

  • Compare la salida del código de barras visual con muestras conocidas que funcionan correctamente para confirmar su apariencia.
  • Verifique que el hardware del escáner de códigos de barras pueda leer los códigos de barras generados a partir de todas las simbologías afectadas.
  • Prueba que los valores BarcodeEncoding coincidan con la salida esperada para Code128, Code39, EAN-13, UPC-A y QR Code
  • Verifica que el patrón MemoryStream se muestre correctamente en controles de WinForms donde aplique
  • Confirma que el pipeline CI/CD se completa exitosamente usando solo dotnet restore sin pasos manuales de DLL
  • Prueba la funcionalidad de lectura de código de barras si BarcodeReader.Read() se agregó como parte de la migración

Principales ventajas de migrar a IronBarcode

Se ha restablecido la capacidad de otorgar licencias a nuevos miembros del equipo: IronBarcode es un producto comercial activo con licencias perpetuas disponibles a precios definidos. Los nuevos desarrolladores, contratistas y miembros del equipo pueden obtener la licencia de inmediato. Deja de existir la situación en la que un desarrollador se incorpora a la empresa y no puede trabajar legalmente en código relacionado con códigos de barras.

Gestión estándar de dependencias de NuGet: Después de la migración, dotnet restore maneja todo. Los desarrolladores novatos clonan el repositorio, restauran los paquetes y compilan sin tener ningún conocimiento sobre la ubicación de las DLL, los almacenes de artefactos o los procedimientos de copia manual. Se elimina la fricción que la distribución de DLL de Código de barras4NETgeneraba en cada canalización de CI/CD y flujo de trabajo de incorporación.

Libertad total en cuanto a versiones de .NET : Eliminar la restricción de Código de barras4NETdesbloquea los proyectos de modernización de .NET . El marco de destino se puede actualizar a .NET 8, .NET 9 o versiones futuras sin ninguna limitación en la biblioteca de códigos de barras. La implementación en Linux, la contenerización con Docker y los entornos de ejecución sin servidor en la nube estarán disponibles.

Lectura de código de barras sin una segunda biblioteca: BarcodeReader.Read() decodifica códigos de barras desde imágenes y PDFs de forma nativa. Los equipos que anteriormente combinaban Código de barras4NETpara la generación con ZXing .NET u otra biblioteca para la lectura, ahora pueden consolidarse en una única dependencia mantenida. La lectura de códigos de barras PDF no requiere ninguna biblioteca PDF adicional.

Postura de seguridad y cumplimiento: IronBarcode recibe parches de seguridad periódicos y se realiza un seguimiento comparándolos con las bases de datos CVE actuales. Las auditorías de la lista de materiales del software ya no mostrarán a Código de barras4NETcomo una dependencia comercial obsoleta sin un proceso de respuesta del proveedor. El problema de remediación que Código de barras4NETdetecta en las auditorías de seguridad se resuelve tan pronto como finaliza la migración.

Ritmo de desarrollo activo: IronBarcode publica actualizaciones periódicas que coinciden con las nuevas versiones de .NET . Las actualizaciones de compatibilidad para futuras versiones de .NET se entregan a través del paquete, por lo que la biblioteca no se congelará en el estado en que estaba cuando un proveedor se quedó sin actividad.

Preguntas Frecuentes

¿Por qué debería migrar de Barcode4.NET a IronBarcode?

Entre las razones más comunes se incluyen la simplificación de licencias (eliminando la complejidad de SDK + clave de tiempo de ejecución), la eliminación de límites de rendimiento, la obtención de compatibilidad nativa con PDF, la mejora de la implementación de Docker/CI/CD y la reducción de la repetición de API en el código de producción.

¿Cómo puedo sustituir las llamadas a la API de Barcode4.NET por IronBarcode?

Sustituya la creación de instancias y la repetición de licencias por IronBarCode.License.LicenseKey = "key". Sustituya las llamadas al lector por BarcodeReader.Read(path) y las llamadas al escritor por BarcodeWriter.CreateBarcode(data, encoding). Los métodos estáticos no requieren gestión de instancias.

¿Cuánto cambia el código al migrar de Barcode4.NET a IronBarcode?

La mayoría de las migraciones se traducen en menos líneas de código. Se eliminan la repetición de licencias, los constructores de instancias y la configuración explícita de formatos. Las operaciones básicas de lectura/escritura se traducen a equivalentes IronBarcode más cortos con objetos de resultado más limpios.

¿Necesito tener instalados tanto Barcode4.NET como IronBarcode durante la migración?

No. La mayoría de las migraciones son sustituciones directas en lugar de operaciones paralelas. Migre una clase de servicio cada vez, sustituya la referencia NuGet y actualice los patrones de instanciación y llamada a la API antes de pasar a la siguiente clase.

¿Cuál es el nombre del paquete NuGet para IronBarcode?

El paquete es 'IronBarCode' (con B y C mayúsculas). Instálalo con 'Install-Package IronBarCode' o 'dotnet add package IronBarCode'. La directiva using en el código es 'using IronBarCode;'.

¿Cómo simplifica IronBarcode el despliegue de Docker en comparación con Barcode4.NET?

IronBarcode es un paquete NuGet sin archivos SDK externos ni configuración de licencia montada. En Docker, establezca la variable de entorno IRONBARCODE_LICENSE_KEY y el paquete se encargará de la validación de la licencia al inicio.

¿IronBarcode detecta automáticamente todos los formatos de código de barras después de migrar desde Barcode4.NET?

Sí, IronBarcode detecta automáticamente la simbología de todos los formatos compatibles. No es necesaria la enumeración explícita de BarcodeTypes. Si ya se conoce el formato y el rendimiento es importante, BarcodeReaderOptions permite restringir el espacio de búsqueda como optimización.

¿Puede IronBarcode leer códigos de barras de PDF sin una biblioteca independiente?

Sí. BarcodeReader.Read("document.pdf") procesa archivos PDF de forma nativa. Los resultados incluyen PageNumber, Format, Value y Confidence para cada código de barras encontrado. No es necesario ningún paso externo de procesamiento de PDF.

¿Cómo gestiona IronBarcode el procesamiento paralelo de códigos de barras?

Los métodos estáticos de IronBarcode no tienen estado y son seguros para los hilos. Utilice Parallel.ForEach directamente sobre listas de archivos sin gestión de instancias por subproceso. BarcodeReaderOptions.MaxParallelThreads controla el presupuesto interno de hilos.

¿Qué propiedades de los resultados cambian al migrar de Barcode4.NET a IronBarcode?

Cambios de nombre comunes: BarcodeValue se convierte en Value, BarcodeType se convierte en Format. Los resultados de IronBarcode también añaden Confidence y PageNumber. Una búsqueda y sustitución en toda la solución gestiona los cambios de nombre en el código de procesamiento de resultados existente.

¿Cómo configuro las licencias de IronBarcode en un proceso CI/CD?

Almacene IRONBARCODE_LICENSE_KEY como un secreto de canalización y asigne IronBarCode.License.LicenseKey en el código de inicio de la aplicación. Un secreto cubre todos los entornos, incluidos los de desarrollo, prueba, montaje y producción.

¿Admite IronBarcode la generación de códigos QR con estilos personalizados?

Sí. QRCodeWriter.CreateQrCode() admite colores personalizados mediante ChangeBarCodeColor(), incrustación de logotipos mediante AddBrandLogo(), niveles de corrección de errores configurables y múltiples formatos de salida, incluidos PNG, JPG, PDF y stream.

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

Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame