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

Aspose.BarCode for .NET vs IronBarcode: Porównanie bibliotek kodów kreskowych C#

BarCode vs IronBarcode: Generowanie wielopaketowe vs jednopakietowe generowanie i odczyt

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, PDF417i innych. Filozofia projektowania calkowicie oddziela kodowanie od renderowania — podstawowa biblioteka tworzy obiekt IBarcode (struktura danych), a osobny pakiet renderujacy konwertuje ten obiekt na obraz.

Praktyczne konsekwencje tego projektu są widoczne już od pierwszej instalacji. Przed mozliwoscia uzyskania jakiegokolwiek wyjscia PNG wymagane sa dwa pakiety NuGet: Barcoder do kodowania i Barcoder.Renderer.Image do renderowania. Jesli wymagane jest rowniez wyjscie SVG, nalezy dodac 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 wymagane do uzyskania wyjscia PNG: Barcoder do kodowania i Barcoder.Renderer.Image do renderowania do formatow graficznych
  • Klasy enkoderow specyficznych dla formatu: Kazdy typ kodu kreskowego ma wlasny enkoder w swojej przestrzeni nazw — Code128Encoder, QrEncoder, DataMatrixEncoder i tak dalej
  • IBarcode nie ma metod wyjsciowych: Wynikiem kodowania jest zwykly obiekt danych. 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 Frameworknie 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
  • Niezalezne wersjonowanie pakietow: Barcoder i Barcoder.Renderer.Image moga sie rozdzielic w trakcie aktualizacji zaleznosci

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:

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);
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 bool dla includeChecksum, QrEncoder.Encode przyjmuje poziom korekty bledow i dwa dodatkowe bool, a DataMatrixEncoder.Encode przyjmuje tylko ciag znakow. 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. Uzywa modelu API statycznego zbudowanego wokol dwoch glownych klas — BarcodeWriter do generowania i BarcodeReader do czytania — oraz przeprowadza caly wybor formatu przez enum BarcodeEncoding zamiast przez klasy lub przestrzenie nazw specyficzne dla formatu.

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 cala funkcjonalnosc — generowanie, czytanie, PDF i wszystkie formaty wyjsciowe
  • Zunifikowany wybor formatu: Wszystkie typy kodow kreskowych adresowane sa przez wartosci enumeracji BarcodeEncoding; no format-specific imports or classes
  • Metody wyjsciowe na obiekcie wynikowym: GeneratedBarcode udostepnia bezposrednio SaveAsPng, ToPngBinaryData, ToStream, SaveAsSvg i ResizeTo
  • Natychmiastowa mozliwosc odczytu: BarcodeReader.Read() dekoduje z plikow graficznych, tablic bajtowych, strumieni i plikow PDF bez dodatkowej biblioteki
  • Obsługa MAUI, Docker, AWS Lambda i Azure: udokumentowane cele wdrożeniowe wykraczające poza standardowe scenariusze komputerów stacjonarnych i serwerów
  • Pełna obsługa platformy.NET Frameworki nowoczesnego środowiska .NET: od.NET Framework4.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 — enum BarcodeEncoding
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 — tylko PixelSize czynnik skalujacy 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 — enum ReadingSpeed
Platforma
.NET Core / .NET 5+ Tak Tak
.NET Framework Renderer obrazów typu "drop-in" .NET Framework 4.6.2+
.NET 9 Brak dokumentacji 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 formatow oznacza dodanie nowej dyrektywy using i uzycie innej klasy z inna sygnatura metody:

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

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

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

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

// DataMatrix
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
barcode = QrEncoder.Encode("data", ErrorCorrectionLevel.M, False, False)

' DataMatrix
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 zrozumienia.

Podejście IronBarcode

IronBarcode kieruje caly wybor formatu przez enum BarcodeEncoding w zunifikowanej 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
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix).SaveAsPng("dm.png");

// QR — dedicated 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
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix).SaveAsPng("dm.png");

// QR — dedicated 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
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix).SaveAsPng("dm.png")

' QR — dedicated 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-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-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. Aby zapisac do pliku, nalezy otworzyc FileStream. Aby uzyskac dane binarne, nalezy otworzyc MemoryStream i wywolac ToArray(). Każdy scenariusz wyjściowy wymaga skonstruowania renderera z obiektem opcji:

// File output
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);

// Binary data via MemoryStream
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
// File output
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);

// Binary data via MemoryStream
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
Imports System.IO

' File output
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 3,
    .BarHeightFor1DBarcode = 80
})
Using stream = File.OpenWrite("barcode-large.png")
    renderer.Render(barcode, stream)
End Using

' Binary data via MemoryStream
Using ms = New MemoryStream()
    renderer.Render(barcode, ms)
    Dim pngBytes As Byte() = ms.ToArray()
End Using
$vbLabelText   $csharpLabel

Kontrola rozmiaru jest posrednia: PixelSize jest mnoznikiem skali na rozmiarze modulu kodu kreskowego, a nie bezposrednim okresleniem szerokosci i wysokosci.

Podejście IronBarcode

IronBarcode zwraca obiekt GeneratedBarcode, z ktorego kazda forma wyjsciowa moze byc osiagnieta poprzez laczone wywolania 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 jawne wymiary pikseli i laczy sie z kazda metoda wyjsciowa 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() przyjmuje pliki graficzne, tablice bajtowe, strumienie i pliki PDF natywnie:

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 natively
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 natively
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 natively
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 — wyjscie jest laczone z GeneratedBarcode
renderer.Render(barcode, stream) .SaveAsPng(path) / .ToPngBinaryData() / .ToStream()
IBarcode (struktura danych, brak metod wyjsciowych) GeneratedBarcode (zawiera SaveAsPng, ToPngBinaryData, ToStream, ResizeTo itp.)
Barcoder + Barcoder.Renderer.Image (2 pakiety) IronBarcode (1 pakiet)
using Barcoder.Code128 using IronBarCode (pojedyncza przestrzen 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 przestal wspierac .NET Framework. Zespoły zajmujące się utrzymaniem usług lub aplikacji desktopowych w środowisku.NET Framework4.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 Framework4.6.2 do.NET 9bez specjalnych pakietów lub zależności warunkowych dla różnych środowisk docelowych.

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

Gdy Barcoder i Barcoder.Renderer.Image sa wersjonowane niezaleznie, aktualizacja jednego bez drugiego podczas odswiezania zaleznosci moze wprowadzic subtelne niezgodnosci. 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 IronBarcode, dodanie formatu to zmiana wartosci enum BarcodeEncoding w istniejacym wywolaniu. 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ą

IBarcode do zmiany typu GeneratedBarcode

Kod Barcoder, ktory przechowuje zmienna IBarcode i przekazuje ja do renderer'a pozniej, musi zostac przeksztalcony. W IronBarcodeGeneratedBarcode zawiera swoje wlasne metody wyjsciowe — nie ma osobnego kroku renderera. Kazda sygnatura metody, ktora obecnie przyjmuje IBarcode, powinna zostac zmieniona, aby przyjmowac GeneratedBarcode, a wywolanie renderowania w tej metodzie powinno stac sie bezposrednim wywolaniem, jak .SaveAsPng() lub .ToPngBinaryData(). System typow ujawni kazda lokalizacje, ktora wymaga aktualizacji podczas kompilacji — IBarcode nie bedzie rozwiazany po usunieciu pakietow Barcoder.

PixelSize nie ma bezposredniego odpowiednika

PixelSize BarCode jest mnoznikiem skalujacym na naturalnym rozmiarze modulu kodu kreskowego, a nie jawna wielkoscia pikseli. Szerokość wydruku zależy od zawartości BarCode, formatu oraz mnożnika w połączeniu.IronBarcode korzysta z .ResizeTo(width, height) z jawnymi wymiarami pikseli. Podczas migracji nalezy zmierzyc rzeczywiste wymiary wyjscia, jakie produkowane sa przez istniejacy kod Barcoder, i uzyc tych wartosci w wywolaniu .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 kumuluja oswiadczenia using Barcoder.* — jedno na uzyty format. Podczas migracji wszystkie one scalaja sie do pojedynczego using IronBarCode;. Wyszukiwanie using Barcoder w calej rozwiazaniu zidentyfikuje kazdy plik, ktory wymaga 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 korzystajace z Barcoder.Renderer.Svg oraz klasy SvgRenderer zastepuja potok renderer'a bezposrednim wywolaniem metody na 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 moze zostac usuniety, gdy wszystkie miejsca renderowania SVG zostana zmigrowane.

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 Framework4.6.2, .NET Core 2.x, .NET 5, .NET 6, .NET 7, .NET 8, i .NET 9, z regularnymi aktualizacjami. BarCode v3 porzucił wsparcie dla.NET Frameworkw pakiecie renderer. Dla zespołów, które potrzebują długiego okna wsparcia w całym.NET Frameworki nowoczesnych celach .NET, macierz zgodności jednokrotnego pakietu IronBarcode eliminuje potrzebę zarządzania warunkowymi zależnościami dla każdego celu.

Wnioski

Barcoder i IronBarcode odzwierciedlaja fundamentalnie rozne zakresy. BarCode to biblioteka tylko do generowania z zasadniczym rozdzieleniem miedzy kodowaniem a renderowaniem — struktura danych IBarcode i potok renderer'a sa zaprojektowane jako odrebne warstwy.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 Frameworklub 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().

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