Accusoft BarcodeXpress vs IronBarcode: Porównanie bibliotek kodów kreskowych C#
BarcodeLibkontra IronBarcode: gdzie zatrzymuje się generator open source
BarcodeLib to długotrwała biblioteka .NET open-source, którą większość programistów odkrywa, że może tylko tworzyć kody kreskowe. Część z nich odkrywa również konflikt wersji SkiaSharp — zazwyczaj w najgorszym możliwym momencie, gdy właśnie dodaliBarcodeLibdo projektu MAUI lub Blazor, który już zależy od SkiaSharp, a kompilacja zaczyna zgłaszać ostrzeżenia NU1608. Ten artykuł obejmuje oba te zagadki.BarcodeLibto legalna biblioteka o jasnym zastosowaniu. Praktyczną kwestią jest zrozumienie, 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. Jest aktywna od 2007 roku i wspiera około 30 wariantów symbologii jednowymiarowych. Licencja Apache 2.0 zezwala na bezpłatne wykorzystanie do celów komercyjnych. Dla czystej generacji liniowego kodu kreskowego — tworzenia obrazu z ciągu znaków — działa niezawodnie i dobrze spełnia tę rolę przez wiele lat aktywnego używania.
API jest oparte na instancjach. Tworz obiekt Barcode, ustawiasz wlasciwosci i wywolujesz Encode() z typem stalym, ciagiem danych i wymiarami pikseli. Rezultatem jest SKImage (SkiaSharp), ktory nastepnie kodujesz i zapisujesz lub strumieniujesz w razie potrzeby. Ten proces pracy jest przystępny, a dla projektów, gdzie wymagania ograniczają się do drukowania obrazów kodów kreskowych liniowych — etykiety wysyłkowe, tagi inwentarzowe, etykiety cenowe w handlu detalicznym — jest wystarczający.
Kluczowe cechy architektury BarcodeLib:
- Zakres wyłącznie generowania: Biblioteka nie posiada żadnego API do odczytu ani dekodowania; jego cała publiczna powierzchnia jest zorientowana na tworzenie obrazów z danych tekstowych
- API oparte na instancjach: Kazda operacja wymaga zainstancjonowania obiektu
Barcodei skonfigurowania wlasciwosci etykiety i czcionki przed wywolaniemEncode() - Zwraca
SKImage: Wyjsciem jest obiekt obrazu SkiaSharp, ktory wymaga krokuSKEncodedImageFormati strumienia, aby uzyskac plik lub tablice bajtow. - Tylko symbologie 1D: Obsługiwane jest około 30 formatów liniowych, w tym Code128, EAN-13, UPC-A i Code39; enum
BarcodeStandard.Typena biezacym zrodle 3.x nie zawiera kodu QR, Data Matrix, PDF417, Aztec ani innych pozycji 2D - Zaleznosc SkiaSharp (v3.x): Seria 3.x zastapila
System.Drawing.CommonSkiaSharp, aby umozliwic wsparcie wieloplatformowe; 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 generowaniaBarcodeLibCore
Standardowy przeplyw pracy generowaniaBarcodeLibwymaga stworzenia instancji, skonfigurowania wlasciwosci i wywolania Encode() z wymiarami:
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
Imports BarcodeStandard
Imports SkiaSharp
Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)
Using stream = File.OpenWrite("barcode.png")
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
Oto pełny przebieg procesu tworzenia. Wzorzec ustawiania wlasciwosci jest projektem: konfiguracja odbywa sie na instancji przed wywolaniem Encode(), a zwracana wartosc to SKImage, ktora nalezy zakodowac i zapisac do strumienia.
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. Opcje konfiguracji lancuchuja sie na wynik BarcodeWriter.CreateBarcode() lub QRCodeWriter.CreateQrCode(). Metody wyjsciowe na koncu lancucha — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — usuwaja posredni wzorzec MemoryStream, ktorego wymaga BarcodeLib. Reading jest częścią tego samego pakietu i nie wymaga utrzymywania oddzielnej biblioteki ani integracji z ZXing.Net.
Kluczowe cechy IronBarcode:
- Generowanie i odczytywanie w jednym pakiecie:
BarcodeWriterobsluguje generacje;BarcodeReaderobsluguje odczyt; oba są dostarczane w ramach tej samej instalacji NuGet - Statyczne, płynne API: nie wymaga instancjonowania; konfiguracja lancuchuje sie po
CreateBarcode()uzywajac metod plynnosciowych - Bezposrednie wyjscie tablicy bajtow:
.ToPngBinaryData()zwracabyte[]bez krokuMemoryStream - Wsparcie PDF na obu koncach:
BarcodeReader.Read()przyjmuje pliki PDF natywnie; 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); zawiera wsparcie komercyjne i gwarantowany cykl aktualizacji
ReadingSpeedtuning:BarcodeReaderOptionspozwala zamieniac dokladne skanowanie na wydajnosc przy duzym wolumenie
Porównanie funkcji
| Funkcja | BarcodeLib | IronBarcode |
|---|---|---|
| Generowanie BarCode'ów | Tak (tylko 1D) | Tak (1D i 2D) |
| Odczytywanie BarCode | Nie | Tak |
| 2D symbologies (QR, Data Matrix, PDF417, Aztec) | Nie | Tak |
| Odczytywanie BarCodes z plików PDF | Nie | Tak |
| Zależność SkiaSharp w grafie | 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 | Nie | Tak (z osadzaniem loga) |
| Data Matrix / PDF417 / Aztec | Nie | Tak |
| Pokrycie symbologii 1D | ~30 wariantów | 30+ wariantów |
| Płynny, łańcuchowy interfejs API do generowania | Nie | Tak |
Bezposrednie wyjscie byte[] |
Ręczne (kodowanie strumieniowe) | .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 | Ryzyko konfliktu (NU1608) | Bez konfliktu |
| .NET Framework 4.6.2+ | Tak | Tak |
| .NET 6–9 | Tak (wymagana SkiaSharp 3.x) | Tak |
| Licencjonowanie | ||
| Open source / bezpłatne | Tak (Apache 2.0) | Nie |
| Wsparcie komercyjne / SLA | Nie | Tak |
| Wymagany klucz licencyjny | Nie | Tak |
| Ceny | Bezpłatne | 749–5999 USD na czas nieokreślony |
API generowania kodów kreskowych
API generacji reprezentują różne filozofie projektowania:BarcodeLibużywa modyfikowalnej konfiguracji instancji, podczas gdy IronBarcode używa płynnego łączenia na statycznym punkcie wejściowym.
Podejście BarcodeLib
BarcodeLib wymaga skonstruowania instancji i ustawienia wlasciwosci przed wywolaniem Encode() z wymiarami. Wyjsciem jest SKImage:
using BarcodeStandard;
using SkiaSharp;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
using BarcodeStandard;
using SkiaSharp;
public byte[] GenerateCode128(string data)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
Imports BarcodeStandard
Imports SkiaSharp
Public Function GenerateCode128(data As String) As Byte()
Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return ms.ToArray()
End Using
End Function
Typ zwracany SKImage oznacza, ze wyjscie tablicy bajtow wymaga wywolania kodowania SKEncodedImageFormat i MemoryStream. Wlasciwosc IncludeLabel jest przelacznikiem logicznym -BarcodeLibrenderuje zakodowany ciag danych jako widoczna etykiete pod paskami.
Podejście IronBarcode
Generacja w IronBarcode jest całkowicie statyczna. Konfiguracja lancuchuje sie po CreateBarcode(), a metody wyjsciowe koncza lancuch bezposrednio:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.ToPngBinaryData();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public byte[] GenerateCode128(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.ToPngBinaryData();
}
Imports IronBarCode
Public Function GenerateCode128(data As String) As Byte()
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.AddBarcodeValueTextBelowBarcode() _
.ToPngBinaryData()
End Function
.ToPngBinaryData() zwraca tablice bajtow bezposrednio - brak posrednich obiektow Image lub MemoryStream. .AddBarcodeValueTextBelowBarcode() renderuje zakodowany ciag danych jako etykiete pod paskami. Dla zaawansowanych scenariuszy generacji, zobacz dokumentację generacji kodu kreskowego IronBarcode.
Możliwość odczytu BarCode
Odczyt jest najważniejszą granicą funkcjonalną między tymi dwiema bibliotekami.BarcodeLibnie ma zdolności odczytu;IronBarcode zawiera pełny silnik odczytu w tym samym pakiecie.
Podejście BarcodeLib
BarcodeLib nie ma API do odczytu. Nie ma metody Decode(), Scan() ani ReadBarcode(). Odczyt nigdy nie był częścią projektu biblioteki. Każda próba wywołania metody dekodowania prowadzi do błędu kompilacji:
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png"); // does not exist
// b.Scan("barcode.png"); // does not exist
// b.ReadBarcode("barcode.png"); // does not exist
// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png"); // does not exist
// b.Scan("barcode.png"); // does not exist
// b.ReadBarcode("barcode.png"); // does not exist
// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
Imports BarcodeStandard
Imports SkiaSharp
Dim b = New Barcode()
' There is no Decode, Scan, or Read method on Barcode.
' b.Decode("barcode.png") ' does not exist
' b.Scan("barcode.png") ' does not exist
' b.ReadBarcode("barcode.png") ' does not exist
' The only public operation is generation:
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)
Zespoły, które potrzebują zarówno generowania, jak i odczytu oprócz BarcodeLib, muszą dodać drugą bibliotekę — zazwyczaj ZXing.Net — co wprowadza własne obciążenie zarządzaniem zależnościami i drugą powierzchnię API do utrzymania.
Podejście IronBarcode
BarcodeReader.Read() przyjmuje pliki obrazow, pliki PDF, strumienie i obiekty System.Drawing.Bitmap. Odczyt z pliku PDF nie wymaga dodatkowej biblioteki:
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)
enum ReadingSpeed pozwala na tuning wydajnosci skanowania w scenariuszach o duzym wolumenie. Aby uzyskać wskazówki dotyczące konfiguracji odczytu, zobacz dokumentację odczytu IronBarcode.
Konflikt zależności SkiaSharp
Zależność SkiaSharp wprowadzona wBarcodeLib3.x tworzy klasę konfliktu, która nie istnieje w IronBarcode.
Podejście BarcodeLib
Poczawszy odBarcodeLib3.x, biblioteka wprowadzila SkiaSharp jako zaplecze graficzne w miejsce System.Drawing.Common, ktore stalo sie tylko dlaWindowspo .NET 6.BarcodeLib3.1.5 oglasza SkiaSharp >= 2.88.8. Jesli projekt juz uzywa SkiaSharp przez inna zaleznosc - co jest powszechne w projektach MAUI uzywajacych SkiaSharp.Views.Maui i Microsoft.Maui.Graphics, ktore zmierzaja w kierunku SkiaSharp 3.x - rozwiazane wersje moga sie nie zgadzac. Rezultatem jest ostrzeżenie NU1608 jako minimum, a w najgorszym przypadku błędne wiązanie zestawu podczas działania:
warning NU1608: Detected package version outside of dependency constraint:
BarcodeLib 3.1.5 requires SkiaSharp (>= 2.88.8) but
version SkiaSharp 3.116.1 was resolved.
Wymuszanie rozwiązania przez jawne odwołania do pakietu to jedna z dróg, chociaż nie gwarantuje zgodności podczas działania:
<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>
Nawet z jawnymi nadpisaniami, kompatybilność zależy od zgodności wezwań API wewnętrznychBarcodeLibz tym, co eksponuje rozwiązana wersja SkiaSharp. Jako projekt utrzymywany przez społeczność,BarcodeLibnie ma przywiązanego kontraktu wsparcia komercyjnego do swojego cyklu wydań.
Podejście IronBarcode
IronBarcode nie udostępnia grafu zależności SkiaSharp z kodem aplikacji. Nie ma negocjacji wersji do zarządzania, nie ma NU1608 do diagnozowania i nie ma ryzyka wiązania podczas działania związane z rozwiązaniem wersji SkiaSharp. Projekty MAUI, projekty Blazor i każda inna aplikacja, która zależy od SkiaSharp, mogą zainstalowaćIronBarcode bez żadnego konfliktu wersji. Dla wzorców integracji specyficznych dla MAUI, zobacz dokumentację MAUI IronBarcode.
Przewodnik po mapowaniu API
| BarcodeLib | IronBarcode |
|---|---|
new Barcode() |
Statyczne API — nie jest wymagany egzemplarz |
b.Encode(BarcodeStandard.Type.Code128, "data", 300, 100) |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).ResizeTo(300, 100) |
b.IncludeLabel = true |
.AddBarcodeValueTextBelowBarcode() |
Zwraca SKImage |
.SaveAsPng(path) / .ToPngBinaryData() |
BarcodeStandard.Type.Code128 |
BarcodeEncoding.Code128 |
BarcodeStandard.Type.Code39 |
BarcodeEncoding.Code39 |
BarcodeStandard.Type.Ean13 |
BarcodeEncoding.EAN13 |
BarcodeStandard.Type.UpcA |
BarcodeEncoding.UPCA |
| Nieobsługiwane (brak 2D w BarcodeLib) | BarcodeEncoding.QRCode (rowniez QRCodeWriter) |
| Brak API do odczytu | BarcodeReader.Read(path) |
| SkiaSharp w grafie zależności | Brak zależności SkiaSharp |
Kiedy zespoły rozważają przejście zBarcodeLibna IronBarcode
Pojawia się potrzeba odczytu
System, który generował etykiety wysyłkowe przez miesiące, otrzymuje nowy wymóg: aplikacja musi również przetwarzać zwracane etykiety od dostawców. Integracja z magazynem wymaga parsowania kodów kreskowych z manifestów przesyłek przychodzących. System zarządzania dokumentami musi indeksować kody kreskowe na skanowanych PDF-ach.BarcodeLibnie może spełnić żadnego z tych wymogów — API do odczytu nie istnieje. Zespół ocenia dodanie ZXing.Net obok BarcodeLib, waży obciążenia związane z utrzymaniem dwóch bibliotek oraz dwóch oddzielnych grafów zależności i decyduje się na czyszlicsze rozwiązanie jako biblioteka, która obsługuje zarówno generowanie, jak i odczytywanie w ramach jednej instalacji NuGet.
Konflikt SkiaSharp w projekcie MAUI
Zespół dodajeBarcodeLibdo istniejącej aplikacji MAUI i natychmiast napotka ostrzeżenia NU1608 podczas przywracania. Badaja, identyfikuja niezgodnosc wersji miedzyBarcodeLibi SkiaSharp oczekiwanym zakresem a wersja wymagana przez MAUI, dodaja jawne <PackageReference> nadpisania, aby wymusic rozwiazanie, i doprowadzaja do przejscia budowy. Następnie napotykają awarię podczas działania na urządzeniu, gdy natywne binarne SkiaSharp ładują złą wersję. Naprawa wymaga głębszego spojrzenia na dziennik wiązania zestawu. Przekierowanie na IronBarcode usuwa problem u źródła — nie przez znalezienie kompatybilnej wersji SkiaSharp, ale przez całkowite wyeliminowanie wspólnej zależności.
Potrzebne przetwarzanie kodów kreskowych z PDF
Aplikacje, które generują dokumenty PDF z osadzonymi kodami kreskowymi — faktury, zlecenia pracy, manifests wysyłki — czasami muszą ponownie odczytać te kody kreskowe podczas przetwarzania w dół strumienia.BarcodeLibgeneruje obrazy kodów kreskowych, ale nie obsługuje PDF-ów na żadnym końcu. Odczytanie kodów kreskowych z PDF za pomocąBarcodeLibwymaga najpierw renderowania PDF do obrazów za pomocą oddzielnej biblioteki PDF, a następnie przekazywania tych obrazów do oddzielnej biblioteki odczytu.IronBarcode obsluguje caly lancuch natywnie: BarcodeReader.Read("file.pdf") przechodzi przez kazda strone I zwraca wszystkie wykryte kody kreskowe bez posredniego kroku renderowania.
Pojawia się potrzeba kodów QR lub innej symboliki 2D
Projekty, które początkowo wymagały tylko liniowych kodów kreskowych, często ewoluują, aby potrzebować kodów QR, macierzy danych, PDF417 lub wyjścia Aztec.BarcodeLibnie generuje zadnej symboilgii 2D w swojej serii 3.x — enum BarcodeStandard.Type nie zawiera zadnych pozycji QR lub innych pozycji 2D — wiec kazde zapotrzebowanie na 2D oznacza dodanie drugiej biblioteki lub calkowite zastapienie BarcodeLib. IronBarcode's QRCodeWriter i BarcodeWriter pokrywaja QR Code (z osadzaniem logo, kontrola kolorów i tuningiem korekcji bledow), Data Matrix, PDF417 i Aztec przez ten sam plynny API. Zepoły, których wymagania dotyczące symboliki przesuwają się w kierunku 2D, stwierdzają, że luka ta kieruje decyzję o migracji.
Typowe kwestie związane z migracją
API instancyjne do statycznego API płynnego
KodBarcodeLibkorzysta z wzorca obiektu mutowalnego: utworz instancje Barcode, ustaw wlasciwosci, wywolaj Encode().IronBarcode uzywa statycznego wzorca plynnego: wywolaj BarcodeWriter.CreateBarcode(), lancuchowe metody konfiguracji, zakoncz metoda wyjsciowa. Istniejacy kod przechowujacy instancje Barcode jako pole lub przekazywany miedzy metodami bedzie wymagal restrukturyzacji. Typowa zmiana to zamiana bloku ustawiającego właściwości na łańcuchowe metody:
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.SaveAsPng(outputPath);
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.AddBarcodeValueTextBelowBarcode()
.SaveAsPng(outputPath);
' The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.AddBarcodeValueTextBelowBarcode() _
.SaveAsPng(outputPath)
SKImage do bezpośredniego wyjścia
BarcodeLib 3.x zwraca SKImage, co wymaga SKEncodedImageFormat i strumienia do produkcji bajtow. Kazdy kod typowany na SKImage lub przechodzacy przez image.Encode(...).SaveTo(stream) wymaga aktualizacji. Lancuch plynnosci IronBarcode konczy sie bezposrednio w wybranym formacie wyjsciowym — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — usuwajac potrzebe posredniego obiektu obrazu i kroku kodowania do strumienia.
Type Enum to BarcodeEncoding Enum
BarcodeLib 3.x uzywa BarcodeStandard.Type enum with wartosci PascalCase takie jak BarcodeStandard.Type.Code128.IronBarcode uzywa BarcodeEncoding enum z wartosciami takimi jak BarcodeEncoding.Code128. Wartosci 1D mapuja sie bezposrednio: Code128 → Code128, Ean13 → EAN13, UpcA → UPCA, Code39 → Code39. A grep dla BarcodeStandard.Type. w plikach .cs identyfikuje wszystkie wystapienia wymagajace aktualizacji.
Usunięcie odniesienia do SkiaSharp
Projekty, ktore dodaly jawne wpisy <PackageReference Include="SkiaSharp"> jedynie w celu rozwiazania ostrzezeniaBarcodeLibNU1608, moga usunac te nadpisania po przejsciu na IronBarcode. Polecenie dotnet list package --include-transitive potwierdza, czy SkiaSharp jest nadal wymagany przez inne pakiety w projekcie przed jego usunieciem.
Dodatkowe możliwości IronBarcode
Poza bezpośrednim porównaniem generacji i odczytu,IronBarcode zawiera funkcje, którychBarcodeLibnie obejmuje:
- Osadzanie logo kodu QR:
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")osadza logo marki w centrum kodu QR z automatyczna regulacja korekcji bledow - Ekstrakcja kodu kreskowego PDF:
BarcodeReader.Read("file.pdf")odczytuje kody kreskowe z kazdej strony dokumentu PDF bez oddzielnej biblioteki renderowania PDF - Wykrywanie wielu kodów kreskowych:
BarcodeReaderOptions.ExpectMultipleBarcodes = truewykrywa i zwraca wszystkie obecne kody kreskowe w jednym obrazie - Konfiguracja predkosci odczytu:
ReadingSpeed.Faster,ReadingSpeed.BalancediReadingSpeed.ExtremeDetaildostosowuja silnik skanowania dla przepustowosci w porownaniu do dokładnosci - Generowanie stylizowanego kodu QR: Kolor, styl wzorca znalezienia i poziom korekcji błędów sa konfigurowalne przez lancuchowe metody na
QRCodeWriter - Strumien i wejscie Bitmap do odczytu:
BarcodeReader.Read()przyjmuje sciezki do plikow, strumienie,System.Drawing.BitmapiAnyBitmapjako wejscie
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.BarcodeLibprowadzi 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.BarcodeLibto 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 odpowiednim wyborem dla projektów o stabilnych wymaganiach dotyczących tylko liniowej generacji w środowiskachWindowslub w środowiskach, gdzie wersja SkiaSharp jest kontrolowana. Jego licencja Apache 2.0, zerowe koszty i bezpośrednie API czynią go praktycznym rozwiązaniem dla systemów generowania etykiet wysyłkowych, generatorów etykiet inwentaryzacyjnych i podobnych aplikacji, które nigdy nie będą musiały skanować kodów kreskowych ani wytwarzać symboliki 2D.
IronBarcode staje się bardziej praktycznym wyborem, gdy wymagania wykraczają poza liniowe generowanie obrazów: gdy istnieje potrzeba odczytu, gdy projekt to aplikacja MAUI lub aplikacja wieloplatformowa, w której prawdopodobne są konflikty wersji SkiaSharp, gdy na mapie drogowej jest przetwarzanie kodów kreskowych z PDF lub gdy wymagane są jakiekolwiek symboliki 2D (kod QR, macierz danych, PDF417, Aztec). Koszt komercyjnej licencji reprezentuje pytanie progowe — dla zespołów, których wymagania pokrywają się z tym, co IronBarcode dodaje ponad BarcodeLib, jednopakietowe rozwiązanie i wsparcie komercyjne są wartością wymiany.
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 udokumentowana, 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().

