IRONSOFTWAREHOME
FILMY

Migrating fromInfragisticsBarCode to IronBarcode

Curtis Chau
Curtis Chau
Updated: 1 sierpnia 2026

Większość migracji kodów kreskowychInfragisticsma miejsce, ponieważ zespół potrzebował odczytu kodów kreskowych w projekcie, w którym dostępna była tylko generacja — WinForms, .NET Core lub dowolny projekt poza WPF — lub ponieważ sterowane zdarzeniami API czytnika WPF okazało się zbyt niestabilne do użytku produkcyjnego. Wzorzec mostka TaskCompletionSource, wspólne pole _result, które czyni równoczesne wywołania niebezpiecznymi, oraz ciche niepowodzenia spowodowane brakiem flag SymbologyType to częste powody, dla których zespoły szukają alternatyw.

Ten przewodnik przeprowadza użytkownika przez cały proces migracji: usuwanie pakietów kodów kreskowych Infragistics, zastępowanie kodu generującego i odczytującego zarówno w kontekście WinForms, jak i WPF oraz dodawanie funkcjonalności BarCode do typów projektów, w którychInfragisticsnie zapewniało żadnego wsparcia.

Szybki start

Krok 1: Usuń pakiety BarCode Infragistics

Usuń pakiety NuGet z kodami BarCodeInfragisticsze swojego projektu. W zależności od tego, jakich celów używałeś:

# WinForms generation package
dotnet remove package Infragistics.WinForms.Barcode

# WPF reading package
dotnet remove package Infragistics.WPF.BarcodeReader
SHELL

Jeśli plik projektu odwołuje się do obu, usuń oba. Usunięcie pakietów związanych z kodami kreskowymi nie ma wpływu na licencjęInfragisticsUltimate, jeśli korzystasz z innych komponentów Infragistics.

Krok 2: Zainstaluj IronBarcode

dotnet add package IronBarcode
SHELL

IronBarcode to pojedynczy pakiet, który działa w środowiskach WinForms, WPF, ASP.NET Core, konsoli, Blazor Server, Docker,Azure Functionsi AWS Lambda. Nie ma potrzeby tworzenia oddzielnych pakietów dla poszczególnych frameworków.

Krok 3: Aktualizacja przestrzeni nazw

Zamień przestrzenie nazw kodów kreskowychInfragisticsna IronBarCode (duże B, duże C):

// Remove these:
// using Infragistics.Win.UltraWinBarcode;
// using Infragistics.Controls.Barcodes;
// using System.Windows.Media.Imaging; // if only used for barcode BitmapImage loading

// Add this:
using IronBarCode;

Krok 4: Zainicjuj licencję

Dodaj inicjalizację licencji raz przy starcie aplikacji — Program.cs, App.xaml.cs lub twój rdzeń kompozycji DI:

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

Przykłady migracji kodu

Generowanie WinForms: UltraWinBarcode do BarcodeWriter

Wzorzec generacji WinForms mapuje się czysto na BarcodeWriter IronBarcode:

Przed (Infragistics WinForms):

using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);

Po (IronBarcode):

// NuGet: dotnet add package IronBarcode
using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .SaveAsPng(outputPath);

Wartość enum Symbology wInfragisticsprzechodzi do enum BarcodeEncoding, który jest parametrem dla CreateBarcode() zamiast przypisania właściwości. Dane stają się pierwszym argumentem. SaveTo() staje się .SaveAsPng(), .SaveAsJpeg(), .SaveAsSvg() lub .SaveAsPdf() w zależności od formatu wyjściowego.

Jeśli przed zapisaniem konieczne jest zmniejszenie rozmiaru BarCODE:

using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng(outputPath);

Czytanie sterowane zdarzeniami w WPF: klasa usługi w dwóch wierszach

Jest to najbardziej znacząca redukcja w ramach migracji. Wzorzec odczytuInfragisticsWPF wymaga klasy pełnej obsługi:

Przed (Infragistics WPF — ~35 wierszy):

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

    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    _reader.SymbologyTypes = Symbology.Code128 |
                             Symbology.Code39 |
                             Symbology.QRCode |
                             Symbology.EAN8 |
                             Symbology.EAN13 |
                             Symbology.UpcA |
                             Symbology.Interleaved2Of5;

    _reader.Decode(bitmap);
    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.Value ?? "No barcode found");
}

public void Dispose()
{
    if (_reader != null)
    {
        _reader.DecodeComplete -= OnDecodeComplete;
        _reader = null;
    }
}

