Przejdź do treści stopki
PORóWNAJ Z INNYMI KOMPONENTAMI

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 Barcode i skonfigurowania wlasciwosci etykiety i czcionki przed wywolaniem Encode()
  • Zwraca SKImage: Wyjsciem jest obiekt obrazu SkiaSharp, ktory wymaga kroku SKEncodedImageFormat i 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.Type na 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.Common SkiaSharp, 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
$vbLabelText   $csharpLabel

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: BarcodeWriter obsluguje generacje; BarcodeReader obsluguje 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() zwraca byte[] bez kroku MemoryStream
  • 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
  • ReadingSpeed tuning: BarcodeReaderOptions pozwala 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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

.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)
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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

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)
$vbLabelText   $csharpLabel

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: Code128Code128, Ean13EAN13, UpcAUPCA, Code39Code39. 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 = true wykrywa i zwraca wszystkie obecne kody kreskowe w jednym obrazie
  • Konfiguracja predkosci odczytu: ReadingSpeed.Faster, ReadingSpeed.Balanced i ReadingSpeed.ExtremeDetail dostosowuja 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.Bitmap i AnyBitmap jako 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().

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie