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:
Barcoderdo kodowania orazBarcoder.Renderer.Imagedo 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,DataMatrixEncoderi tak dalej IBarcodenie 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:
BarcoderiBarcoder.Renderer.Imagemogą 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
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
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:
IronBarcodeobejmuje 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:
GeneratedBarcodeudostępnia bezpośrednioSaveAsPng,ToPngBinaryData,ToStream,SaveAsSvgorazResizeTo - 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")
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")
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"
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
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()
.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)
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")
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")
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:
- Kody QR z osadzonymi logo:
.AddBrandLogo(path)osadza obraz marki w środku kodu QR bez utraty możliwości skanowania - Natywny odczyt BarCODE-ów z plików PDF:
BarcodeReader.Read("document.pdf")przetwarza pliki PDF bezpośrednio, bez konieczności uprzedniego wyodrębniania obrazów - Wykrywanie wielu BARCODE-ów: opcja
ExpectMultipleBarcodesodczytuje wszystkie BARCODE-y z jednego obrazu lub strony PDF w jednym wywołaniu - Kontrola szybkości odczytu:
ReadingSpeed.Balanced,FasteriSlowerdostosowują kompromis między dokładnością a szybkością dla różnych przypadków użycia - Wdrażanie wielopłatformowe MAUI: cele MAUI dla systemów iOS, Android, Windows i macOS są aktywnie testowane i dokumentówane
- Docker i wdrażanie w chmurze: udokumentówane ścieżki wdrażania dla kontenerów Docker, AWS Lambda i Azure Functions
- Stylizacja i dostosowywanie BarCode'ów: dostosowywanie koloru, marginesów, tekstu adnotacji i tła w
GeneratedBarcode
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().

