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

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

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

To około 35 wierszy kodu potrzebnego do odczytania jednego BARCODE'a. Opisz, co faktycznie się dzieje:

  1. Instancja BarcodeReader jest tworzona i utrzymywana jako pole.
  2. Obsługa zdarzeń jest podłączona w konstruktorze.
  3. Każde wywołanie ReadBarcodeAsync tworzy nowy TaskCompletionSource<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.
  4. Obraz musi być ładowany jako BitmapImage z Uri — nie jako ciąg ścieżki do pliku, nie jako tablica bajtów, nie jako strumień.
  5. Decode() wyzwala zdarzenie asynchronicznie. TaskCompletionSource stanowi łącznik między światem wywołań zwrotnych a światem async/await.
  6. Funkcja wywołania zwrotnego wyodrębnia e.SymbologyValue.
  7. 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
$vbLabelText   $csharpLabel

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

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

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

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

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

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

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().

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

Zespol wsparcia Iron

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