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

Barcoder vs IronBarcode: Porównanie bibliotek kodów kreskowych C#

Aby wygenerować pojedynczy plik PNG za pomocą BarCode, należy zainstalować dwa pakiety, zaimportować trzy przestrzenie nazw, zakodować za pomocą klasy specyficznej dla formatu, utworzyć renderer z obiektem opcji, otworzyć strumień, wykonać renderowanie do niego i zamknąć strumień. To cały przebieg idealnego scenariusza — a dotyczy on wyłącznie pisania. BarCode nie posiada żadnego API do odczytu. Licencja MIT biblioteki oraz jej charakter open source sprawiają, że na pierwszy rzut oka jest ona atrakcyjna, zwłaszcza dla zespołów starających się unikać zależności komercyjnych. Jednak fragmentaryczna architektura — co najmniej dwa pakiety NuGet, inna klasa kodera dla każdego formatu BARCODE oraz potok renderowania, który całkowicie oddziela kodowanie od wyjścia — powoduje realne utrudnienia, gdy tylko wymagania wykraczają poza najprostszy scenariusz generowania jednego formatu BARCODE.

Zrozumienie BarCode

Barcoder to biblioteka open source do generowania kodów kreskowych w środowisku .NET, dostępna w serwisie NuGet na licencji MIT. Koduje dane do formatów BARCODE, w tym Code128, QR, DataMatrix, EAN-13, PDF417 i innych. Filozofia projektowania całkowicie oddziela kodowanie od renderowania — biblioteka podstawowa generuje obiekt IBarcode (strukturę danych), a oddzielny pakiet renderujący konwertuje ten obiekt na obraz.

Praktyczne konsekwencje tego projektu są widoczne już od pierwszej instalacji. Aby możliwe było generowanie plików PNG, wymagańe są dwa pakiety NuGet: Barcoder do kodowania oraz Barcoder.Renderer.Image do renderowania. Jeśli potrzebny jest również plik SVG, należy dodać trzeci pakiet — Barcoder.Renderer.Svg. Pakiety te są wersjonowane niezależnie, co oznacza, że aktualizacje jednego z nich nie są automatycznie synchronizowane z pozostałymi, a utrzymanie ich synchronizacji w ramach projektu staje się powtarzającym się zadaniem konserwacyjnym.

Kluczowe cechy architektury BarCode:

  • Dwa pakiety NuGet wymagańe do generowania plików PNG: Barcoder do kodowania oraz Barcoder.Renderer.Image do renderowania do formatów graficznych
  • Klasy koderów specyficzne dla formatów: Każdy typ BarCode ma swój własny koder w osobnej przestrzeni nazw — Code128Encoder, QrEncoder, DataMatrixEncoder i tak dalej
  • IBarcode nie ma metod wyjściowych: Wynikiem kodowania jest obiekt danych zwykłych. Należy osobno utworzyć renderer, otworzyć strumień, wykonać renderowanie do niego i zamknąć go
  • Renderer obrazów przestał obsługiwać platformę .NET Framework: zespoły korzystające z platformy .NET Framework nie mogą używać pakietu renderera obrazów
  • Brak możliwości odczytu: BarCode nie może dekodować kodów kreskowych z obrazów, plików ani żadnego innego źródła
  • Niezależne wersjonowanie pakietów: Barcoder i Barcoder.Renderer.Image mogą się rozbiegać podczas aktualizacji zależności

Proces tworzenia pakietów wielopłatformowych

Opis instalacji od razu ilustruje różnicę w zakresie. W przypadku BarCode podstawowy wynik w formacie PNG wymaga dwóch oddzielnych pakietów:

dotnet add package Barcoder
dotnet add package Barcoder.Renderer.Image
dotnet add package Barcoder
dotnet add package Barcoder.Renderer.Image
SHELL

Pełny przebieg generowania kodu kreskowego Code128 i zapisywania go jako pliku PNG wymaga trzech importów przestrzeni nazw, wywołania kodera specyficznego dla formatu, konstrukcji renderera z obiektem opcji, strumienia plików oraz wywołania renderowania:

// Barcoder: 3 namespaces, 7 steps to save a PNG
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
// Barcoder: 3 namespaces, 7 steps to save a PNG
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 2,
    .BarHeightFor1DBarcode = 50
})