Po (IronBarcode — 2 wiersze):

using IronBarCode;

var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";

Cała klasa usługi — zarządzanie instancją, okablowanie zdarzeń, TaskCompletionSource, ładowanie BitmapImage, Dispose() — zniknęły. BarcodeReader.Read() jest synchroniczna, statyczna i akceptuje bezpośrednio ścieżkę pliku w postaci ciągu znaków.

Jeśli zwracałbyś również typ symboliki:

using IronBarCode;

var results = BarcodeReader.Read(imagePath);
var first = results.FirstOrDefault();
if (first != null)
{
    Console.WriteLine($"Value: {first.Value}, Format: {first.Format}");
}

result.Value zastępuje e.Value. result.Format zastępuje e.Symbology.

Dodanie obsługi WinForms (wcześniej niemożliwe)

Jeśli pracowałeś nad projektem WinForms, który obsługiwał tylko generowanie, teraz w tym samym pakiecie dostępna jest również funkcja odczytu:

using IronBarCode;

// In a WinForms button handler or service method — same API as WPF or ASP.NET Core
var results = BarcodeReader.Read(imagePath);
foreach (var result in results)
{
    MessageBox.Show($"Found: {result.Value} ({result.Format})");
}

Brak dodatkowych pakietów, żadnej specyficznej dla frameworka konfiguracji. To samo wywołanie BarcodeReader.Read() działa w WinForms jak i w WPF.

Punkt końcowyASP.NET Core(wcześniej niemożliwy)

Generowanie i odczytywanie BarCODE w kontrolerzeASP.NET Corenie było możliwe przy użyciu pakietów Infragistics. Dzięki IronBarcode:

using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
    [HttpPost("read")]
    public IActionResult ReadBarcode(IFormFile imageFile)
    {
        using var stream = imageFile.OpenReadStream();
        var results = BarcodeReader.Read(stream);
        var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
        return Ok(values);
    }

    [HttpGet("generate")]
    public IActionResult GenerateBarcode([FromQuery] string data)
    {
        var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
                                 .ResizeTo(400, 100)
                                 .ToPngBinaryData();
        return File(bytes, "image/png");
    }
}

BarcodeReader.Read() akceptuje Stream bezpośrednio — nie ma potrzeby najpierw zapisywania uploadu na dysk.

Odczytywanie BarCodes z plików PDF

IronBarcode odczytuje kody kreskowe z dokumentów PDF w sposób natywny — nie wymaga oddzielnego pakietu:

using IronBarCode;

// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("document.pdf");
foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}

Infragistics nie miał odpowiednika — odczyt BarCode'ów z plików PDF wymagał zewnętrznej konwersji stron PDF na obrazy przed skanowaniem.

Przetwarzanie wsadowe: od sekwencyjnego do równoległego

Przed (Infragistics — sekwencyjny, niezabezpieczony pod kątem współbieżności dla równoległości):

// Must process one at a time — shared _result field is not thread-safe
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}

service.Dispose();

Po (IronBarcode — równoległe, bezpieczne dla wątków):

using IronBarCode;

// Option 1: pass an array directly —IronBarcode handles parallelization internally
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles.ToArray(), options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
C#
using IronBarCode;
using System.Collections.Concurrent;

// Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
var allValues = new ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var results = BarcodeReader.Read(file);
    foreach (var r in results)
        allValues.Add(r.Value);
});

Usunięcie wzorca Dispose

Jeśli twój kod zawierał implementacje IDisposable wokółInfragisticsBarcodeReader, można je całkowicie usunąć. BarcodeReaderIronBarcode jest klasą statyczną. Nie ma żadnej instancji do utworzenia, żadnego obsługi zdarzeń do odłączenia i żadnego wywołania Dispose().

// Before: service registered as IDisposable in DI container
services.AddScoped<InfragisticsBarcodeService>(); // implements IDisposable

// After: no registration needed — use static method directly, or wrap in thin service if preferred
// services.AddScoped<IBarcodeService, IronBarcodeService>();

Prosta usługa typu thin wrapper do celów DI jest następująca:

using IronBarCode;

public class BarcodeService
{
    public IEnumerable<string> Read(string path)
        => BarcodeReader.Read(path).Select(r => r.Value);

    public byte[] Generate(string data, BarcodeEncoding encoding)
        => BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData();
}

Brak wstrzykiwania konstruktorów, brak Dispose(), brak zarządzania zdarzeniami.

Typowe problemy związane z migracją

Usunięto flagi typu symboliki

Właściwość SymbologyTypes w czytnikuInfragisticsWPF wymagała wskazania każdego formatu kodu kreskowego, który chciano obsługiwać.IronBarcode nie ma sobie równych — automatycznie wykrywa wszystkie ponad 50 obsługiwanych formatów przy każdym odczycie.

To ma ważny efekt uboczny: jeśli wcześniej konkretne formaty kodów kreskowych nie były wykrywane, ponieważ brakowało ich flagi SymbologyType na liście,IronBarcode teraz je znajdzie. W środowisku produkcyjnym mogą pojawić się wartości BarCode, które wcześniej były pomijane bez powiadomienia. To jest prawidłowe zachowanie — te barcody zawsze tam były.

Jeśli chcesz ograniczyć, które formaty są zwracane (ze względów wydajnościowych lub niejednoznaczności), BarcodeReaderOptions to obsługuje:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = false
};

var results = BarcodeReader.Read(imagePath, options);

Nie jest wymagane ładowanie obrazu bitmapowego

CzytnikInfragisticsWPF wymagał ładowania obrazów jako obiekty BitmapSource przez new BitmapImage(new Uri(path, UriKind.Absolute)).IronBarcode akceptuje bezpośrednio ciągi znaków ścieżek plików, tablice bajtów i strumienie:

// All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png");
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"));
BarcodeReader.Read(File.OpenRead("path/to/image.png"));

Możesz usunąć wszelkie importy using System.Windows.Media.Imaging;, które były używane tylko do ładowania obrazów związanych z kodami kreskowymi.

Wzorzec TaskCompletionSource usunięty

Pole TaskCompletionSource<string>, które łączyło oparty na zdarzeniach callback DecodeComplete z kodem asynchronicznym, całkowicie zniknęło. BarcodeReader.Read() jest synchroniczna i zwraca swoje wyniki bezpośrednio.

Jeśli twój kod wywołujący był await service.ReadBarcodeAsync(path), możesz uprościć do:

// Before
var value = await service.ReadBarcodeAsync(imagePath);

// After
var value = BarcodeReader.Read(imagePath).FirstOrDefault()?.Value ?? "No barcode found";

Jeśli chcesz zachować interfejs asynchroniczny dla wywołujących na dalszym etapie bez blokowania wątku:

public Task<string> ReadBarcodeAsync(string imagePath)
{
    return Task.Run(() =>
    {
        var results = BarcodeReader.Read(imagePath);
        return results.FirstOrDefault()?.Value ?? "No barcode found";
    });
}

Zmiany nazw właściwości

InfragisticsIronBarcode
e.Value (w ReaderDecodeArgs)result.Value
e.Symbology (w ReaderDecodeArgs)result.Format
barcode.DataPierwszy argument BarcodeWriter.CreateBarcode()
barcode.Symbology = Symbology.Code128BarcodeEncoding.Code128 (parametr)
barcode.SaveTo(path).SaveAsPng(path) / .SaveAsJpeg(path) / .SaveAsSvg(path)

Lista kontrolna migracji

Użyj tych wzorców grep, aby znaleźć wszystkie wystąpienia BARCODE-ówInfragisticsw swoim kodzie źródłowym:

# Namespace references
grep -r "Infragistics.WinForms.Barcode\|Infragistics.Win.UltraWinBarcode" --include="*.cs" .
grep -r "Infragistics.Controls.Barcodes" --include="*.cs" .
grep -r "Infragistics.WPF.BarcodeReader" --include="*.csproj" .

# WinForms generation types
grep -r "UltraWinBarcode" --include="*.cs" .
grep -r "Symbology\.Code" --include="*.cs" .
grep -r "barcode\.SaveTo(" --include="*.cs" .

# WPF reading types and patterns
grep -r "new BarcodeReader()" --include="*.cs" .
grep -r "DecodeComplete" --include="*.cs" .
grep -r "ReaderDecodeArgs" --include="*.cs" .
grep -r "SymbologyType\." --include="*.cs" .
grep -r "e\.Value\|ReaderDecodeArgs" --include="*.cs" .
grep -r "BitmapImage" --include="*.cs" .

# TaskCompletionSource usage (likely barcode-related if near above patterns)
grep -r "TaskCompletionSource" --include="*.cs" .
SHELL

Przejrzyj wszystkie dopasowania:

  • Zamiany UltraWinBarcode: zamień na BarcodeWriter.CreateBarcode()
  • Bloki new BarcodeReader() + DecodeComplete: zamień na BarcodeReader.Read()
  • Listy flag SymbologyType: usuń całkowicie
  • Ładowania BitmapImage używane dla danych wejściowych z kodami kreskowymi: zamień na bezpośrednią ścieżkę/strumień/bajty
  • Ciało wywołań zwrotnych ReaderDecodeArgs e: wyodrębnij e.Valueresult.Value, e.Symbologyresult.Format
  • IDisposable w klasach usług kodów kreskowych: usuń, jeśli jedynym zasobem do wyrzucenia było _reader

Porównanie funkcji

FunkcjaInfragisticsBarCodeIronBarcode
Generowanie BarCode-ów w WinFormsTak (UltraWinBarcode)Tak
Odczytywanie BarCodes w WinFormsNiedostępneTak
Generowanie kodów kreskowych w WPFTak (XamBarcode)Tak
Odczytywanie BarCode w WPFTak (sterowane zdarzeniami)Tak (synchroniczne)
ASP.NET CoreNiedostępneTak
Konsola / Usługa roboczaNiedostępneTak
Docker / LinuxNiedostępneTak
Azure FunctionsNiedostępneTak
Blazor ServerNiedostępneTak
Automatyczne wykrywanie formatowaniaNie — flagi typu SymbologyType są wymaganeTak
Odczytywanie BarCodes z plików PDFNiedostępneTak (język ojczysty)
Wielowątkowe odczytyNieTak
Odczyt partii (wbudowany)NieTak
Kontrola korekcji błędów QRNiedostępneTak
Statyczne API (bez instancji)NieTak
Wymagana subskrypcja Suite pakietuTak (Infragistics Ultimate, 2399 złotych+/rok)Nie
Licencja wieczystaNieTak — od 749 USD

Kluczowe korzyści po migracji

Odczyt kodów kreskowych w WinForms. Jeśli migracja była zainicjowana przez wymaganie odczytu w WinForms, to jest główny ostateczny wynik: BarcodeReader.Read(imagePath) kompiluje się i działa w WinForms bez żadnej dodatkowej konfiguracji.

Obsługa .NET Core i konsoli. Interfejsy API sieci Web, usługi działające w tle oraz narzędzia konsolowe mogą teraz zarówno generować, jak i odczytywać kody kreskowe przy użyciu tego samego pakietu. Jeśli dotychczas korzystałeś z oddzielnych łańcuchów narzędzi lub rozwiązań zastępczych dla tych typów projektów, teraz nie są one już potrzebne.

Brak standardowych obsługi zdarzeń. Usunięto obsługę DecodeComplete, mostek TaskCompletionSource, ładowanie BitmapImage i czyszczenie Dispose(). Pozostaje logika BarCode'ów.

Brak specyfikacji symbologii. Formatki, które wcześniej cicho się nie powiodły z powodu brakujących flag SymbologyType, będą teraz poprawnie wykryte. Automatyczne wykrywanie obejmuje ponad 50 formatów bez konieczności konfiguracji.

Ta sama klasa usługowa we wszystkich typach projektów. Pojedynczy wrapper BarcodeService używający BarcodeReader.Read() i BarcodeWriter.CreateBarcode() może być współdzielony w WinForms, WPF,ASP.NET Corei w dowolnym innym projekcie w rozwiązaniu. Nie należy stosować implementacji specyficznych dla danego frameworka.

Nie jest wymagana subskrypcjaInfragisticsUltimate wyłącznie w celu korzystania z funkcji kodów kreskowych. Jeśli obsługa kodów kreskowych była jedynym powodem, dla którego w ramach projektu wykupiono subskrypcjęInfragisticsUltimate, lub jeśli był to istotny czynnik decyzyjny,IronBarcode jest samodzielnym pakietem z opcjami licencji wieczystej, których cena zaczyna się od 749 USD dla jednego programisty.

Sama migracja jest mechaniczna, gdy już zlokalizujesz wszystkie miejsca użycia kodów kreskowych Infragistics. Najbardziej złożoną częścią jest zamiana klasy usługi WPF, a nawet to redukuje się do usunięcia klasy oraz zastąpienia wywołań przez BarcodeReader.Read(). Migracja generacji polega na zmianie nazw właściwości/metod w stosunku jeden do jednego. W zamian otrzymujesz jeden, spójny interfejs API, który działa w każdym potrzebnym typie projektu.

Zwróć uwagę: Infragistics jest zarejestrowanym znakiem towarowym odpowiedniego właściciela. Ta strona nie jest powiązana, zatwierdzona ani sponsorowana przez Infragistics. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.
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ęczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta