BarcodeLib vs IronBarcode: Porównanie bibliotek kodów kreskowych C#
Biblioteka BarcodeLib została pobrana ponad 12 milionów razy. Większość z tych programistów w końcu odkrywa, że narzędzie to służy wyłącznie do tworzenia BARCODE-ów. Znaczna część z nich napotyka również konflikt ze SkiaSharp — zazwyczaj w najgorszym możliwym momencie, gdy właśnie dodali BarcodeLib do projektu MAUI lub Blazor, który już opiera się na SkiaSharp, a kompilacja zaczyna generować ostrzeżenia NU1608, których nie spodziewali się debugować tego popołudnia. Artykuł ten rzetelnie omawia obie kwestie. BarcodeLib to legalna biblioteka o jasnym zastosowaniu. Praktyczną kwestią jest zrozumieniuiuiuiuie, gdzie się to kończy.
Zrozumienie BarcodeLib
BarCodeLib to biblioteka open source do generowania obrazów kodów kreskowych dla platformy .NET, utrzymywana na GitHubie przez Brada Barnhilla. Działa od 2007 roku i obsługuje ponad 25 symboli BarCode. Licencja Apache 2.0 zezwala na bezpłatne wykorzystanie do celów komercyjnych. W przypadku czystego generowania BARCODE-ów — tworzenia obrazu na podstawie ciągu znaków — działa niezawodnie i dobrze spełnia tę rolę od wielu lat aktywnego użytkowania.
API jest oparte na instancjach. You create a Barcode object, set properties, and call Encode() with a type constant and a data string. The result is a System.Drawing.Image that you then save or stream as needed. Ten proces jest przejrzysty i przystępny, a w przypadku projektów, w których wymagańe jest wyłącznie drukowanie obrazów BarCode'ów — etykiet wysyłkowych, metek magazynowych, metek cenowych — jest on wystarczający.
Kluczowe cechy architektury BarcodeLib:
- Zakres wyłącznie generowania: Biblioteka nie posiada żadnego API do odczytu ani dekodowania; its entire public surface area is oriented toward producing images from data strings
- Instance-based API: Each operation requires instantiating a
Barcodeobject and setting width, height, and label properties before callingEncode() - Returns
System.Drawing.Image: Output is a GDI+ image object, which requires aMemoryStreamintermediate step to produce byte array output for HTTP responses or database storage - Tylko generowanie kodów 1D i QR: Obsługuje ponad 25 symboli, w tym Code128, EAN-13, UPC-A, Code39 i QR Code, ale nie oferuje możliwości odczytu kodów 2D
- SkiaSharp dependency (v3.x): The 3.x series replaced
System.Drawing.Commonwith SkiaSharp to enable cross-platform support; powoduje to ryzyko konfliktu wersji, gdy inne pakiety w projekcie również zależą od SkiaSharp - Bezpłatne, nie wymaga klucza licencyjnego: licencja Apache 2.0 obejmuje użytkowanie komercyjne bez konieczności posiadania klucza uruchomieniowego lub aktywacji
Wzorzec generowania BarcodeLib Core
The standard BarcodeLib generation workflow requires creating an instance, configuring properties, and calling 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)
Oto pełny przebieg procesu tworzenia. The property-setter pattern is the design: all configuration happens on the instance before the Encode() call, and the return value is a System.Drawing.Image that must be separately saved or converted to bytes.
Zrozumienie IronBarcode
IronBarcode to komercyjna biblioteka kodów kreskowych .NET, która w jednym pakiecie obejmuje zarówno generowanie, jak i odczyt. Instalacja odbywa się za pośrednictwem NuGet, działa na platformach od .NET Framework 4.6.2 do .NET 9 oraz na systemach Windows, Linux, macOS, Docker, Azure i AWS Lambda. Biblioteka jest tworzona i utrzymywana przez firmę Iron Software w ramach komercyjnego modelu wsparcia.
API generowania jest statyczne i płynne — nie trzeba tworzyć instancji ani ustawiać właściwości przed głównym wywołaniem. Configuration options chain onto the result of BarcodeWriter.CreateBarcode() or QRCodeWriter.CreateQrCode(). Output methods at the end of the chain — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — eliminate the intermediate MemoryStream pattern that BarcodeLib requires. Reading jest częścią tego samego pakietu i nie wymaga utrzymywania oddzielnej biblioteki ani integracji z ZXing.Net.
Kluczowe cechy IronBarcode:
- Generation and reading in one package:
BarcodeWriterhandles generation;BarcodeReaderhandles reading; oba są dostarczane w ramach tej samej instalacji NuGet - Statyczne, płynne API: nie wymaga instancjonowania; configuration chains after
CreateBarcode()using fluent methods - Direct byte array output:
.ToPngBinaryData()returnsbyte[]without aMemoryStreamstep - PDF support on both ends:
BarcodeReader.Read()accepts PDF files natively; Wynik generowania można osadzić w plikach PDF - Brak zależności od SkiaSharp: Niezależność od wykresu wersji SkiaSharp, co eliminuje konflikty NU1608 w MAUI i innych projektach
- Licencja komercyjna z umową SLA: cena od 749 do 5999 USD (Licencja wieczysta); includes commercial support and guaranteed update cadence
ReadingSpeedtuning:BarcodeReaderOptionsallows trading scan thoroughness for performance at volume
Porównanie funkcji
| Funkcja | BarcodeLib | IronBarcode |
|---|---|---|
| Generowanie BarCode'ów | Tak | Tak |
| Odczytywanie BarCode | Nie | Tak |
| Odczytywanie BarCodes z plików PDF | Nie | Tak |
| Konflikt zależności SkiaSharp | Tak (wersja 3.x) | Nie |
| Płynny, łańcuchowy interfejs API | Nie | Tak |
| Licencja | Apache 2.0 (bezpłatna) | 749–5999 USD na czas nieokreślony |
Szczegółowe porównanie funkcji
| Funkcja | BarcodeLib | IronBarcode |
|---|---|---|
| Generacja | ||
| Generowanie kodu 128 | Tak | Tak |
| Generowanie kodów EAN-13 / UPC-A | Tak | Tak |
| Generowanie kodów QR | Tak (podstawowe) | Tak (zaawansowane, z osadzeniem logo) |
| Ponad 25 symboli | Tak | Tak |
| Płynny, łańcuchowy interfejs API do generowania | Nie | Tak |
Direct byte[] output |
Manual (MemoryStream) |
.ToPngBinaryData() |
| Wynik generowania pliku PDF | Nie | Tak |
| Czytanie | ||
| Odczytywanie BarCode z obrazu | Nie | Tak (BarcodeReader.Read()) |
| Odczytywanie BarCode'ów z plików PDF | Nie | Tak (język ojczysty, bez dodatkowej biblioteki) |
| Wykrywanie wielu kodów BarCode | Nie | Tak (ExpectMultipleBarcodes) |
| Dostosowanie szybkości czytania | Nie dotyczy | Tak (ReadingSpeed enum) |
| Platforma | ||
| Windows | Tak | Tak |
| Linux / macOS | Częściowe (zależne od SkiaSharp) | Pełna |
| Docker / kontener | Wymagana konfiguracja | Tak |
| Kompatybilność z projektem MAUI | Conflict risk (NU1608) | Nie conflict |
| .NET Framework 4.6.2+ | Tak | Tak |
| .NET 6–9 | Tak (SkiaSharp 3.x required) | Tak |
| Licencjonowanie | ||
| Open source / free | Tak (Apache 2.0) | Nie |
| Commercial support / SLA | Nie | Tak |
| Licencja key required | Nie | Tak |
| Ceny | Free | 749–5999 USD na czas nieokreślony |
Barcode Generation API
The generation APIs represent different design philosophies: BarcodeLib uses mutable instance configuration while IronBarcode uses an immutable fluent chain.
BarcodeLib Approach
BarcodeLib requires constructing an instance and setting properties before calling Encode(). Output is a System.Drawing.Image object:
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
The System.Drawing.Image return type means byte array output requires a MemoryStream intermediary. The IncludeLabel property is a boolean toggle — BarcodeLib automatically renders the encoded data string as the visible label beneath the bars.
Podejście IronBarcode
IronBarcode's generation is fully static. Configuration chains after CreateBarcode(), and output methods terminate the chain directly:
// 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() returns the byte array directly — no intermediate Image or MemoryStream object. .AddAnnotationTextBelowBarcode() takes the label string explicitly, giving control over what text appears below the bars. For advanced generation scenarios, see the IronBarcode barcode generation documentation.
Możliwość odczytu BarCode
Reading is the most significant functional boundary between these two libraries. BarcodeLib has no reading capability; IronBarcode includes a full reading engine in the same package.
BarcodeLib Approach
BarcodeLib has no reading API. There is no Decode(), Scan(), or ReadBarcode() method. The absence is not a version difference — reading has never been part of the library's design. Any attempt to call a decode method results in a compile error:
// 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") ' No definition
' Dim value = b.Scan("barcode.png") ' No definition
' Dim value = b.ReadBarcode("barcode.png") ' No definition
' The only thing you can do is generate:
Dim img As Image = b.Encode(TYPE.CODE128, "PRODUCT-12345") ' this works
Teams that need both generation and reading alongside BarcodeLib must add a second library — typically ZXing.Net — which introduces its own dependency management burden and a second API surface to maintain.
Podejście IronBarcode
BarcodeReader.Read() accepts image files, PDF files, streams, and System.Drawing.Bitmap objects. Reading from a PDF requires no additional library:
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)
The ReadingSpeed enum allows tuning scan performance for high-volume scenarios. For guidance on reading configuration, see the IronBarcode reading documentation.
SkiaSharp Dependency Conflict
The SkiaSharp dependency introduced in BarcodeLib 3.x creates a class of conflict that does not exist in IronBarcode.
BarcodeLib Approach
Starting with BarcodeLib 3.x, the library introduced SkiaSharp as a graphics backend to replace System.Drawing.Common, which became Windows-only after .NET 6. BarcodeLib pins to a specific SkiaSharp version range. If a project already uses SkiaSharp through another dependency — common in MAUI projects using SkiaSharp.Views.Maui and Microsoft.Maui.Graphics — the resolved version may fall outside BarcodeLib's expected range. The result is a NU1608 warning at minimum and an assembly binding failure at runtime at worst:
warning NU1608: Detected package version outside of dependency constraint:
BarcodeLib 3.1.5 requires SkiaSharp (>= 2.88.7 && < 2.89.0) but
version SkiaSharp 3.116.1 was resolved.
Forcing a resolution through explicit package references adds complexity without a guarantee:
<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>
Even with explicit overrides, compatibility depends on BarcodeLib's internal API calls matching what the pinned version exposes. There is no support contract that guarantees a fix on a schedule that matters to the project.
Podejście IronBarcode
IronBarcode does not share the SkiaSharp dependency graph with application code. There is no version negotiation to manage, no NU1608 to diagnose, and no runtime assembly binding risk tied to SkiaSharp version resolution. MAUI projects, Blazor projects, and any other application that depends on SkiaSharp can install IronBarcode without any version conflict. For MAUI-specific integration patterns, see the IronBarcode MAUI documentation.
Przewodnik po mapowaniu API
| BarcodeLib | IronBarcode |
|---|---|
new Barcode() |
Static API — no instance required |
b.Encode(TYPE.CODE128, "data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
b.IncludeLabel = true |
.AddAnnotationTextBelowBarcode("text") |
b.Width = 300; b.Height = 100 |
.ResizeTo(300, 100) |
Returns 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 (also QRCodeWriter) |
| Brak API do odczytu | BarcodeReader.Read(path) |
| SkiaSharp version conflict in MAUI | Nie conflicting dependencies |
When Teams Consider Moving from BarcodeLib to IronBarcode
Reading Requirement Appears
A system that has generated shipping labels for months receives a new requirement: the application must also process returned labels from suppliers. The warehouse integration needs to parse barcodes from inbound shipment manifests. A document management system needs to index barcodes on scanned PDFs. BarcodeLib cannot fulfill any of these requirements — the reading API does not exist. The team evaluates adding ZXing.Net alongside BarcodeLib, weighs the dual-library maintenance burden and the two separate dependency graphs, and decides the cleaner path is a library that handles both generation and reading under a single NuGet install.
SkiaSharp Conflict in a MAUI Project
A team adds BarcodeLib to an existing MAUI application and immediately encounters NU1608 warnings during restore. They investigate, identify the version mismatch between BarcodeLib's expected SkiaSharp range and the version MAUI requires, add explicit <PackageReference> overrides to force a resolution, and get the build to pass. Then they encounter a runtime crash on device when SkiaSharp's native binaries load the wrong version. The fix requires deeper investigation into the assembly binding log. Switching to IronBarcode removes the conflict at the root — not by finding a compatible SkiaSharp version, but by eliminating the shared dependency entirely.
PDF Barcode Processing Required
Applications that generate PDF documents with embedded barcodes — invoices, work orders, shipping manifests — sometimes need to read those barcodes back during downstream processing. BarcodeLib generates barcode images but has no PDF support on either end. Reading barcodes from a PDF with BarcodeLib requires rendering the PDF to images first using a separate PDF library, then passing those images to a separate reading library. IronBarcode handles the full chain natively: BarcodeReader.Read("file.pdf") traverses every page and returns all detected barcodes without an intermediate rendering step.
QR Code Features Outgrow Basic Generation
Projects that initially required only basic Generowanie kodów QR often evolve to need logo embedding, color customization, or error correction level configuration. BarcodeLib supports QR codes through TYPE.QR_Code but provides no options beyond the standard Width, Height, and IncludeLabel properties. IronBarcode's QRCodeWriter exposes logo embedding, color control, and error correction tuning through chained methods. Teams whose QR code requirements have expanded past what BarcodeLib's basic implementation supports find that the feature gap drives the migration decision.
Typowe kwestie związane z migracją
Instance API to Static Fluent API
BarcodeLib code uses a mutable object pattern: create a Barcode instance, set properties, call Encode(). IronBarcode uses a static fluent pattern: call BarcodeWriter.CreateBarcode(), chain configuration methods, terminate with an output method. Existing code that stores a Barcode instance as a field or passes it between methods will need restructuring. The typical change is replacing the property-setter block with a method chain:
// 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 to Direct Output
BarcodeLib returns System.Drawing.Image, which requires MemoryStream to produce bytes. Any code typed to Image or System.Drawing.Image will need updating. IronBarcode's fluent chain terminates with the desired output format directly — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — removing the need for the intermediate image object and the MemoryStream step.
TYPE Enum to BarcodeEncoding Enum
BarcodeLib uses the TYPE class with uppercase constants such as TYPE.CODE128. IronBarcode uses the BarcodeEncoding enum with PascalCase values such as BarcodeEncoding.Code128. The values map directly. A grep for TYPE\. across .cs files identifies all occurrences that need updating, and a systematic find-and-replace covers the common formats: CODE128 → Code128, EAN13 → EAN13, UPCA → UPCA, QR_Code → QRCode.
SkiaSharp Reference Cleanup
Projects that added explicit <PackageReference Include="SkiaSharp"> entries only to resolve BarcodeLib's NU1608 warnings can remove those overrides after switching to IronBarcode. The dotnet list package --include-transitive command confirms whether SkiaSharp is still required by other packages in the project before removing it.
Dodatkowe możliwości IronBarcode
Beyond the direct generation and reading comparison, IronBarcode includes capabilities that BarcodeLib does not address:
- QR code logo embedding:
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")embeds a brand logo at the center of a QR code with automatic error correction adjustment - PDF barcode extraction:
BarcodeReader.Read("file.pdf")reads barcodes from every page of a PDF document without a separate PDF rendering library - Multi-barcode detection:
BarcodeReaderOptions.ExpectMultipleBarcodes = truedetects and returns all barcodes present in a single image - Reading speed configuration:
ReadingSpeed.Faster,ReadingSpeed.Balanced, andReadingSpeed.ExtremeDetailtune the scan engine for throughput vs. accuracy - Styled QR code generation: Color, finder pattern style, and error correction level are configurable through chained methods on
QRCodeWriter - Stream and Bitmap input for reading:
BarcodeReader.Read()accepts file paths, streams,System.Drawing.Bitmap, andAnyBitmapinputs
Zgodność z platformą .NET i gotowość na przyszłość
IronBarcode obsługuje platformy od .NET Framework 4.6.2 do .NET 9 i jest regularnie aktualizowany zgodnie z harmonogramem wydawania aktualizacji platformy .NET firmy Microsoft. Wraz ze wzrostem popularności platformy .NET 10 do 2026 r. aktywny rozwój IronBarcode zapewnia kompatybilność z przyszłymi wersjami bez konieczności wprowadzania zmian w projektach. Biblioteka działa bez modyfikacji w systemach Windows, Linux, macOS, Docker, Azure i AWS Lambda. BarcodeLib prowadzi również aktywny rozwój społecznościowy, chociaż jego obsługa wielu platform w serii 3.x zależy od zgodności wersji SkiaSharp omówionej w sekcjach porównawczych powyżej. W przypadku projektów opartych na nowoczesnym środowisku .NET w systemie Linux lub w kontenerach, niezależna od zależności, wielopłatformowa architektura IronBarcode pozwala uniknąć negocjacji wersji, które wprowadza backend SkiaSharp biblioteki BarcodeLib.
Wnioski
BarcodeLib i IronBarcode reprezentują różne zakresy rozwiązań do pracy z kodami kreskowymi w środowisku .NET. BarcodeLib to wyspecjalizowana, bezpłatna biblioteka służąca wyłącznie do generowania kodów kreskowych, która niezawodnie spełnia swoje zadanie od prawie dwóch dekad. Biblioteka IronBarcode to komercyjna biblioteka obsługująca zarówno generowanie, jak i odczyt kodów kreskowych, wyposażona w statyczny, płynny interfejs API i niezależna od biblioteki SkiaSharp. Różnica nie dotyczy jakości w ramach wspólnego zakresu — dotyczy samego zakresu.
BarcodeLib pozostaje naprawdę dobrym wyborem dla projektów o stabilnych wymaganiach dotyczących wyłącznie generowania w systemie Windows lub w środowiskach, w których kontrolowana jest wersja SkiaSharp. Licencja Apache 2.0, zerowy koszt i proste API sprawiają, że jest to praktyczne rozwiązanie dla systemów etykiet wysyłkowych, generatorów etykiet magazynowych i podobnych aplikacji, które nigdy nie będą wymagały skanowania kodów kreskowych. 12 milionów pobrań pokazuje, że duża część programistów .NET ma właśnie taki przypadek użycia.
IronBarcode staje się bardziej praktycznym wyborem, gdy wymagania wykraczają poza samo generowanie obrazów: gdy potrzebna jest funkcja odczytu, gdy projekt jest aplikacją MAUI lub wielopłatformową, w której prawdopodobne są konflikty wersji SkiaSharp, gdy przetwarzanie kodów kreskowych w plikach PDF jest planowane lub gdy wymagańe są funkcje kodów QR wykraczające poza podstawowe generowanie. Koszt licencji komercyjnej stanowi kwestię kluczową — dla zespołów, których wymagania pokrywają się z tym, co IronBarcode wnosi w stosunku do BarcodeLib, rozwiązanie w postaci pojedynczego pakietu oraz komercyjna umowa SLA stanowią wartość dodaną.
Szczera ocena jest taka, że większość zespołów nie zaczyna od IronBarcode od samego początku. Zaczynają od BarcodeLib, ponieważ jest to rozwiązanie bezpłatne i wystarczające. Przechodzą na IronBarcode, gdy ich wymagania wykraczają poza zakres możliwości BarcodeLib, który ogranicza się wyłącznie do generowania kodów. Migracja jest dobrze udokumentówana, a zmiany w interfejsie API są przewidywalne. Zrozumienie, gdzie kończy się BarcodeLib — a konkretnie, że kończy się na generowaniu — jest praktyczną informacją potrzebną do podjęcia właściwej decyzji dotyczącej czasu.
Często Zadawane Pytania
Czym jest BarcodeLib?
BarcodeLib to biblioteka kodów kreskowych .NET służąca do generowania i odczytywania kodów kreskowych w aplikacjach C#. Jest to jedna z kilku alternatyw rozważanych przez programistów przy wyborze rozwiązania do obsługi kodów kreskowych w projektach .NET.
Jakie są główne różnice między BarcodeLib a IronBarcode?
IronBarcode wykorzystuje statyczne, bezstanowe API, które nie wymaga zarządzania instancjami, podczas gdy BarcodeLib zazwyczaj wymaga utworzenia instancji i konfiguracji przed użyciem. IronBarcode zapewnia również natywną obsługę plików PDF, automatyczne wykrywanie formatów oraz licencjonowanie za pomocą jednego klucza we wszystkich środowiskach.
Czy licencja na IronBarcode jest łatwiejsza do uzyskania niż na BarcodeLib?
IronBarcode wykorzystuje pojedynczy klucz licencyjny obejmujący zarówno wdrożenia deweloperskie, jak i produkcyjne. Upraszcza to procesy CI/CD oraz konfiguracje Docker w porównaniu z systemami licencyjnymi, które oddzielają klucze SDK od kluczy środowiska uruchomieniowego.
Czy IronBarcode obsługuje wszystkie formaty kodów kreskowych obsługiwane przez BarcodeLib?
IronBarcode obsługuje ponad 30 symboli kodów kreskowych, w tym QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 i wiele innych. Automatyczne wykrywanie formatu oznacza, że nie jest wymagane jawne wyliczanie formatów.
Czy IronBarcode obsługuje natywne odczytywanie kodów kreskowych z plików PDF?
Tak. IronBarcode odczytuje kody kreskowe bezpośrednio z plików PDF za pomocą BarcodeReader.Read("document.pdf") bez konieczności korzystania z oddzielnej biblioteki do renderowania plików PDF. Wyniki dla każdej strony obejmują numer strony, format kodu kreskowego, wartość oraz wskaźnik pewności.
W jaki sposób IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu z BarcodeLib?
Metody statyczne IronBarcode są bezstanowe i z natury bezpieczne dla wątków, co umożliwia bezpośrednie użycie Parallel.ForEach bez zarządzania instancjami dla poszczególnych wątków. Nie ma ograniczeń przepustowości w żadnym przedziale cenowym.
Jakie wersje .NET obsługuje IronBarcode?
IronBarcode obsługuje .NET Framework 4.6.2+, .NET Core 3.1 oraz .NET 5, 6, 7, 8 i 9 w jednym pakiecie NuGet. Obsługiwane platformy to Windows x64/x86, Linux x64 oraz macOS x64/ARM.
Jak zainstalować IronBarcode w projekcie .NET?
Zainstaluj IronBarcode za pomocą NuGet: uruchom polecenie „Install-Package IronBarCode” w konsoli menedżera pakietów lub „dotnet add package IronBarCode” w interfejsie CLI. Nie są wymagane żadne dodatkowe instalatory SDK ani pliki uruchomieniowe.
Czy mogę przetestować IronBarcode przed zakupem, w przeciwieństwie do BarcodeLib?
Tak. Tryb próbny IronBarcode zwraca pełne, zdekodowane wartości BarCode — tylko wygenerowane obrazy wyjściowe są opatrzone znakiem wodnym. Przed podjęciem decyzji o zakupie można sprawdzić dokładność odczytu na własnych dokumentach.
Jaka jest różnica w cenie między BarcodeLib a IronBarcode?
Cena IronBarcode zaczyna się od 749 USD za Licencję wieczystą dla jednego programisty, obejmującą etapy rozwoju i produkcji. Szczegóły dotyczące cen i opcji zakupu hurtowego są dostępne na stronie licencyjnej IronBarcode. Nie ma wymogu posiadania oddzielnej licencji na środowisko uruchomieniowe.
Czy migracja z BarcodeLib do IronBarcode jest prosta?
Migracja z BarcodeLib do IronBarcode polega przede wszystkim na zastąpieniu wywołań API opartych na instancjach statycznymi metodami IronBarcode, usunięciu standardowych fragmentów kodu dotyczących licencji oraz aktualizacji nazw właściwości wyników. Większość migracji wiąże się raczej z redukcją kodu niż z jego dodawaniem.
Czy IronBarcode generuje kody QR z logo?
Tak. Funkcja QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") osadza obraz marki w kodzie QR w sposób natywny z konfigurowalną korekcją błędów. Kolorowe kody QR są również obsługiwane za pomocą funkcji ChangeBarCodeColor().

