BarcodeLib vs IronBarcode: Comparación de bibliotecas de códigos de barras C#
BarcodeLib se ha descargado más de 12 millones de veces. La mayoría de esos desarrolladores acaban descubriendo que solo puede crear códigos de barras. Una parte importante de ellos también descubre el conflicto con SkiaSharp, generalmente en el peor momento posible, cuando acaban de agregar BarcodeLiba un proyecto MAUI o Blazor que ya depende de SkiaSharp, y la compilación comienza a generar advertencias NU1608 que no esperaban tener que depurar esa tarde. Este artículo aborda ambos temas con honestidad. BarcodeLibes una biblioteca legítima con un caso de uso claro. La cuestión práctica reside en comprender dónde termina.
Comprender BarcodeLib
BarcodeLib es una biblioteca de código abierto para la generación de imágenes de códigos de barras para .NET, mantenida en GitHub por Brad Barnhill. Está en funcionamiento desde 2007 y admite más de 25 simbologías de códigos de barras. La licencia Apache 2.0 permite su uso gratuito con fines comerciales. Para la generación pura de códigos de barras —crear una imagen a partir de una cadena de caracteres— funciona de forma fiable y ha cumplido bien esa función durante muchos años de uso activo.
La API se basa en instancias. Usted crea un objeto Barcode, establece propiedades y llama a Encode() con una constante de tipo y una cadena de datos. El resultado es un System.Drawing.Image que podrá guardar o transmitir en streaming según sus necesidades. Este flujo de trabajo es claro y accesible, y para proyectos donde el requisito es estrictamente imprimir imágenes de códigos de barras (etiquetas de envío, etiquetas de inventario, etiquetas de precios minoristas), es suficiente.
Características arquitectónicas clave de BarcodeLib:
- Ámbito de solo generación: la biblioteca no tiene ninguna API de lectura o decodificación de ningún tipo; toda su superficie pública está orientada a la producción de imágenes a partir de cadenas de datos
- API basada en instancias: Cada operación requiere instanciar un objeto
Barcodey establecer las propiedades de anchura, altura y etiqueta antes de llamar aEncode() - Devuelve
System.Drawing.Image: La salida es un objeto de imagen GDI+, que requiere unMemoryStreampaso intermedio para producir una matriz de bytes para respuestas HTTP o almacenamiento en base de datos - Generación de códigos 1D y QR únicamente: Admite más de 25 simbologías, incluyendo Code128, EAN-13, UPC-A, Code39 y código QR, pero no ofrece capacidad de lectura 2D.
- Dependencia de SkiaSharp (v3.x): La serie 3.x sustituyó
System.Drawing.Commonpor SkiaSharp para permitir la compatibilidad entre plataformas; Esto introduce un riesgo de conflicto de versiones cuando otros paquetes del proyecto también dependen de SkiaSharp. - Gratuito, sin necesidad de clave de licencia: la licencia Apache 2.0 cubre el uso comercial sin necesidad de clave de ejecución ni activación.
Patrón de generación principal de BarcodeLib
El flujo de trabajo estándar de generación de BarcodeLibrequiere crear una instancia, configurar las propiedades y llamar a Encode():
// BarcodeLib
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");
img.Save("barcode.png", ImageFormat.Png);
// BarcodeLib
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");
img.Save("barcode.png", ImageFormat.Png);
Imports BarcodeLib
Imports System.Drawing
Imports System.Drawing.Imaging
Dim b As New Barcode()
b.IncludeLabel = True
b.Width = 300
b.Height = 100
Dim img As Image = b.Encode(TYPE.CODE128, "PRODUCT-12345")
img.Save("barcode.png", ImageFormat.Png)
Este es el flujo de trabajo de generación completo. El patrón property-setter es el diseño: toda la configuración ocurre en la instancia antes de la llamada Encode(), y el valor de retorno es un System.Drawing.Image que debe ser guardado por separado o convertido a bytes.
Entendiendo IronBarcode
IronBarcode es una biblioteca comercial de códigos de barras .NET que abarca tanto la generación como la lectura en un solo paquete. Se instala a través de NuGet, funciona con .NET Framework desde la .NET 4.6.2 hasta la 9, y es compatible con Windows, Linux, macOS, Docker, Azure y AWS Lambda. La biblioteca es desarrollada y mantenida por Iron Software con un modelo de soporte comercial.
La API de generación es estática y fluida: no es necesario crear ninguna instancia ni configurar ninguna propiedad antes de la llamada principal. Las opciones de configuración se encadenan en el resultado de BarcodeWriter.CreateBarcode() o QRCodeWriter.CreateQrCode(). Los métodos de salida al final de la cadena - .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() - eliminan el patrón intermedio MemoryStream que requiere BarcodeLib. La lectura forma parte del mismo paquete, sin necesidad de mantener ninguna biblioteca aparte ni la integración con ZXing .NET .
Características clave de IronBarcode:
- Generación y lectura en un solo paquete:
BarcodeWriterse encarga de la generación;BarcodeReaderse encarga de la lectura; Ambos se envían en la misma instalación de NuGet. - API fluida estática: No requiere instanciación; cadenas de configuración después de
CreateBarcode()utilizando métodos fluidos - Salida directa de matrices de bytes:
.ToPngBinaryData()devuelvebyte[]sin un pasoMemoryStream - Soporte PDF en ambos extremos:
BarcodeReader.Read()acepta archivos PDF de forma nativa; Los resultados generados pueden incrustarse en archivos PDF. - Sin dependencia de SkiaSharp: Independiente del gráfico de versiones de SkiaSharp, eliminando conflictos de NU1608 en MAUI y otros proyectos.
- Licencia comercial con SLA: Precio entre $749 y $5,999 perpetuos; incluye soporte comercial y cadencia de actualización garantizada
- ajuste de
ReadingSpeed:BarcodeReaderOptionspermite cambiar la minuciosidad del escaneo por el rendimiento en volumen
Comparación de características
| Característica | BarcodeLib | IronBarcode |
|---|---|---|
| Generación de códigos de barras | Sí | Sí |
| Lectura de códigos de barras | No | Sí |
| Lectura de códigos de barras PDF | No | Sí |
| Conflicto de dependencia de SkiaSharp | Sí (v3.x) | No |
| API fluida y encadenable | No | Sí |
| Licencia | Apache 2.0 (gratuito) | $749–$5,999 perpetuo |
Comparación detallada de características
| Característica | BarcodeLib | IronBarcode |
|---|---|---|
| Generación | ||
| Generación de Code128 | Sí | Sí |
| Generación EAN-13 / UPC-A | Sí | Sí |
| Generación de código QR | Sí (básico) | Sí (avanzado, con inserción de logotipo) |
| Más de 25 simbologías | Sí | Sí |
| API de generación encadenable fluida | No | Sí |
Salida directa byte[] |
Manual (MemoryStream) |
.ToPngBinaryData() |
| Salida de generación de PDF | No | Sí |
| Lectura | ||
| Lectura de códigos de barras a partir de imágenes | No | Sí (BarcodeReader.Read()) |
| Lectura de códigos de barras desde PDF | No | Sí (nativo, sin biblioteca adicional) |
| Detección de múltiples códigos de barras | No | Sí (ExpectMultipleBarcodes) |
| Ajuste de velocidad de lectura | N/A | Sí (ReadingSpeed enum) |
| Plataforma | ||
| Windows | Sí | Sí |
| Linux / macOS | Parcial (dependiente de SkiaSharp) | Completo |
| Docker / contenedor | Se requiere configuración | Sí |
| Compatibilidad con proyectos MAUI | Riesgo de conflicto (NU1608) | No hay conflicto |
| .NET Framework 4.6.2 o superior | Sí | Sí |
| .NET 6-9 | Sí (se requiere SkiaSharp 3.x) | Sí |
| Licencias | ||
| Código abierto / gratuito | Sí (Apache 2.0) | No |
| Soporte comercial / SLA | No | Sí |
| Se requiere clave de licencia | No | Sí |
| Precios | Gratis | $749–$5,999 perpetuo |
API de generación de códigos de barras
Las API de generación representan diferentes filosofías de diseño: BarcodeLibutiliza una configuración de instancia mutable, mientras que IronBarcode utiliza una cadena fluida inmutable.
Enfoque BarcodeLib
BarcodeLib requiere construir una instancia y establecer propiedades antes de llamar a Encode(). El resultado es un objeto System.Drawing.Image:
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, data);
using var ms = new MemoryStream();
img.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, data);
using var ms = new MemoryStream();
img.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
Imports BarcodeLib
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Public Function GenerateCode128(data As String) As Byte()
Dim b As New Barcode()
b.IncludeLabel = True
b.Width = 300
b.Height = 100
Dim img As Image = b.Encode(TYPE.CODE128, data)
Using ms As New MemoryStream()
img.Save(ms, ImageFormat.Png)
Return ms.ToArray()
End Using
End Function
El tipo de retorno System.Drawing.Image significa que la salida de la matriz de bytes requiere un intermediario MemoryStream. La propiedad IncludeLabel es un conmutador booleano - BarcodeLibmuestra automáticamente la cadena de datos codificada como la etiqueta visible debajo de las barras.
Enfoque IronBarcode
La generación de IronBarcode es completamente estática. Las cadenas de configuración después de CreateBarcode(), y los métodos de salida terminan la cadena directamente:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.ToPngBinaryData();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.ToPngBinaryData();
}
Imports IronBarCode
Public Function GenerateCode128(data As String) As Byte()
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.AddAnnotationTextBelowBarcode(data) _
.ToPngBinaryData()
End Function
.ToPngBinaryData() devuelve la matriz de bytes directamente, sin objetos intermedios Image o MemoryStream. .AddAnnotationTextBelowBarcode() toma la cadena de etiquetas explícitamente, dando control sobre qué texto aparece debajo de las barras. Para escenarios de generación avanzados, consulte la documentación de generación de códigos de barras de IronBarcode .
Capacidad de lectura de códigos de barras
La lectura constituye el límite funcional más significativo entre estas dos bibliotecas. BarcodeLibno tiene capacidad de lectura; IronBarcode incluye un motor de lectura completo en el mismo paquete.
Enfoque BarcodeLib
BarcodeLib no tiene una API de lectura. No hay ningún método Decode(), Scan() o ReadBarcode(). La ausencia no se debe a una diferencia de versión; la lectura nunca ha formado parte del diseño de la biblioteca. Cualquier intento de llamar a un método decodificador produce un error de compilación:
// BarcodeLib— reading does not exist
using BarcodeLib;
var b = new Barcode();
// This will not compile — there is no Decode or Read method
// var value = b.Decode("barcode.png"); // CS1061: no definition
// var value = b.Scan("barcode.png"); // CS1061: no definition
// var value = b.ReadBarcode("barcode.png"); // CS1061: no definition
// The only thing you can do is generate:
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345"); // this works
// BarcodeLib— reading does not exist
using BarcodeLib;
var b = new Barcode();
// This will not compile — there is no Decode or Read method
// var value = b.Decode("barcode.png"); // CS1061: no definition
// var value = b.Scan("barcode.png"); // CS1061: no definition
// var value = b.ReadBarcode("barcode.png"); // CS1061: no definition
// The only thing you can do is generate:
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345"); // this works
Imports BarcodeLib
Dim b As New Barcode()
' This will not compile — there is no Decode or Read method
' Dim value = b.Decode("barcode.png") ' CS1061: no definition
' Dim value = b.Scan("barcode.png") ' CS1061: no definition
' Dim value = b.ReadBarcode("barcode.png") ' CS1061: no definition
' The only thing you can do is generate:
Dim img As Image = b.Encode(TYPE.CODE128, "PRODUCT-12345") ' this works
Los equipos que necesitan tanto la generación como la lectura de BarcodeLibdeben añadir una segunda biblioteca, normalmente ZXing .NET , lo que introduce su propia carga de gestión de dependencias y una segunda interfaz API que mantener.
Enfoque IronBarcode
BarcodeReader.Read() acepta archivos de imagen, archivos PDF, secuencias y objetos System.Drawing.Bitmap. Para leer un PDF no se necesita ninguna biblioteca adicional:
using IronBarCode;
// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value); // "PRODUCT-12345"
// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;
// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value); // "PRODUCT-12345"
// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode
' Read from an image
Dim results = BarcodeReader.Read("barcode.png")
Console.WriteLine(results.First().Value) ' "PRODUCT-12345"
' Read all barcodes from a PDF — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
' Tune reading for speed vs. thoroughness
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-scan.png", options)
El ReadingSpeed enum permite ajustar el rendimiento del escaneado para escenarios de gran volumen. Para obtener orientación sobre la configuración de lectura, consulte la documentación de lectura de IronBarcode .
Conflicto de dependencias de SkiaSharp
La dependencia SkiaSharp introducida en BarcodeLib3.x crea una clase de conflicto que no existe en IronBarcode.
Enfoque BarcodeLib
A partir de BarcodeLib3.x, la biblioteca introdujo SkiaSharp como backend gráfico para sustituir a System.Drawing.Common, que pasó a ser exclusivo de Windowsa partir de .NET 6. BarcodeLibse vincula a un rango específico de versiones de SkiaSharp. Si un proyecto ya utiliza SkiaSharp a través de otra dependencia - común en proyectos MAUI utilizando SkiaSharp.Views.Maui y Microsoft.Maui.Graphics - la versión resuelta puede quedar fuera del rango esperado de BarcodeLib. El resultado es, como mínimo, una advertencia NU1608 y, en el peor de los casos, un fallo de enlace de ensamblado en tiempo de ejecución:
Advertencia NU1608: Se detectó una versión del paquete fuera de la restricción de dependencia:
BarcodeLib 3.1.5 requiere SkiaSharp (>= 2.88.7 && < 2.89.0) pero
Se ha solucionado el problema con la versión SkiaSharp 3.116.1.
Forzar una resolución mediante referencias explícitas a paquetes añade complejidad sin garantía alguna:
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
Incluso con anulaciones explícitas, la compatibilidad depende de que las llamadas a la API interna de BarcodeLibcoincidan con lo que expone la versión fija. No existe ningún contrato de soporte que garantice una solución en un plazo que sea relevante para el proyecto.
Enfoque IronBarcode
IronBarcode no comparte el gráfico de dependencias de SkiaSharp con el código de la aplicación. No hay negociación de versiones que gestionar, ni NU1608 que diagnosticar, ni riesgo de vinculación de ensamblados en tiempo de ejecución relacionado con la resolución de versiones de SkiaSharp. Los proyectos MAUI, los proyectos Blazor y cualquier otra aplicación que dependa de SkiaSharp pueden instalar IronBarcode sin ningún conflicto de versiones. Para conocer los patrones de integración específicos de MAUI, consulte la documentación de IronBarcode MAUI .
Referencia de mapeo de API
| BarcodeLib | IronBarcode |
|---|---|
new Barcode() |
API estática: no se requiere instancia. |
b.Encode(TYPE.CODE128, "data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
b.IncludeLabel = true |
.AddAnnotationTextBelowBarcode("text") |
b.Ancho = 300; b. Altura = 100|.ResizeTo(300, 100)` |
|
Devoluciones System.Drawing.Image |
.SaveAsPng(path) / .ToPngBinaryData() |
TYPE.CODE128 |
BarcodeEncoding.Code128 |
TYPE.CODE39 |
BarcodeEncoding.Code39 |
TYPE.EAN13 |
BarcodeEncoding.EAN13 |
TYPE.UPCA |
BarcodeEncoding.UPCA |
TYPE.QR_Code |
BarcodeEncoding.QRCode (también QRCodeWriter) |
| No se puede leer la API | BarcodeReader.Read(path) |
| Conflicto de versiones de SkiaSharp en MAUI | Sin dependencias conflictivas |
Cuando los equipos consideran migrar de BarcodeLiba IronBarcode
Aparece el requisito de lectura
Un sistema que lleva meses generando etiquetas de envío recibe un nuevo requisito: la aplicación también debe procesar las etiquetas devueltas por los proveedores. La integración del almacén necesita analizar los códigos de barras de los manifiestos de envío entrantes. Un sistema de gestión documental necesita indexar los códigos de barras de los archivos PDF escaneados. BarcodeLibno cumple con ninguno de estos requisitos, ya que no dispone de una API de lectura. El equipo evalúa la posibilidad de integrar ZXing .NET junto con BarcodeLib, sopesa la carga de mantenimiento que supone tener dos bibliotecas y los dos gráficos de dependencias separados, y decide que la solución más limpia es una biblioteca que gestione tanto la generación como la lectura mediante una única instalación de NuGet .
Conflicto de SkiaSharp en un proyecto MAUI
Un equipo agrega BarcodeLiba una aplicación MAUI existente e inmediatamente se encuentra con advertencias NU1608 durante la restauración. Investigan, identifican el desajuste de versión entre el rango esperado de SkiaSharp de BarcodeLiby la versión que requiere MAUI, añaden anulaciones explícitas <PackageReference> para forzar una resolución y consiguen que se apruebe la compilación. Entonces, se produce un fallo en tiempo de ejecución en el dispositivo cuando los binarios nativos de SkiaSharp cargan la versión incorrecta. La solución requiere una investigación más profunda del registro de vinculación del ensamblado. Cambiar a IronBarcode elimina el conflicto de raíz, no encontrando una versión compatible de SkiaSharp, sino eliminando por completo la dependencia compartida.
Se requiere el procesamiento de códigos de barras PDF.
Las aplicaciones que generan documentos PDF con códigos de barras incrustados (facturas, órdenes de trabajo, manifiestos de envío) a veces necesitan leer esos códigos de barras durante el procesamiento posterior. BarcodeLibgenera imágenes de códigos de barras, pero no tiene soporte para PDF en ninguno de los extremos. Para leer códigos de barras desde un PDF con BarcodeLib, primero hay que convertir el PDF en imágenes utilizando una biblioteca de PDF independiente y, a continuación, pasar esas imágenes a una biblioteca de lectura independiente. IronBarcode maneja la cadena completa de forma nativa: BarcodeReader.Read("file.pdf") recorre cada página y devuelve todos los códigos de barras detectados sin un paso intermedio de renderización.
Las funcionalidades de los códigos QR superan la generación básica.
Los proyectos que inicialmente solo requerían la generación básica de códigos QR a menudo evolucionan hasta necesitar la incrustación de logotipos, la personalización del color o la configuración del nivel de corrección de errores. BarcodeLibadmite códigos QR a través de TYPE.QR_Code, pero no ofrece más opciones que las propiedades estándar Width, Height y IncludeLabel. El QRCodeWriter de IronBarcode expone la incrustación de logotipos, el control del color y el ajuste de la corrección de errores mediante métodos encadenados. Los equipos cuyos requisitos de códigos QR han superado las capacidades de la implementación básica de BarcodeLibdescubren que la falta de funcionalidades es el factor determinante en la decisión de migrar.
Consideraciones comunes sobre la migración
API de instancia a API fluida estática
El código de BarcodeLibutiliza un patrón de objeto mutable: crear una instancia Barcode, establecer propiedades, llamar a Encode(). IronBarcode utiliza un patrón fluido estático: llamar a BarcodeWriter.CreateBarcode(), encadenar métodos de configuración, terminar con un método de salida. Será necesario reestructurar el código existente que almacena una instancia Barcode como un campo o la pasa entre métodos. El cambio típico consiste en reemplazar el bloque de asignación de propiedades por una cadena de métodos:
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.SaveAsPng(outputPath);
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddAnnotationTextBelowBarcode(data)
.SaveAsPng(outputPath);
System.Drawing.Image a salida directa
BarcodeLib devuelve System.Drawing.Image, que requiere MemoryStream para producir bytes. Cualquier código escrito en Image o System.Drawing.Image deberá ser actualizado. La cadena fluida de IronBarcode termina con el formato de salida deseado directamente - .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() - eliminando la necesidad del objeto de imagen intermedio y el paso MemoryStream.
Enumeración de tipo a enumeración BarcodeEncoding
BarcodeLib utiliza la clase TYPE con constantes en mayúsculas como TYPE.CODE128. IronBarcode utiliza el enum BarcodeEncoding con valores PascalCase como BarcodeEncoding.Code128. Los valores se corresponden directamente. Una búsqueda de TYPE\. en los archivos .cs identifica todas las apariciones que necesitan actualización, y una búsqueda y sustitución sistemática cubre los formatos comunes: CODE128 → Code128, EAN13 → EAN13, UPCA → UPCA, QR_Code → QRCode.
Limpieza de referencias de SkiaSharp
Los proyectos que añadieron entradas <PackageReference Include="SkiaSharp"> explícitas sólo para resolver las advertencias NU1608 de BarcodeLibpueden eliminar esas anulaciones después de cambiar a IronBarcode. El comando dotnet list package --include-transitive confirma si SkiaSharp sigue siendo necesario para otros paquetes del proyecto antes de eliminarlo.
Funcionalidades adicionales de IronBarcode
Más allá de la generación directa y la comparación de lecturas, IronBarcode incluye capacidades que BarcodeLibno ofrece:
- Incorporación de logotipo en código QR:
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")incrusta el logotipo de una marca en el centro de un código QR con ajuste automático de corrección de errores - Extracción de códigos de barras de PDF:
BarcodeReader.Read("file.pdf")lee los códigos de barras de cada página de un documento PDF sin necesidad de una biblioteca de renderizado de PDF independiente - Detección de códigos de barras múltiples:
BarcodeReaderOptions.ExpectMultipleBarcodes = truedetecta y devuelve todos los códigos de barras presentes en una sola imagen - Configuración de la velocidad de lectura:
ReadingSpeed.Faster,ReadingSpeed.Balanced, yReadingSpeed.ExtremeDetailajustan el motor de escaneado en función del rendimiento frente a la precisión - Generación de códigos QR con estilo: El color, el estilo del patrón del buscador y el nivel de corrección de errores se pueden configurar mediante métodos encadenados en
QRCodeWriter - Stream and Bitmap input for reading:
BarcodeReader.Read()acepta rutas de archivos, streams,System.Drawing.Bitmap, yAnyBitmapentradas
Compatibilidad con .NET y preparación para el futuro
IronBarcode es compatible con .NET Framework desde la .NET 4.6.2 hasta la 9, y mantiene un ciclo de lanzamiento regular alineado con el calendario de lanzamientos de .NET de Microsoft. A medida que la adopción de .NET 10 aumente hasta 2026, el desarrollo activo de IronBarcode garantiza la compatibilidad con versiones futuras sin necesidad de realizar cambios en el proyecto. La biblioteca funciona sin modificaciones en Windows, Linux, macOS, Docker, Azure y AWS Lambda. BarcodeLibtambién mantiene un desarrollo comunitario activo, aunque su compatibilidad multiplataforma en la serie 3.x depende de la compatibilidad de la versión de SkiaSharp que se analiza en las secciones de comparación anteriores. Para proyectos que utilizan .NET moderno en Linux o en contenedores, la arquitectura multiplataforma sin dependencias de IronBarcode evita la negociación de versiones que introduce el backend SkiaSharp de BarcodeLib.
Conclusión
BarcodeLib e IronBarcode representan diferentes alcances de solución para el trabajo con códigos de barras en .NET. BarcodeLibes una biblioteca especializada, gratuita y dedicada exclusivamente a la generación de códigos de barras, que ha cumplido su función de manera fiable durante casi dos décadas. IronBarcode es una biblioteca comercial que abarca tanto la generación como la lectura, con una API fluida y estática y sin dependencia de SkiaSharp. La diferencia no radica en la calidad dentro del ámbito compartido, sino en el ámbito en sí mismo.
BarcodeLib sigue siendo una opción realmente apropiada para proyectos con requisitos estables y exclusivamente de generación en Windowso en entornos donde se controla el panorama de versiones de SkiaSharp. Su licencia Apache 2.0, su coste cero y su API sencilla la convierten en una solución práctica para sistemas de etiquetado de envíos, generadores de etiquetas de inventario y aplicaciones similares que nunca necesitarán escanear códigos de barras. Los 12 millones de descargas reflejan que un amplio segmento de desarrolladores .NET tiene precisamente este caso de uso.
IronBarcode se convierte en la opción más práctica cuando los requisitos van más allá de la mera generación de imágenes: cuando se necesita capacidad de lectura, cuando el proyecto es una aplicación MAUI o multiplataforma donde es probable que haya conflictos de versión de SkiaSharp, cuando el procesamiento de códigos de barras PDF está en la hoja de ruta o cuando se requieren funciones de código QR más allá de la generación básica. El coste de la licencia comercial representa la cuestión clave: para los equipos cuyos requisitos coinciden con lo que IronBarcode añade respecto a BarcodeLib, la solución integral y el acuerdo de nivel de servicio (SLA) comercial constituyen el intercambio de valor.
La valoración honesta es que la mayoría de los equipos no empiezan a usar IronBarcode desde el principio. Empiezan con BarcodeLibporque es gratuito y suficiente. Migran a IronBarcode cuando sus necesidades superan las capacidades que ofrece BarcodeLib, que solo se limita a la generación de códigos de barras. La migración está bien documentada y los cambios en la interfaz de la API son predecibles. Comprender dónde se detiene BarcodeLib—y específicamente que se detiene en la generación— es la información práctica necesaria para tomar la decisión correcta sobre el momento oportuno.
Preguntas Frecuentes
¿Qué es BarcodeLib?
BarcodeLib es una biblioteca de códigos de barras .NET para generar y leer códigos de barras en aplicaciones C#. Es una de las varias alternativas que los desarrolladores evalúan cuando seleccionan una solución de código de barras para proyectos .NET.
¿Cuáles son las principales diferencias entre BarcodeLib e IronBarcode?
IronBarcode utiliza una API estática y sin estado que no requiere gestión de instancias, mientras que BarcodeLib suele requerir la creación y configuración de instancias antes de su uso. IronBarcode también ofrece compatibilidad nativa con PDF, detección automática de formatos y licencia de clave única en todos los entornos.
¿Es IronBarcode más fácil de licenciar que BarcodeLib?
IronBarcode utiliza una única clave de licencia que cubre tanto el desarrollo como los despliegues de producción. Esto simplifica las canalizaciones de CI/CD y las configuraciones de Docker en comparación con los sistemas de licencias que separan las claves de SDK de las claves de tiempo de ejecución.
¿Es IronBarcode compatible con todos los formatos de código de barras que admite BarcodeLib?
IronBarcode es compatible con más de 30 simbologías de códigos de barras, incluidos QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 y muchos más. La autodetección de formatos significa que no se requiere una enumeración explícita de formatos.
¿Es IronBarcode compatible con la lectura nativa de códigos de barras en PDF?
Sí. IronBarcode lee códigos de barras directamente desde archivos PDF utilizando BarcodeReader.Read("document.pdf") sin necesidad de una biblioteca de renderizado de PDF independiente. Los resultados por página incluyen el número de página, el formato del código de barras, el valor y la puntuación de confianza.
¿Cómo gestiona IronBarcode el procesamiento por lotes en comparación con BarcodeLib?
Los métodos estáticos de IronBarcode no tienen estado y son naturalmente seguros para subprocesos, lo que permite el uso directo de Parallel.ForEach sin gestión de instancias por subproceso. No hay límite de rendimiento en ningún nivel de precios.
¿Qué versiones de .NET admite IronBarcode ?
IronBarcode es compatible con .NET Framework 4.6.2+, .NET Core 3.1 y .NET 5, 6, 7, 8 y 9 en un único paquete NuGet. Las plataformas de destino incluyen Windows x64/x86, Linux x64 y macOS x64/ARM.
¿Cómo instalo IronBarcode en un proyecto .NET?
Instale IronBarcode a través de NuGet: ejecute 'Install-Package IronBarCode' en la consola del gestor de paquetes, o 'dotnet add package IronBarCode' en la CLI. No se necesitan instaladores SDK ni archivos de ejecución adicionales.
¿Puedo evaluar IronBarcode antes de comprarlo, a diferencia de BarcodeLib?
Sí. El modo de prueba de IronBarcode devuelve los valores completos de los códigos de barras descodificados; sólo las imágenes de salida generadas reciben una marca de agua. Puede comprobar la precisión de la lectura en sus propios documentos antes de comprometerse con la compra.
¿Cuál es la diferencia de precio entre BarcodeLib e IronBarcode?
IronBarcode cuesta a partir de 749 dólares por una licencia perpetua de desarrollador único que cubre el desarrollo y la producción. Los detalles de precios y opciones de volumen están disponibles en la página de licencias de IronBarcode. No se requiere una licencia de ejecución por separado.
¿Es fácil migrar de BarcodeLib a IronBarcode?
La migración de BarcodeLib a IronBarcode consiste principalmente en sustituir las llamadas a la API basadas en instancias por los métodos estáticos de IronBarcode, eliminar la repetición de licencias y actualizar los nombres de las propiedades de los resultados. La mayoría de las migraciones implican reducir código en lugar de añadirlo.
¿IronBarcode genera códigos QR con logotipos?
Sí. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") incrusta una imagen de marca en un código QR de forma nativa con corrección de errores configurable. Los códigos QR coloreados también son compatibles con ChangeBarCodeColor().

