IRONSOFTWAREHOME
VIDEOS

Migrating from InfragisticsBarCodeto IronBarcode

Curtis Chau
Curtis Chau
Updated: 1. August 2026

Die meisten Barcode-Migrationen bei Infragisticserfolgen, weil das Team in einem Projekt, in dem nur die Generierung möglich war, Barcodes lesen musste – WinForms, ASP.NET Coreoder jedes Projekt außerhalb von WPF – oder weil sich die ereignisgesteuerte WPF-Reader-API für den Produktiveinsatz als zu fehleranfällig erwies. Das TaskCompletionSource Bridge-Pattern, das gemeinsame _result Feld, das gleichzeitige Aufrufe unsicher macht, und die stillen Ausfälle durch fehlende SymbologyType Flags sind häufige Gründe, warum Teams nach einer Alternative suchen.

Dieser Leitfaden beschreibt die vollständige Migration: Entfernen der Infragistics-Barcode-Pakete, Ersetzen des Generierungs- und Lesecodes sowohl in WinForms- als auch in WPF-Kontexten und Hinzufügen der Barcode-Funktionalität zu Projekttypen, für die Infragisticsüberhaupt keine Unterstützung bot.

Schnellstart

Schritt 1: Infragistics-Barcode-Pakete entfernen

Entfernen Sie die InfragisticsBarcode- NuGet Pakete aus Ihrem Projekt. Je nachdem, welche Ziele Sie verwendet haben:

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

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

Falls Ihre Projektdatei auf beide verweist, entfernen Sie beide. Die InfragisticsUltimate-Lizenz wird durch das Entfernen von Barcode-spezifischen Paketen nicht beeinträchtigt, sofern Sie andere Infragistics-Komponenten verwenden.

Schritt 2: IronBarcode installieren

dotnet add package IronBarcode
SHELL

IronBarcode ist ein einzelnes Paket, das auf WinForms, WPF, ASP.NET Core, Konsolen, Blazor Server, Docker, Azure Functionsund AWS Lambda funktioniert. Sie benötigen keine separaten Pakete pro Framework.

Schritt 3: Namespaces aktualisieren

Ersetzen Sie InfragisticsBarcode-Namespaces durch IronBarCode (großes B, großes 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;

Schritt 4: Lizenz initialisieren

Fügen Sie die Lizenzinitialisierung einmal beim Anwendungsstart hinzu — Program.cs, App.xaml.cs, oder Ihr DI-Zusammensetzungs-Root:

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

Beispiele für die Code-Migration

WinForms-Generierung: UltraWinBarcode zu BarcodeWriter

Das WinForms-Generierungsmuster lässt sich sauber auf den BarcodeWriter von IronBarcode abbilden:

Vorher (Infragistics WinForms):

using Infragistics.Win.UltraWinBarcode;

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

Nach (IronBarcode):

// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

Der Symbology Enum-Wert von Infragisticswechselt zum BarcodeEncoding Enum, der ein Parameter für CreateBarcode() ist anstatt einer Eigenschaftszuweisung. Die Daten werden zum ersten Argument. SaveTo() wird zu .SaveAsPng(), .SaveAsJpeg(), .SaveAsSvg() oder .SaveAsPdf() je nach Ihrem Ausgabeformat.

Falls Sie den Barcode vor dem Speichern verkleinern müssen:

using IronBarCode;

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

WPF-ereignisgesteuertes Lesen: Dienstklasse in zwei Zeilen

Dies ist der bedeutendste Rückgang der Migration. Das InfragisticsWPF-Lesemuster erfordert eine vollständige Serviceklasse:

Vorher (Infragistics WPF – ca. 35 Zeilen):

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;
    }
}

Nach (IronBarcode — 2 Zeilen):

using IronBarCode;

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

Die gesamte Dienstklasse — Instanzverwaltung, Ereignisverkabelung, TaskCompletionSource, BitmapImage Laden, Dispose() — ist verschwunden. BarcodeReader.Read() ist synchron, statisch und akzeptiert direkt einen Dateipfad als Zeichenkette.

Wenn Sie auch den Symbolisierungstyp zurückgeben würden:

using IronBarCode;

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

result.Value ersetzt e.Value. result.Format ersetzt e.Symbology.

Hinzufügen von WinForms-Lesen (bisher unmöglich)

Falls Sie sich in einem WinForms-Projekt befanden, das bisher nur die Generierung unterstützte, ist nun auch das Lesen mit demselben Paket möglich:

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})");
}

Keine zusätzlichen Pakete, keine frameworkspezifische Einrichtung. Der gleiche BarcodeReader.Read() Aufruf funktioniert in WinForms wie in WPF.

ASP.NET CoreEndpunkt (bisher unmöglich)

Die Generierung und das Einlesen von Barcodes in einem ASP.NET CoreController war mit den Infragistics-Paketen nicht möglich. Mit 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() akzeptiert direkt ein Stream — es ist nicht erforderlich, den Upload zuerst auf die Festplatte zu speichern.

PDF-Barcode-Lesen

IronBarcode liest Barcodes nativ aus PDF-Dokumenten – es ist kein separates Paket erforderlich:

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 hatte kein Äquivalent – ​​zum Lesen von PDF-Barcodes war es erforderlich, die PDF-Seiten vor dem Scannen extern in Bilder umzuwandeln.

Stapelverarbeitung: Von sequenziell zu parallel

Vorher (Infragistics – sequenziell, nicht parallelisierungssicher):

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

Nach (IronBarcode — parallel, threadsicher):

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})");
}
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);
});

Entfernen des Dispose-Musters

Wenn Ihr Code IDisposable Implementierungen rund um die InfragisticsBarcodeReader hatte, können diese vollständig entfernt werden. Der BarcodeReader von IronBarcode ist eine statische Klasse. Es gibt keine Instanz zu erstellen, keinen Ereignis-Handler zu lösen und kein Dispose() zu rufen.

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

Ein dünner Wrapper-Service für DI-Zwecke ist unkompliziert:

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

Keine Konstruktor-Injektion, kein Dispose(), keine Ereignisverwaltung.

Gängige Probleme bei der Migration

Symbolisierungstyp-Flags entfernt

Die SymbologyTypes Eigenschaft beim InfragisticsWPF-Leser erforderte, dass Sie jedes Barcode-Format enumerieren, das Sie unterstützen wollten. IronBarcode hat kein Äquivalent – ​​es erkennt alle über 50 unterstützten Formate automatisch bei jedem Lesevorgang.

Dies hat einen wichtigen Nebeneffekt: Wenn ein bestimmtes Barcode-Format zuvor stillschweigend fehlschlug, weil sein SymbologyType Flag aus der Liste fehlte, wird IronBarcode es jetzt finden. Möglicherweise tauchen in der Produktion Barcode-Werte auf, die zuvor unbemerkt geblieben sind. Das ist das korrekte Verhalten – diese Barcodes waren schon immer da.

Wenn Sie einschränken müssen, welche Formate zurückgegeben werden (aus Leistungs- oder Mehrdeutigkeitsgründen), unterstützt BarcodeReaderOptions dies:

using IronBarCode;

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

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

Laden von Bitmap-Bildern nicht erforderlich

Der InfragisticsWPF-Leser erforderte das Laden von Bildern als BitmapSource Objekte über new BitmapImage(new Uri(path, UriKind.Absolute)). IronBarcode akzeptiert Dateipfadzeichenfolgen, Byte-Arrays und Datenströme direkt:

// 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"));

Sie können alle using System.Windows.Media.Imaging; Importe entfernen, die nur für das Laden von Barcode-Bildern da waren.

Das Muster "TaskCompletionSource" wurde entfernt.

Das TaskCompletionSource<string> Feld, das den ereignisgesteuerten DecodeComplete Rückruf in asynchronen Code überführte, ist vollständig verschwunden. BarcodeReader.Read() ist synchron und gibt seine Ergebnisse direkt zurück.

Wenn Ihr aufrufender Code await service.ReadBarcodeAsync(path) war, können Sie dies vereinfachen zu:

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

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

Wenn Sie eine asynchrone Schnittstelle für nachgelagerte Aufrufer beibehalten möchten, ohne einen Thread zu blockieren:

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

Namensänderungen der Immobilie

InfragisticsIronBarcode
e.Value (in ReaderDecodeArgs)result.Value
e.Symbology (in ReaderDecodeArgs)result.Format
barcode.DataErstes Argument von BarcodeWriter.CreateBarcode()
barcode.Symbology = Symbology.Code128BarcodeEncoding.Code128 (Parameter)
barcode.SaveTo(path).SaveAsPng(path) / .SaveAsJpeg(path) / .SaveAsSvg(path)

Migrations-Checkliste

Verwenden Sie diese grep-Muster, um alle Infragistics-Barcode-Verwendungen in Ihrer Codebasis zu finden:

# 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

Arbeiten Sie jedes Spiel einzeln durch:

  • UltraWinBarcode Verwendungen: Ersetzen mit BarcodeWriter.CreateBarcode()
  • new BarcodeReader() + DecodeComplete Blöcke: Ersetzen mit BarcodeReader.Read()
  • SymbologyType Flag-Listen: komplett entfernen
  • BitmapImage Ladevorgänge für Barcode-Eingaben: Ersetzen durch direkten Pfad/Stream/Bytes
  • ReaderDecodeArgs e Rückrufkörper: @--CODE-1555--@@ extrahieren → result.Value, e.Symbologyresult.Format
  • IDisposable in Barcode-Dienstklassen: Entfernen, wenn die einzige wegwerfbare Ressource _reader war

Funktionsvergleich

FeatureInfragisticsBarCodeIronBarcode
WinForms-Barcode-GenerierungJa (UltraWinBarcode)Ja
WinForms-Barcode-LesenNicht verfügbarJa
WPF-Barcode-GenerierungJa (XamBarcode)Ja
WPF-Barcode-LesenJa (ereignisgesteuert)Ja (synchron)
ASP.NET CoreNicht verfügbarJa
Konsolen-/ArbeitsdienstNicht verfügbarJa
Docker/LinuxNicht verfügbarJa
Azure FunctionsNicht verfügbarJa
Blazor -ServerNicht verfügbarJa
Automatische FormaterkennungNein – SymbologyType-Flags erforderlichJa
PDF-Barcode-LesenNicht verfügbarJa (Muttersprachler)
Threadsichere gleichzeitige LesevorgängeNeinJa
Stapelverarbeitung (integriert)NeinJa
QR-FehlerkorrektursteuerungNicht verfügbarJa
Statische API (keine Instanz)NeinJa
Suite -Abonnement erforderlichJa (Infragistics Ultimate, $2.399+/Jahr)Nein
Unbefristete LizenzNeinJa – ab 749 $

Wichtigste Vorteile nach der Migration

Barcodelesen in WinForms. Wenn die Migration durch eine WinForms-Leseanforderung getrieben wurde, ist dies das primäre Ergebnis: BarcodeReader.Read(imagePath) kompiliert und läuft in WinForms ohne zusätzliche Einrichtung.

ASP.NET Core und Konsolenunterstützung. Web-APIs, Hintergrunddienste und Konsolentools können nun mit demselben Paket sowohl Barcodes generieren als auch lesen. Falls Sie für diese Projekttypen separate Toolchains oder Workarounds verwendet haben, gehören diese der Vergangenheit an.

Kein Ereignishandler-Vorlage. Der DecodeComplete Handler, die TaskCompletionSource Brücke, das BitmapImage Laden und die Dispose() Bereinigung sind alle entfernt worden. Die Barcode-Logik ist das, was übrig bleibt.

Keine Symbologien-Spezifikation. Formate, die aufgrund fehlender SymbologyType Flags in der Vergangenheit stillschweigend fehlschlugen, werden jetzt korrekt erkannt. Die automatische Erkennung deckt alle über 50 Formate ohne Konfiguration ab.

Gleiche Dienstklasse über alle Projekttypen hinweg. Eine einzige BarcodeService Verpackung mit BarcodeReader.Read() und BarcodeWriter.CreateBarcode() kann über WinForms, WPF, ASP.NET Coreund jedes andere Projekt in der Lösung geteilt werden. Keine frameworkspezifischen Implementierungen.

Für die Barcode-Funktionalität allein ist kein InfragisticsUltimate-Abonnement erforderlich. Falls die Barcode-Unterstützung der einzige Grund für ein InfragisticsUltimate-Abonnement in Ihrem Projekt war oder ein wesentlicher Entscheidungsfaktor, ist IronBarcode eine eigenständige Lösung mit unbefristeten Lizenzoptionen ab 749 US-Dollar für einen einzelnen Entwickler.

Die Migration selbst ist ein rein mechanischer Vorgang, sobald man alle Infragistics-Barcode-Verwendungen lokalisiert hat. Der aufwendigste Teil ist der Ersatz der WPF-Dienstklasse, und selbst das reduziert sich auf das Entfernen der Klasse und das Ersetzen von Aufrufen mit BarcodeReader.Read(). Die Generationsmigration ist eine Eins-zu-Eins-Umbenennung von Eigenschaften/Methoden. Sie erhalten im Gegenzug eine einzige, konsistente API, die in jedem benötigten Projekttyp funktioniert.

Hinweis:: Infragistics ist eine eingetragene Marke des jeweiligen Eigentümers. Diese Website ist nicht mit, unterstützt oder gesponsert von Infragistics. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.
Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.

...
Weiterlesen

Verwandte Artikel

Key in blue circle

Holen Sie sich sofort Ihren kostenlosen 30-Tage-Testschlüssel.

Your trial license will be sent to your email address

Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.

bullet_checkedIhr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
AWS-Logo
Booking Badge

Von Millionen von Ingenieur*innen weltweit vertraut

Azure (WebApps, Funktionen v3)
Erhalten Sie Ihre unverbindliche Beratung
Füllen Sie das Formular unten aus oder senden Sie eine E-Mail an sales@ironsoftware.com
Ihre Daten werden immer vertraulich behandelt.
Von Millionen von Ingenieur*innen weltweit vertraut
Azure (WebApps, Funktionen v3)
Erhalten Sie sofort Ihren kostenlosen 30-Tage-Testschlüssel.
Ihr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.