Using stream As FileStream = File.OpenWrite("barcode.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

Zmiana formatów kodów kreskowych nie jest zmianą parametrów — wymaga zaimportowania innej przestrzeni nazw i wywołania innej klasy. Code128Encoder.Encode przyjmuje wartość typu bool dla includeChecksum, QrEncoder.Encode przyjmuje poziom korekcji błędów i dwie dodatkowe wartości typu bool, a DataMatrixEncoder.Encode przyjmuje tylko ciąg znaków. Nie ma jednolitego interfejsu do tworzenia BARCODE'ów w określonym formacie.

Zrozumienie IronBarcode

IronBarcode to komercyjna biblioteka kodów kreskowych .NET, która obejmuje generowanie i odczyt w ramach jednego pakietu NuGet. Wykorzystuje statyczny model API zbudowany wokół dwóch głównych klas — BarcodeWriter do generowania i BarcodeReader do odczytu — i kieruje cały wybór formatów przez wyliczenie BarcodeEncoding, a nie przez klasy lub przestrzenie nazw specyficzne dla formatów.

Biblioteka została zaprojektowana tak, aby zminimalizować czas potrzebny od napisania pierwszej linii kodu BarCode do uzyskania działającego wyniku. Generowanie, odczyt, obsługa plików PDF, kody QR z osadzonymi logo oraz wszystkie typy danych wyjściowych są zawarte w jednym pakiecie z jedną wersją do śledzenia.

Kluczowe cechy IronBarcode:

  • Pojedynczy pakiet NuGet: IronBarcode obejmuje wszystkie funkcje — generowanie, odczyt, PDF i wszystkie formaty wyjściowe
  • Ujednolicony wybór formatu: Wszystkie typy BarCode są obsługiwane poprzez wartości wyliczeniowe BarcodeEncoding; no format-specific imports or classes
  • Metody wyjściowe obiektu wynikowego: GeneratedBarcode udostępnia bezpośrednio SaveAsPng, ToPngBinaryData, ToStream, SaveAsSvg oraz ResizeTo
  • Natywna obsługa odczytu: BarcodeReader.Read() dekoduje pliki graficzne, tablice bajtów, strumienie i pliki PDF bez konieczności korzystania z dodatkowej biblioteki
  • Obsługa MAUI, Docker, AWS Lambda i Azure: udokumentówane cele wdrożeniowe wykraczające poza standardowe scenariusze komputerów stacjonarnych i serwerów
  • Pełna obsługa platformy .NET Framework i nowoczesnego środowiska .NET: od .NET Framework 4.6.2 do .NET 9

Porównanie funkcji

Funkcja BarCode IronBarcode
Wymagane pakiety NuGet 2 minimum 1
Generowanie BarCode Tak Tak
Odczytywanie BarCode Nie Tak
Licencja MIT (open source) Komercjalne
Obsługa platformy .NET Framework Renderer obrazów typu "drop-in" .NET Framework 4.6.2+
Odczytywanie plików PDF Nie Tak
QR z logo Nie Tak

Szczegółowe porównanie funkcji

Funkcja BarCode IronBarcode
Generacja
Generowanie kodu 128 Tak Tak
Generowanie kodów QR Tak Tak
Generowanie kodów DataMatrix Tak Tak
EAN-13, PDF417 Tak Tak
QR z wbudowanym logo Nie Tak — .AddBrandLogo(path)
Format wybrany za pomocą wyliczenia Nie — osobna klasa kodera dla każdego formatu Tak — BarcodeEncoding enum
Wynik
Wynik w formacie PNG Tak (za pośrednictwem BarCode.Renderer.Image) Tak — .SaveAsPng()
Wynik w formacie SVG Tak (za pośrednictwem Barcoder.Renderer.Svg) Tak — .SaveAsSvg()
Wyjście danych binarnych Tak (za pośrednictwem MemoryStream) Tak — .ToPngBinaryData()
Wyjście strumienia Tak (ręczne zarządzanie strumieniem) Tak — .ToStream()
API bezpośredniej zmiany rozmiaru Nie — PixelSize tylko współczynnik skali Tak — .ResizeTo(width, height)
Czytanie
Odczyt z pliku graficznego Nie Tak
Czytaj z pliku PDF Nie Tak
Odczyt z strumienia Nie Tak
Wykrywanie wielu kodów BarCode Nie Tak — ExpectMultipleBarcodes
Kontrola prędkości czytania Nie Tak — ReadingSpeed enum
Platforma
.NET Core / .NET 5+ Tak Tak
.NET Framework Renderer obrazów typu "drop-in" .NET Framework 4.6.2+
.NET 9 Niejasna / ograniczona aktywność Tak
MAUI (iOS, Android, Windows, macOS) Nie Tak
Docker / Azure / AWS Lambda Brak dokumentacji Tak
Opakowanie
Ryzyko związane z niezależnym wersjonowaniem pakietów Tak Nie — pojedynczy pakiet
Przestrzeń nazw według formatu Tak Nie — pojedynczy using IronBarCode
Licencjonowanie
Model licencji MIT (open source) Komercjalne
Ceny Bezpłatne Lite 749 USD, Plus 1499 USD, Professional 2999 USD, Unlimited 5999 USD

API do wyboru i generowania formatów

Wybór struktury wyboru formatu BarCode ma wpływ na wszystkie części kodu generującego BarCodes.

Podejście BarCode

BarCode kieruje wybór formatu przez oddzielne klasy koderów w oddzielnych przestrzeniach nazw. Zmiana formatów oznacza dodanie nowej dyrektywy using oraz użycie innej klasy z inną sygnaturą metody:

// Code128
using Barcoder.Code128;
IBarcode barcode = Code128Encoder.Encode("data", false);

// QR Code — different namespace, different class, different parameters
using Barcoder.Qr;
IBarcode barcode = QrEncoder.Encode("data", ErrorCorrectionLevel.M, false, false);

// DataMatrix — different namespace, different class again
using Barcoder.DataMatrix;
IBarcode barcode = DataMatrixEncoder.Encode("data");
// Code128
using Barcoder.Code128;
IBarcode barcode = Code128Encoder.Encode("data", false);

// QR Code — different namespace, different class, different parameters
using Barcoder.Qr;
IBarcode barcode = QrEncoder.Encode("data", ErrorCorrectionLevel.M, false, false);

// DataMatrix — different namespace, different class again
using Barcoder.DataMatrix;
IBarcode barcode = DataMatrixEncoder.Encode("data");
Imports Barcoder.Code128
Imports Barcoder.Qr
Imports Barcoder.DataMatrix

' Code128
Dim barcode As IBarcode = Code128Encoder.Encode("data", False)

' QR Code — different namespace, different class, different parameters
barcode = QrEncoder.Encode("data", ErrorCorrectionLevel.M, False, False)

' DataMatrix — different namespace, different class again
barcode = DataMatrixEncoder.Encode("data")
$vbLabelText   $csharpLabel

Każdy koder ma własną umowę dotyczącą parametrów. Dodanie nowego formatu do istniejącego projektu to nie tylko zmiana jednego słowa — to import nowej przestrzeni nazw, nowa klasa do opanowania i nowe parametry do zrozumieniuiuiuiuia.

Podejście IronBarcode

IronBarcode kieruje cały wybór formatów przez wyliczenie BarcodeEncoding w ujednoliconej klasie BarcodeWriter. Dodanie nowego formatu wymaga zmiany jednej litery w wartości wyliczenia:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Code128
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).SaveAsPng("code128.png");

// DataMatrix — same class, same method, one word changed
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix).SaveAsPng("dm.png");

// QR — dedicated optimized method
QRCodeWriter.CreateQrCode("data", 500).SaveAsPng("qr.png");

// QR with logo
QRCodeWriter.CreateQrCode("data", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Code128
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).SaveAsPng("code128.png");

// DataMatrix — same class, same method, one word changed
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix).SaveAsPng("dm.png");

// QR — dedicated optimized method
QRCodeWriter.CreateQrCode("data", 500).SaveAsPng("qr.png");

// QR with logo
QRCodeWriter.CreateQrCode("data", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
Imports IronBarCode

' Code128
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).SaveAsPng("code128.png")

' DataMatrix — same class, same method, one word changed
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix).SaveAsPng("dm.png")

' QR — dedicated optimized method
QRCodeWriter.CreateQrCode("data", 500).SaveAsPng("qr.png")

' QR with logo
QRCodeWriter.CreateQrCode("data", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")
$vbLabelText   $csharpLabel

W celu użycia w środowisku produkcyjnym należy dodać klucz licencyjny podczas uruchamiania aplikacji:

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

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

Dokumentacja dotycząca generowania kodów kreskowych w IronBarcode obejmuje pełen zakres opcji generowania, w tym stylizację, marginesy i dostosowywanie kolorów.

Opcje renderowania i wyjścia

Uzyskiwanie danych z kodów kreskowych w różnych formach — pliku, danych binarnych, strumienia — to powszechne wymaganie, z którym każda biblioteka radzi sobie w zupełnie inny sposób.

Podejście BarCode

Oddzielenie kodowania od renderowania w BarCoderze jest oparte na zasadach architektury, ale powoduje dodatkowe obciążenie przy każdej zmianie formatu wyjściowego. Zapisanie do pliku wymaga otwarcia FileStream. Pobieranie danych binarnych wymaga otwarcia MemoryStream i wywołania ToArray(). Każdy scenariusz wyjściowy wymaga skonstruowania renderera z obiektem opcji:

// Barcoder: changing output dimensions requires rebuilding the renderer
var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 3,
    BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode-large.png");
renderer.Render(barcode, stream);

// Getting binary data — different stream, same renderer pipeline
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
// Barcoder: changing output dimensions requires rebuilding the renderer
var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 3,
    BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode-large.png");
renderer.Render(barcode, stream);

// Getting binary data — different stream, same renderer pipeline
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
Imports System.IO

' Barcoder: changing output dimensions requires rebuilding the renderer
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 3,
    .BarHeightFor1DBarcode = 80
})

