Infragistics Barcode vs IronBarcode: Porównanie bibliotek kodów kreskowych C#
Odczyt BarCode'ów Infragistics działa w WPF. Aby to osiągnąć, potrzebna jest instancja BarcodeReader, procedurka obsługi zdarzeń DecodeComplete, TaskCompletionSource<string> do pomostowania wywołania zwrotnego do kodu asynchronicznego, BitmapImage ładowanie z URI oraz jawne bitowe OR wszystkich SymbologyType, które chcesz obsługiwać. Pominięcie jednej flagi — na przykład SymbologyType.EAN8 — spowoduje, że każdy BARCODE EAN-8 w obrazach nie zwróci żadnego wyniku. Bez wyjątków. Brak ostrzeżenia. Tylko pusty wynik.
To jest strona WPF. Po stronie WinForms pakiet Infragistics.Win.UltraWinBarcode zawiera kontrolki generujące, ale nie zawiera żadnej klasy czytnika. Jeśli chcesz odczytać kody kreskowe w projekcie WinForms, w pakiecie kodów kreskowych Infragistics nie ma nic, co można by wywołać. To samo dotyczy każdego kontrolera .NET Core, narzędzia konsolowego, funkcji Azure, komponentu Blazor Server lub kontenera Docker. Obsługa kodów kreskowych Infragistics istnieje w ramach interfejsu użytkownika: WPF obsługuje generowanie i odczyt oparty na zdarzeniach; WinForms obejmuje wyłącznie generowanie; wszystko inne zostaje pominięte.
W niniejszym porównaniu przeanalizowano, co ten podział oznacza w praktyce, a następnie przyjrzano się, w jaki sposób IronBarcode radzi sobie z tym samym zadaniem za pomocą jednego statycznego interfejsu API, który działa identycznie w każdym typie projektu.
Zrozumienie obsługi BarCode przez Infragistics
Infragistics jest jednym z najbardziej uznanych dostawców komponentów interfejsu użytkownika .NET. Pakiet Infragistics Ultimate — subskrypcja obejmująca funkcje kodów kreskowych — zawiera setki kontrolek dla WinForms, WPF, ASP.NET, Blazor i urządzeń mobilnych. Dla zespołów już korzystających z tabel, wykresów lub harmonogramów Infragistics kontrolki kodów kreskowych są logicznym dodatkiem: przecież już płacą za subskrypcję.
Obsługa BarCode nie jest jednak ujednoliconą biblioteką. Są to dwa oddzielne zestawy o odrębnych możliwościach, które tylko częściowo się pokrywają.
WinForms: UltraWinBarcode
Pakiet Infragistics.Win.UltraWinBarcode umożliwia generowanie BarCodes w aplikacjach WinForms za pośrednictwem klasy UltraWinBarcode. Interfejs API jest prosty:
// Infragistics WinForms generation
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
// Infragistics WinForms generation
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
Imports Infragistics.Win.UltraWinBarcode
Dim barcode As New UltraWinBarcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.SaveTo(outputPath)
Ustawiasz symbolikę, przypisujesz dane, wywołujesz SaveTo(). W scenariuszach wyłącznie generacyjnych w WinForms to działa. Wyliczenie Symbology obejmuje popularne formaty: Code128, Code39, QR, EAN13 i inne.
W tym zestawie nie ma czytnika. Nie ma klasy UltraBarcodeReader. Nie ma metody Scan(). Jeśli spróbujesz odczytać obraz BarCode w aplikacji WinForms, używając wyłącznie pakietu Infragistics.Win.UltraWinBarcode, nie ma czego wywołać.
WPF: XamBarcode i BarcodeReader
Strona WPF zawiera zarówno kontrolkę generowania (XamBarcode), jak i oddzielną klasę czytnika (BarcodeReader w Infragistics.Controls.Barcodes, z zestawu Infragistics.WPF.BarcodeReader). Odczyt jest sterowany zdarzeniami i zaprojektowany w oparciu o model wątków i obrazówania WPF.
Odczytanie kodu BarCode w WPF wymaga podłączenia zdarzenia DecodeComplete, załadowania obrazów jako obiektów BitmapSource zamiast ścieżek do plików oraz przekształcenia wzorca wywołania zwrotnego w coś, na co można czekać, jeśli kod jest asynchroniczny.
ASP.NET Core, Console, Docker: Nic
Nie ma pakietu BARCODE Infragistics, który obsługuje net8.0 bez zestawów interfejsu użytkownika WPF lub WinForms. Projekty ASP.NET Core, narzędzia konsolowe, Azure Functions, Blazor Server i kontenery Docker w systemie Linux nie mają opcji BarCode Infragistics. Biblioteka jest powiązana z frameworkiem interfejsu użytkownika.
Wzorzec czytania WPF
Oto jak w rzeczywistości wygląda odczyt BarCodes w WPF przy użyciu Infragistics:
// Infragistics WPF reading: event-driven, requires WPF assemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;
private BarcodeReader _reader;
private TaskCompletionSource<string> _result;
public InfragisticsBarcodeService()
{
_reader = new BarcodeReader();
_reader.DecodeComplete += OnDecodeComplete;
}
public async Task<string> ReadBarcodeAsync(string imagePath)
{
_result = new TaskCompletionSource<string>();
// Load as WPF BitmapSource — not a file path
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
// Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Trigger decode — result comes via callback
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbologyValue ?? "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}
// Infragistics WPF reading: event-driven, requires WPF assemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;
private BarcodeReader _reader;
private TaskCompletionSource<string> _result;
public InfragisticsBarcodeService()
{
_reader = new BarcodeReader();
_reader.DecodeComplete += OnDecodeComplete;
}
public async Task<string> ReadBarcodeAsync(string imagePath)
{
_result = new TaskCompletionSource<string>();
// Load as WPF BitmapSource — not a file path
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
// Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Trigger decode — result comes via callback
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbologyValue ?? "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}
Imports Infragistics.Controls.Barcodes
Imports System.Windows.Media.Imaging
Imports System.Threading.Tasks
Private _reader As BarcodeReader
Private _result As TaskCompletionSource(Of String)
Public Sub New()
_reader = New BarcodeReader()
AddHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
End Sub
Public Async Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
_result = New TaskCompletionSource(Of String)()
' Load as WPF BitmapSource — not a file path
Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))
' Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 Or
SymbologyType.Code39 Or
SymbologyType.QR Or
SymbologyType.EAN8 Or
SymbologyType.EAN13 Or
SymbologyType.UPCA Or
SymbologyType.DataMatrix Or
SymbologyType.Interleaved2of5
' Trigger decode — result comes via callback
_reader.Decode(bitmap)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(e.SymbologyValue, "No barcode found"))
End Sub
Public Sub Dispose()
If _reader IsNot Nothing Then
RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
_reader = Nothing
End If
End Sub
To około 35 wierszy kodu potrzebnego do odczytania jednego BARCODE'a. Opisz, co faktycznie się dzieje:
- Instancja
BarcodeReaderjest tworzona i utrzymywana jako pole. - Obsługa zdarzeń jest podłączona w konstruktorze.
- Każde wywołanie
ReadBarcodeAsynctworzy nowyTaskCompletionSource<string>przypisany do pola współdzielonego — co oznacza, że ta usługa nie jest bezpieczna dla wątków w obecnej postaci. Równoczesne wywołania nadpisałyby_result. - Obraz musi być ładowany jako
BitmapImagezUri— nie jako ciąg ścieżki do pliku, nie jako tablica bajtów, nie jako strumień. Decode()wyzwala zdarzenie asynchronicznie.TaskCompletionSourcestanowi łącznik między światem wywołań zwrotnych a światem async/await.- Funkcja wywołania zwrotnego wyodrębnia
e.SymbologyValue. - Metoda
Dispose()musi odłączyć procedurę obsługi zdarzeń, aby zapobiec wyciekom pamięci.
Żadna z tych logik nie dotyczy BarCodes. Jest to infrastruktura niezbędna do pracy w oparciu o projektowanie sterowane zdarzeniami. W kodzie produkcyjnym trzeba by też zająć się sytuacją, w której _result.Task nigdy się nie kończy — limit czasu, token anulowania lub jakieś zabezpieczenie przed tym, że zdarzenie nigdy nie zostanie wywołane.
Luka w WinForms
Luka w WinForms jest bardziej wyraźna, niż mogłoby się początkowo wydawać. Zespoły tworzące aplikacje WinForms często trafiają na stronę Infragistics poświęconą kodom kreskowym BARCODE, oczekując symetrycznego doświadczenia — generowania i odczytu w obu frameworkach UI. Okazuje się, że Infragistics.Win.UltraWinBarcode nie zapewnia żadnej możliwości odczytu.
Nie jest to przeoczenie w dokumentacji. Zestaw BarCode WinForms został zaprojektowany jako kontrolka generująca. Jeśli chcesz skanować kody kreskowe w aplikacji WinForms — na przykład odczytywać kod kreskowy z pliku obrazu przesłanego przez użytkownika lub dekodować kod kreskowy z obrazu z kamery — nie możesz tego zrobić za pomocą narzędzi do kodów kreskowych firmy Infragistics. Konieczne byłoby wprowadzenie zupełnie oddzielnej biblioteki, co osłabiłoby uzasadnienie dla wykorzystania Infragistics do generowania.
Ta asymetria stwarza naprawdę niezręczną sytuację dla zespołów realizujących projekty oparte na mieszanych frameworkach. Zespół posiadający zarówno klienta desktopowego WPF, jak i klienta desktopowego WinForms nie może używać Infragistics do odczytu kodów BarCode w projekcie WinForms, nawet jeśli używa Infragistics wszędzie indziej.
Specyfikacja symboliki: tryb cichej awarii
Właściwość flagi SymbologyTypes w czytniku WPF zasługuje na osobną sekcję, ponieważ jej tryb awarii jest subtelny i niebezpieczny w środowisku produkcyjnym.
Podczas konfiguracji czytnika należy wyraźnie połączyć za pomocą operatora OR wszystkie formaty BarCodes, które mają być obsługiwane:
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
' Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 Or
SymbologyType.Code39 Or
SymbologyType.QR Or
SymbologyType.EAN8 Or
SymbologyType.EAN13 Or
SymbologyType.UPCA Or
SymbologyType.DataMatrix Or
SymbologyType.Interleaved2of5
Jeśli obraz BARCODE zawiera kod kreskowy EAN-8, a SymbologyType.EAN8 nie znajduje się w flagach, e.SymbologyValue zwraca wartość null lub jest pusty. Zdarzenie decode nadal jest wywoływane. Nie jest zgłaszany żaden wyjątek. Osoba dzwoniąca otrzymuje komunikat "Nie znaleziono kodu BARCODE" i nie ma żadnej wskazówki, czy obraz był nieczytelny, czy po prostu nie został skonfigurowany.
W praktyce oznacza to:
- Wstępna konfiguracja działa poprawnie w przypadku formatów przetestowanych przez programistę.
- Do systemu wprowadzany jest nowy format BARCODE (dostawca zmienia rodzaj etykiety, nowa linia produktów wykorzystuje inną symbolikę).
- Odtwarzacz nie wyświetla żadnych obrazów w tym formacie.
- Błąd wygląda identycznie jak "obraz nie zawiera BarCODE-a", a nie "format nie został skonfigurowany".
Zespoły zajmujące się debugowaniem tego kodu poświęcają czas na sprawdzanie jakości obrazu, zanim zorientują się, że format ten nigdy nie znajdował się na liście flag.
IronBarcode nie posiada właściwości SymbologyTypes. Automatycznie wykrywa wszystkie ponad 50 obsługiwanych formatów przy każdym odczycie. Nie ma żadnej flagi, o której można by zapomnieć.
Matryca platform
Różnice w możliwościach poszczególnych platform to najprostszy sposób na zrozumieniuiuiuiuie ograniczeń architektonicznych:
| Platforma | Infragistics Generation | Infragistics Reading | Generowanie kodów kreskowych IronBarcode | Odczytywanie kodów kreskowych IronBarcode |
|---|---|---|---|---|
| WPF | Kontrolka XamBarcode | BarcodeReader (sterowany zdarzeniami) | Tak | Tak |
| WinForms | UltraWinBarcode | NIE DOSTĘPNE | Tak | Tak |
| ASP.NET Core | NIE DOSTĘPNE | NIE DOSTĘPNE | Tak | Tak |
| Konsola | NIE DOSTĘPNE | NIE DOSTĘPNE | Tak | Tak |
| Blazor Server | NIE DOSTĘPNE | NIE DOSTĘPNE | Tak | Tak |
| Docker / Linux | NIE DOSTĘPNE | NIE DOSTĘPNE | Tak | Tak |
| Azure Functions | NIE DOSTĘPNE | NIE DOSTĘPNE | Tak | Tak |
Ta tabela ilustruje, dłączego zespoły korzystające z rozwiązań wykraczających poza czyste aplikacje desktopowe WPF uważają obsługę BarCode przez Infragistics za niewystarczającą. W momencie, gdy projekt obejmuje zarówno WinForms, jak i ASP.NET Core — lub WPF i usługę działającą w tle — biblioteka kodów kreskowych Infragistics obejmuje tylko część kodu źródłowego.
Zrozumienie IronBarcode
IronBarcode to dedykowana biblioteka kodów kreskowych dla platformy .NET, niezależna od WinForms, WPF i innych frameworków interfejsu użytkownika. Ten sam pakiet NuGet, ta sama przestrzeń nazw i to samo API działają w każdym projekcie .NET: WinForms, WPF, ASP.NET Core, konsola, Blazor Server, Docker, Azure Functions, AWS Lambda.
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
Imports IronBarCode
' Read — 2 lines, any platform
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
BarcodeReader.Read() jest metodą statyczną. Nie ma instancji do zarządzania, nie ma zdarzeń do podłączenia, nie ma TaskCompletionSource do łączenia wzorców wywołań zwrotnych. Akceptuje ciąg znaków ścieżki do pliku, tablicę bajtów, Stream lub tablicę dowolnego z tych elementów do przetwarzania wsadowego.
W przypadku generowania BarcodeWriter.CreateBarcode() zwraca obiekt BARCODE, który można zapisać w formacie PNG, JPEG, SVG lub pobrać jako dane binarne:
using IronBarCode;
// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");
using IronBarCode;
// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");
Imports IronBarCode
' Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
' Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.SaveAsPng("qr.png")
Inicjalizacja licencji odbywa się przy uruchomieniu aplikacji, jednorazowo:
IronBarCode.License.LicenseKey = "YOUR-KEY";
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-KEY"
Obok siebie: Przetwarzanie wsadowe
Przetwarzanie wsadowe ujawnia kolejne ograniczenie strukturalne czytnika Infragistics WPF. Ponieważ czytnik korzysta ze wspólnego modułu obsługi zdarzeń, a pole _result jest nadpisywane przy każdym wywołaniu, przedstawiona powyżej klasa usługi nie może bezpiecznie przetwarzać wielu obrazów jednocześnie. Należy uporządkować wywołania:
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// are not thread-safe; concurrent calls would corrupt _result
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
// Each call must await before starting the next
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// are not thread-safe; concurrent calls would corrupt _result
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
// Each call must await before starting the next
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
Imports System.Collections.Generic
' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' are not thread-safe; concurrent calls would corrupt _result
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()
For Each file In imageFiles
' Each call must await before starting the next
Dim value As String = Await service.ReadBarcodeAsync(file)
results.Add(value)
Next
Aby to osiągnąć, potrzebna jest spora dodatkowa infrastruktura: blokada, kolejka lub semafor, które zapewnią, że _result nie zostanie nadpisane, gdy poprzednie dekodowanie jest jeszcze w toku. Jest to niebanalny problem współbieżności w przypadku operacji wejścia/wyjścia, która powinna być prosta.
Statyczny BarcodeReader.Read() w IronBarcode jest bezpieczny dla wątków. Można go wywoływać jednocześnie z wielu wątków bez dodatkowej synchronizacji. W przypadku zadań wsadowych można użyć bezpośrednio Parallel.ForEach:
using IronBarCode;
// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var barcodeResults = BarcodeReader.Read(file);
foreach (var result in barcodeResults)
{
results.Add(result.Value);
}
});
using IronBarCode;
// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var barcodeResults = BarcodeReader.Read(file);
foreach (var result in barcodeResults)
{
results.Add(result.Value);
}
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' IronBarcode: parallel batch with thread-safe static API
Dim results As New ConcurrentBag(Of String)()
Parallel.ForEach(imageFiles, Sub(file)
Dim barcodeResults = BarcodeReader.Read(file)
For Each result In barcodeResults
results.Add(result.Value)
Next
End Sub)
Można również przekazać wiele plików w jednym wywołaniu i skonfigurować równoległość za pomocą BarcodeReaderOptions:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read(imageFiles, options)
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next
Porównanie funkcji
| Funkcja | Infragistics BarCode | IronBarcode |
|---|---|---|
| Odczytywanie BarCodes w WinForms | Niedostępne | Tak |
| Odczytywanie BarCode w WPF | Tak (sterowane zdarzeniami) | Tak (synchroniczne) |
| Obsługa ASP.NET Core | Niedostępne | Tak |
| Konsola / Usługa robocza | Niedostępne | Tak |
| Docker / Linux | Niedostępne | Tak |
| Azure Functions | Niedostępne | Tak |
| Blazor Server | Niedostępne | Tak |
| Automatyczne wykrywanie formatowania | Nie — należy określić każdy znacznik SymbologyType | Tak — automatycznie wykrywa ponad 50 formatów |
| Odczytywanie BarCodes z plików PDF | Niedostępne | Tak — natywne, bez dodatkowego pakietu |
| Odczyt bezpieczny dla wątków | Nie (wspólny moduł obsługi zdarzeń) | Tak (statyczne API) |
| Wymagane API sterowane zdarzeniami | Tak (WPF) | Nie |
| Wyraźne ładowanie obrazu (BitmapSource) | Tak | Nie — akceptuje ścieżkę do pliku, bajty, strumień |
| Czytanie synchroniczne | Nie (należy połączyć za pomocą TaskCompletionSource) | Tak |
| Przetwarzanie wsadowe | Tylko sekwencyjnie (niezgodne z wielowątkowością) | Wbudowana równoległość |
| Ciche błędy formatowania | Tak (brak flagi SymbologyType) | Nie |
| Wymagana zależność od Suite | Tak — subskrypcja Infragistics Ultimate | Nie — pakiet samodzielny |
| Opcja licencji wieczystej | Nie — roczna subskrypcja | Tak |
| Przybliżony koszt licencji | 1675 USD+/rok (Infragistics Ultimate) | Od 749 USD – licencja wieczysta (Lite) |
Przewodnik po mapowaniu API
WinForms (UltraWinBarcode) do IronBarcode
| Infragistics WinForms — UltraWinBarcode | IronBarcode |
|---|---|
new UltraWinBarcode() |
BarcodeWriter.CreateBarcode(data, encoding) |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.Code128 (parametr do CreateBarcode) |
barcode.Data = "ITEM-12345" |
Pierwszy argument CreateBarcode() |
barcode.SaveTo(outputPath) |
.SaveAsPng(outputPath) |
| Nie istnieje API do odczytu | BarcodeReader.Read(imagePath) |
WPF (BarcodeReader) do IronBarcode
| Infragistics WPF — BarcodeReader | IronBarcode |
|---|---|
new BarcodeReader() |
Klasa statyczna — nie wymaga instancji |
_reader.DecodeComplete += OnDecodeComplete |
Nie jest potrzebne |
_reader.SymbologyTypes = SymbologyType.X \| SymbologyType.Y \| ... |
Automatyczne wykrywanie — bez konfiguracji |
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap) |
BarcodeReader.Read(path) |
e.SymbologyValue (w wywołaniu zwrotnym) |
result.Value |
e.Symbology (w wywołaniu zwrotnym) |
result.Format |
TaskCompletionSource<string> async wrapper |
Synchroniczne — nie wymaga opakowania |
Dispose() — odłącz obsługę zdarzeń |
Niepotrzebne — brak instancji lub zdarzenia |
| Tylko projekt WPF | Dowolny typ projektu .NET |
Kiedy zespoły się zmieniają
Kilka konkretnych sytuacji konsekwentnie zniechęca zespoły do korzystania z obsługi BarCode firmy Infragistics.
Odczyt wymagańy w WinForms. Jest to najczęstszy scenariusz. Aplikacja WinForms bez problemu generuje BARCODES przy użyciu UltraWinBarcode, ale pojawia się nowe wymaganie: skanowanie BARCODE'a z przesłanego obrazu lub sprawdzanie poprawności etykiety przed wydrukowaniem. Nie ma interfejsu API do odczytu Infragistics dla WinForms. Zespół albo korzysta z drugiej biblioteki, albo zastępuje kod generujący czymś, co spełnia obie te funkcje.
Nowy punkt końcowy .NET Core. Aplikacja desktopowa z funkcją generowania kodów kreskowych Infragistics zyskuje towarzyszące jej webowe API. Punkt końcowy musi akceptować przesyłanie obrazów i zwracać wartości BARCODE lub generować obrazy BARCODE na żądanie. Żadne z tych zadań nie jest możliwe przy użyciu pakietów BarCode Infragistics w projekcie ASP.NET Core. IronBarcode instaluje się za pomocą dotnet add package IronBarcode i działa w akcji kontrolera w taki sam sposób, jak w metodzie konsoli.
Wdrożenie w Dockerze. Aplikacja WPF jest konteneryzowana lub jej logika BarCode jest wyodrębniana do mikrousługi. Zestawy WPF nie działają w kontenerach Docker na systemie Linux. Dołączamy do nich Infragistics WPF BarcodeReader. IronBarcode jest natywnie przeznaczony dla systemu Linux x64.
Wydajność przetwarzania wsadowego. Przepływ pracy przetwarza setki lub tysiące obrazów BarCode. Czytnik Infragistics, sterowany zdarzeniami, przetwarza je sekwencyjnie. Czytnik statyczny IronBarcode jest bezpieczny dla wątków i obsługuje Parallel.ForEach lub wbudowaną opcję MaxParallelThreads bez żadnej infrastruktury współbieżności.
Ciche błędy formatowania w środowisku produkcyjnym. Zespół odkrywa, że BARCODE-y określonego formatu od tygodni powodowały ciche błędy, ponieważ flagi SymbologyTypes nie obejmowały tego formatu. Przejście na automatyczne wykrywanie całkowicie eliminuje ten rodzaj awarii.
Ograniczenie zakresu subskrypcji Infragistics. Niektóre zespoły płacą cenę subskrypcji Infragistics Ultimate właśnie dlatego, że obejmuje ona kontrolki BARCODE. Jeśli jedynym powodem subskrypcji jest potrzeba korzystania z kodów kreskowych, warto rozważyć dedykowaną bibliotekę kodów kreskowych, która kosztuje ułamek ceny.
Wnioski
Główny problem związany z obsługą BARCODE przez Infragistics ma charakter architektoniczny, a nie dotyczy możliwości. WPF BarcodeReader odczytuje BarCodes. WinForms UltraWinBarcode je generuje. W wąskim kontekście, dla którego każdy komponent został zaprojektowany, działają one prawidłowo. Problem polega na tym, że te dwa konteksty nie obejmują tego, czego faktycznie potrzebuje większość zespołów .NET.
Funkcja BARCODE w nowoczesnej aplikacji .NET rzadko mieści się w jednym frameworku interfejsu użytkownika. Pojawia się w kliencie WinForms i web API. Działa w kontenerze Docker i na komputerze stacjonarnym. Musi skanować obrazy przesłane do punktu końcowego ASP.NET i drukować etykiety z poziomu narzędzia konsolowego. Żadne z tych rozwiązań nie działa z pakietami kodów kreskowych Infragistics, a wzorzec sterowany zdarzeniami czytnika WPF z wymagańymi flagami symboliki znacznie zwiększa złożoność nawet w tym jednym kontekście, w którym działa.
IronBarcode rozwiązuje ten sam problem — odczytywanie i generowanie kodów kreskowych — za pomocą statycznego interfejsu API, który kompiluje się i działa identycznie w każdym typie projektu .NET. Wywołanie BarcodeReader.Read(), które piszesz w klasie usługi WPF, jest tym samym wywołaniem, które piszesz w kontrolerze .NET Core, i tym samym wywołaniem, które piszesz w kontenerze Docker na systemie Linux. Żadnych zdarzeń, żadnych flag, żadnych TaskCompletionSource. Logika kodu BarCode składa się z dwóch wierszy, a nie trzydziestu pięciu, i te dwa wiersze działają wszędzie.
Często Zadawane Pytania
Co to jest Infragistics Barcode?
Infragistics Barcode to biblioteka .NET do generowania i odczytywania kodów kreskowych w aplikacjach C#. Jest jedną z kilku alternatyw ocenianych przez programistów przy wyborze rozwiązania do kodów kreskowych dla projektów .NET.
Jakie są główne różnice między Infragistics Barcode a IronBarcode?
IronBarcode używa statycznego, bezstanowego API, które nie wymaga zarządzania instancjami, podczas gdy Infragistics Barcode zazwyczaj wymaga utworzenia i skonfigurowania instancji przed użyciem. IronBarcode również zapewnia natywne wsparcie dla PDF, automatyczne wykrywanie formatu oraz licencjonowanie za pomocą jednego klucza we wszystkich środowiskach.
Czy IronBarcode jest łatwiejszy do licencjonowania niż Infragistics Barcode?
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, które obsługuje Infragistics Barcode?
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.
Jak IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu do Infragistics Barcode?
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ę ocenić IronBarcode przed zakupem, w przeciwieństwie do Infragistics?
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 cenowa między Infragistics Barcode 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 Infragistics Barcode do IronBarcode jest prosta?
Migracja z Infragistics Barcode do IronBarcode polega głównie na zastąpieniu wywołań API opartych na instancjach metodami statycznymi IronBarcode, usunięciu szablonów licencyjnych oraz aktualizacji nazw właściwości wynikowych. Większość migracji polega na redukcji kodu, a nie na jego dodawaniu.
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().