Using stream As FileStream = File.OpenWrite("barcode-large.png")
    renderer.Render(barcode, stream)
End Using

' Getting binary data — different stream, same renderer pipeline
Using ms As New MemoryStream()
    renderer.Render(barcode, ms)
    Dim pngBytes As Byte() = ms.ToArray()
End Using
$vbLabelText   $csharpLabel

Kontrola rozmiaru jest pośrednia: PixelSize jest mnożnikiem skali rozmiaru modułu BarCode, a nie bezpośrednią specyfikacją szerokości i wysokości.

Podejście IronBarcode

IronBarcode zwraca obiekt GeneratedBarcode, z którego można uzyskać dowolną formę wyjściową poprzez łańcuch wywołań metod. Bez tworzenia rendererów, bez zarządzania strumieniami:

using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100);

// File
barcode.SaveAsPng("barcode.png");

// Bytes
byte[] pngBytes = barcode.ToPngBinaryData();

// Stream
System.IO.Stream stream = barcode.ToStream();
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100);

// File
barcode.SaveAsPng("barcode.png");

// Bytes
byte[] pngBytes = barcode.ToPngBinaryData();

// Stream
System.IO.Stream stream = barcode.ToStream();
Imports IronBarCode

Dim barcode = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100)

' File
barcode.SaveAsPng("barcode.png")

' Bytes
Dim pngBytes As Byte() = barcode.ToPngBinaryData()

' Stream
Dim stream As System.IO.Stream = barcode.ToStream()
$vbLabelText   $csharpLabel

.ResizeTo(width, height) przyjmuje wyraźne wymiary w pikselach i łączy się z dowolną metodą wyjściową na tym samym obiekcie.

Odczytywanie BarCodes

Brak API odczytu w BarCode jest twardą granicą architektoniczną, a nie wyborem konfiguracyjnym.

Podejście BarCode

BarCode nie posiada funkcji odczytu ani dekodowania. W bibliotece nie ma API, nie planuje się wprowadzenia API ani nie ma żadnych rozwiązań zastępczych. Jeśli aplikacja musi odczytywać kody kreskowe, obok biblioteki BarCode należy dodać drugą bibliotekę — oddzielną zależność NuGet z własnym interfejsem API i własną wersją do śledzenia. Oznacza to co najmniej dwie zależności związane z odczytem: BarCode do generowania i coś innego do odczytu.

Podejście IronBarcode

IronBarcode obsługuje zarówno generowanie, jak i odczyt za pomocą tego samego pakietu i spójnych wzorców API. Metoda BarcodeReader.Read() akceptuje natywnie pliki graficzne, tablice bajtów, strumienie i pliki PDF:

using IronBarCode;

// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
    Console.WriteLine(result.Value);
    Console.WriteLine(result.Format);
}

// Czytaj z pliku PDF — no conversion step, no extra dependency
var pdfResults = BarcodeReader.Read("document.pdf");

// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-label.png", options);
using IronBarCode;

// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
    Console.WriteLine(result.Value);
    Console.WriteLine(result.Format);
}

// Czytaj z pliku PDF — no conversion step, no extra dependency
var pdfResults = BarcodeReader.Read("document.pdf");

// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-label.png", options);
Imports IronBarCode

' Read from image file
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
    Console.WriteLine(result.Value)
    Console.WriteLine(result.Format)
Next

' Czytaj z pliku PDF — no conversion step, no extra dependency
Dim pdfResults = BarcodeReader.Read("document.pdf")

' Read multiple barcodes from one image
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-label.png", options)
$vbLabelText   $csharpLabel

Odczyt z plików PDF jest natywny — bez pośredniego wyodrębniania obrazów, bez biblioteki konwersji, bez dodatkowych pakietów. Dokumentacja dotycząca odczytu kodów kreskowych IronBarcode obejmuje wielostronicowe pliki PDF, odczyt obszarów zainteresowania oraz optymalizację wydajności.

Przewodnik po mapowaniu API

BarCode IronBarcode
Code128Encoder.Encode("data", false) BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
QrEncoder.Encode("data", ErrorCorrectionLevel.M, false, false) QRCodeWriter.CreateQrCode("data", 500)
DataMatrixEncoder.Encode("data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix)
new ImageRenderer(new ImageRendererOptions { ... }) Niepotrzebne — wynik jest łańcuchowany z GeneratedBarcode
renderer.Render(barcode, stream) .SaveAsPng(path) / .ToPngBinaryData() / .ToStream()
IBarcode (struktura danych, brak metod wyjściowych) GeneratedBarcode (zawiera SaveAsPng, ToPngBinaryData, ToStream, ResizeTo itp.)
Barcoder + Barcoder.Renderer.Image (2 pakiety) IronBarcode (1 pakiet)
using Barcoder.Code128 using IronBarCode (pojedyncza przestrzeń nazw, wszystkie formaty)
using Barcoder.Qr using IronBarCode
using Barcoder.DataMatrix using IronBarCode
Brak API do odczytu BarcodeReader.Read(path / bytes / stream / pdf)
Brak renderera obrazów .NET Framework .NET Framework 4.6.2+
PixelSize + BarHeightFor1DBarcode opcje .ResizeTo(width, height)

Kiedy zespoły rozważają przejście z BarCode na IronBarcode

Do wymagań dodano czytanie

Wiele projektów zaczyna się od zwykłych procesów generowania — drukowania etykiet, tworzenia kodów dla dokumentów, umieszczania BarCodes w raportach. BarCode obsługuje te projekty od samego początku. Gdy ta sama aplikacja będzie później musiała weryfikować przychodzące kody kreskowe, przetwarzać zeskanowane dokumenty lub dekodować kody kreskowe z przesłanych plików PDF, BarCode nie oferuje żadnego rozwiązania. Zespół musi ocenić drugą bibliotekę, zapoznać się z jej API, zarządzać jej wersją NuGet oddzielnie oraz zająć się integracją między dwiema bibliotekami. Zespoły, które osiągają ten etap, często konsolidują się w bibliotece obsługującej obie strony, zamiast utrzymywać dwie oddzielne zależności związane z BARCODE'ami.

Złamanie zgodności z platformą .NET Framework

Barcoder.Renderer.Image zrezygnowało z obsługi .NET Framework. Zespoły zajmujące się utrzymaniem usług lub aplikacji desktopowych w środowisku .NET Framework 4.x, które aktualizują pakiet renderera obrazów podczas rutynowej konserwacji zależności, napotykają błąd kompilacji. Nie jest to błąd konfiguracji — jest to decyzja biblioteki dotycząca obsługi platformy. IronBarcode obsługuje platformy od .NET Framework 4.6.2 do .NET 9 bez specjalnych pakietów lub zależności warunkówych dla różnych środowisk docelowych.

Różnice w wersjach pakietów powodują problemy z koordynacją

Ponieważ wersje Barcoder i Barcoder.Renderer.Image są niezależne, aktualizacja jednej z nich bez drugiej podczas odświeżania zależności może spowodować subtelne niezgodności. W repozytorium zawierającym wiele projektów — z których każdy korzysta z innej wersji każdego pakietu renderującego — zapewnienie spójnego działania we wszystkich projektach staje się problemem koordynacyjnym, który rośnie wraz z wielkością zespołu. Zespoły, które przeszły na IronBarcode, zgłaszają, że zarządzanie jednym pakietem i jedną wersją całkowicie eliminuje tego typu problemy.

Zakres formatów rozszerza się z biegiem czasu

Projekt może rozpocząć się od etykiet Code128, a następnie dodać kody QR dla linków przeznaczonych dla klientów, a potem DataMatrix w celu spełnienia wymogów zgodności. W przypadku Barcodera każde dodanie formatu oznacza import nowej przestrzeni nazw, inną klasę kodera z innymi parametrami metod oraz potencjalnie nowy pakiet NuGet. W przypadku IronBarcode dodanie formatu polega na zmianie wartości wyliczeniowej BarcodeEncoding w istniejącym wywołaniu. Zespoły, których plany rozwoju obejmują rozszerzenie obsługi formatów kodów kreskowych, uważają model oparty na wyliczeniach za znacznie łatwiejszy w utrzymaniu.

Wymagania dotyczące MAUI i wdrażania wielopłatformowego

BarCode nie dokumentuje obsługi wdrożeń MAUI, Docker, AWS Lambda ani Azure. Zespoły tworzące wielopłatformowe aplikacje MAUI lub wdrażające przetwarzanie kodów kreskowych w infrastrukturze bezserwerowej zauważają, że dokumentacja i testy Barcodera nie obejmują tych celów. IronBarcode dokumentuje i aktywnie testuje wdrażanie na platformach iOS, Android, Windows, macOS MAUI, w kontenerach Docker oraz na głównych platformach chmurowych.

Typowe kwestie związane z migracją

Zmiana typu z IBarcode na GeneratedBarcode

Kod BarCode, który przechowuje zmienną IBarcode i przekazuje ją później do renderera, musi zostać zrefaktoryzowany. W IronBarcode GeneratedBarcode posiada własne metody wyjściowe — nie ma oddzielnego etapu renderowania. Każda sygnatura metody, która obecnie akceptuje IBarcode, powinna zostać zmieniona tak, aby akceptowała GeneratedBarcode, a wywołanie renderowania wewnątrz tej metody powinno stać się wywołaniem bezpośrednim, takim jak .SaveAsPng() lub .ToPngBinaryData(). System typów wskaże wszystkie miejsca wymagające aktualizacji podczas kompilacji — IBarcode nie zostanie rozwiązane po usunięciu pakietów BARCODE.

PixelSize Nie ma bezpośredniego odpowiednika

PixelSize firmy BarCode to mnożnik skali naturalnego rozmiaru modułu BARCODE, a nie konkretny wymiar w pikselach. Szerokość wydruku zależy od zawartości BarCode, formatu oraz mnożnika w połączeniu. IronBarcode używa .ResizeTo(width, height) z wyraźnymi wymiarami w pikselach. Podczas migracji zmierz rzeczywiste wymiary wyjściowe generowane przez istniejący kod BARCODE i użyj tych wartości w wywołaniu .ResizeTo():

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .ResizeTo(300, 80)
    .SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .ResizeTo(300, 80)
    .SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
    .ResizeTo(300, 80) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

Konsolidacja przestrzeni nazw

Projekty BarCode gromadzą instrukcje using Barcoder.* — po jednej dla każdego używanego formatu. Podczas migracji wszystkie te elementy zostaną zredukowane do pojedynczego using IronBarCode;. Wyszukanie using Barcoder w całym rozwiązaniu pozwoli zidentyfikować wszystkie pliki wymagające aktualizacji. Liczba plików, których to dotyczy, jest zazwyczaj większa niż zespoły się spodziewają, ponieważ każdy plik związany z formatem BarCode importował własną przestrzeń nazw specyficzną dla tego formatu.

Zmiany ścieżki wyjściowej SVG

Projekty wykorzystujące Barcoder.Renderer.Svg i klasę SvgRenderer zastępują potok renderowania bezpośrednim wywołaniem metody GeneratedBarcode:

// Before
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);

// After
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .SaveAsSvg("barcode.svg");
// Before
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);

// After
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .SaveAsSvg("barcode.svg");
Imports System.IO

' Before
Dim svgRenderer As New SvgRenderer()
Using stream As FileStream = File.OpenWrite("barcode.svg")
    svgRenderer.Render(barcode, stream)
End Using

' After
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
    .SaveAsSvg("barcode.svg")
$vbLabelText   $csharpLabel

Pakiet Barcoder.Renderer.Svg można usunąć po migracji wszystkich witryn renderujących SVG.

Dodatkowe możliwości IronBarcode

Oprócz wymienionych powyżej punktów porównawczych, IronBarcode zawiera funkcje, których BarCode nie posiada:

Zgodność z platformą .NET i gotowość na przyszłość

IronBarcode obsługuje .NET Framework 4.6.2, .NET Core 2.x, .NET 5, .NET 6, .NET 7, .NET 8 i .NET 9. Aktywny rozwój trwa, a regularne aktualizacje są częścią opublikowanego planu działania; zgodność z .NET 10 (spodziewana pod koniec 2026 r.) jest częścią opublikowanego planu działania. Renderer obrazów BarCode zrezygnował ze wsparcia dla .NET Framework, a aktywność w repozytorium była ograniczona w ostatnich wydaniach, co sprawia, że status kompatybilności biblioteki z .NET 9 i przyszłymi wersjami pozostaje niejasny. Dla zespołów, które potrzebują długiego okresu wsparcia i przewidywalnej kompatybilności z przyszłymi wersjami .NET, aktywne tempo wydawania nowych wersji przez IronBarcode zapewnia większą pewność.

Wnioski

Barcoder i IronBarcode mają zasadniczo różne zakresy działania. BarCode to biblioteka służąca wyłącznie do generowania, w której zachowano zasadniczy podział między kodowaniem a renderowaniem — struktura danych IBarcode i potok renderowania są z założenia odrębnymi warstwami. IronBarcode to kompletna biblioteka kodów kreskowych, w której generowanie i odczyt są obsługiwane przez jeden pakiet, jedną przestrzeń nazw i spójny statyczny interfejs API. Różnica w architekturze staje się najbardziej widoczna, gdy wymagania się rozszerzają: wielopakietowa, wieloprzestrzenna i bezodczytowa konstrukcja BarCode sprawia, że każde dodanie jest zadaniem strukturalnym, podczas gdy IronBarcode traktuje dodanie nowego formatu lub funkcji jako zmianę konfiguracji.

Barcoder to właściwy wybór, gdy projekt wymaga wyłącznie generowania, jest przeznaczony wyłącznie dla .NET Core, będzie korzystał z niewielkiej liczby formatów kodów kreskowych, a licencja MIT jest bezwzględnym wymogiem. Biblioteka działa zgodnie z dokumentacją w tych granicach, a w przypadku projektów o wąskim zakresie, bez wymagań dotyczących odczytu i bez celów .NET Framework, opcja open source o zerowym koszcie jest rozsądna.

IronBarcode to właściwy wybór, gdy projekt wymaga zarówno odczytu, jak i generowania, jest przeznaczony dla platformy .NET Framework lub wielopłatformowych wdrożeń MAUI, zakłada dodawanie formatów kodów kreskowych w miarę upływu czasu lub wymaga wdrożenia w środowiskach Docker lub chmury. Model pojedynczego pakietu i wybór formatu oparty na enum eliminują obciążenie, które kumuluje się w BarCode'ie wraz z rozwojem zakresu projektu.

Praktyczna decyzja sprowadza się do trajektorii. Projekt, który z pewnością pozostanie prostym generatorem jednego formatu bez wymagań dotyczących czytania, może być dobrze obsługiwany przez BarCode. Projekt, w którym wymagania dotyczące kodów kreskowych są niejasne — dodawanie formatów, dodawanie odczytu, wdrażanie na wielu platformach — napotka ograniczenia architektury Barcodera wcześniej niż się spodziewa. Obie biblioteki są rzetelnymi narzędziami; Pytanie brzmi, które z nich odpowiada rzeczywistemu zakresowi pracy.

Często Zadawane Pytania

Czym jest BarCoder?

Barcoder 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 Barcoder a IronBarcode?

IronBarcode wykorzystuje statyczne, bezstanowe API, które nie wymaga zarządzania instancjami, podczas gdy Barcoder zazwyczaj wymaga utworzenia i konfiguracji instancji 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 Barcoder?

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 Barcoder?

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 Barcoderem?

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ę wypróbować IronBarcode przed zakupem, w przeciwieństwie do Barcodera?

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 Barcoder 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 Barcoder do IronBarcode jest prosta?

Migracja z BarCode 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().

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie