Zum Fußzeileninhalt springen
VIDEOS

Wie man Barcodes in C# mit NET MAUI liest und scannt

Migrating from InfragisticsBarCodeto IronBarcode

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
# 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
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;
// 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;
Imports IronBarCode
$vbLabelText   $csharpLabel

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

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

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

Nach (IronBarcode):

// NuGet: dotnet add package IronBarcode
using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .SaveAsPng(outputPath);
// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
             .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

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);
using IronBarCode;

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

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
             .ResizeTo(400, 100) _
             .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

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

    Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))

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

    _reader.Decode(bitmap)
    Return Await _result.Task
End Function

Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
    _result?.TrySetResult(If(e.Value, "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

Nach (IronBarcode — 2 Zeilen):

using IronBarCode;

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

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

Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
$vbLabelText   $csharpLabel

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

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

Dim results = BarcodeReader.Read(imagePath)
Dim first = results.FirstOrDefault()
If first IsNot Nothing Then
    Console.WriteLine($"Value: {first.Value}, Format: {first.Format}")
End If
$vbLabelText   $csharpLabel

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

' In a WinForms button handler or service method — same API as WPF or ASP.NET Core
Dim results = BarcodeReader.Read(imagePath)
For Each result In results
    MessageBox.Show($"Found: {result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

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");
    }
}
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");
    }
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/barcode")>
Public Class BarcodeController
    Inherits ControllerBase

    <HttpPost("read")>
    Public Function ReadBarcode(imageFile As IFormFile) As IActionResult
        Using stream = imageFile.OpenReadStream()
            Dim results = BarcodeReader.Read(stream)
            Dim values = results.Select(Function(r) New With {Key .Value = r.Value, Key .Format = r.Format.ToString()})
            Return Ok(values)
        End Using
    End Function

    <HttpGet("generate")>
    Public Function GenerateBarcode(<FromQuery> data As String) As IActionResult
        Dim bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
                                  .ResizeTo(400, 100) _
                                  .ToPngBinaryData()
        Return File(bytes, "image/png")
    End Function
End Class
$vbLabelText   $csharpLabel

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

' Read all barcodes from every page of a PDF
Dim results = BarcodeReader.Read("document.pdf")
For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

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();
// 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();
Imports System.Collections.Generic

' Must process one at a time — shared _result field is not thread-safe
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()

For Each file In imageFiles
    Dim value As String = Await service.ReadBarcodeAsync(file)
    results.Add(value)
Next

service.Dispose()
$vbLabelText   $csharpLabel

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;

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

' Option 1: pass an array directly — IronBarcode handles parallelization internally
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read(imageFiles.ToArray(), options)
For Each result In results
    Console.WriteLine($"{result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel
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);
});
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);
});
Imports IronBarCode
Imports System.Collections.Concurrent

' Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
Dim allValues As New ConcurrentBag(Of String)()

Parallel.ForEach(imageFiles, Sub(file)
    Dim results = BarcodeReader.Read(file)
    For Each r In results
        allValues.Add(r.Value)
    Next
End Sub)
$vbLabelText   $csharpLabel

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>();
// 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>();
' Before: service registered as IDisposable in DI container
services.AddScoped(Of InfragisticsBarcodeService)() ' implements IDisposable

' After: no registration needed — use static method directly, or wrap in thin service if preferred
' services.AddScoped(Of IBarcodeService, IronBarcodeService)()
$vbLabelText   $csharpLabel

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

Public Class BarcodeService
    Public Function Read(path As String) As IEnumerable(Of String)
        Return BarcodeReader.Read(path).Select(Function(r) r.Value)
    End Function

    Public Function Generate(data As String, encoding As BarcodeEncoding) As Byte()
        Return BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData()
    End Function
End Class
$vbLabelText   $csharpLabel

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);
using IronBarCode;

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

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

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = False
}

Dim results = BarcodeReader.Read(imagePath, options)
$vbLabelText   $csharpLabel

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

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";
// Before
var value = await service.ReadBarcodeAsync(imagePath);

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

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";
    });
}
public Task<string> ReadBarcodeAsync(string imagePath)
{
    return Task.Run(() =>
    {
        var results = BarcodeReader.Read(imagePath);
        return results.FirstOrDefault()?.Value ?? "No barcode found";
    });
}
Option Strict On



Public Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
    Return Task.Run(Function()
                        Dim results = BarcodeReader.Read(imagePath)
                        Return If(results.FirstOrDefault()?.Value, "No barcode found")
                    End Function)
End Function
$vbLabelText   $csharpLabel

Namensänderungen der Immobilie

Infragistics IronBarcode
e.Value (in ReaderDecodeArgs) result.Value
e.Symbology (in ReaderDecodeArgs) result.Format
barcode.Data Erstes Argument von BarcodeWriter.CreateBarcode()
barcode.Symbology = Symbology.Code128 BarcodeEncoding.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" .
# 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

Feature InfragisticsBarCode IronBarcode
WinForms-Barcode-Generierung Ja (UltraWinBarcode) Ja
WinForms-Barcode-Lesen Nicht verfügbar Ja
WPF-Barcode-Generierung Ja (XamBarcode) Ja
WPF-Barcode-Lesen Ja (ereignisgesteuert) Ja (synchron)
ASP.NET Core Nicht verfügbar Ja
Konsolen-/Arbeitsdienst Nicht verfügbar Ja
Docker/Linux Nicht verfügbar Ja
Azure Functions Nicht verfügbar Ja
Blazor -Server Nicht verfügbar Ja
Automatische Formaterkennung Nein – SymbologyType-Flags erforderlich Ja
PDF-Barcode-Lesen Nicht verfügbar Ja (Muttersprachler)
Threadsichere gleichzeitige Lesevorgänge Nein Ja
Stapelverarbeitung (integriert) Nein Ja
QR-Fehlerkorrektursteuerung Nicht verfügbar Ja
Statische API (keine Instanz) Nein Ja
Suite -Abonnement erforderlich Ja (Infragistics Ultimate, $2.399+/Jahr) Nein
Unbefristete Lizenz Nein Ja – 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.

Häufig gestellte Fragen

Warum sollte ich von Infragistics BarCode auf IronBarcode umsteigen?

Zu den häufigsten Gründen gehören die Vereinfachung der Lizenzierung (Beseitigung der Komplexität von SDK und Laufzeitschlüsseln), die Beseitigung von Durchsatzbeschränkungen, die Verbesserung der nativen PDF-Unterstützung, die Verbesserung der Docker/CI/CD-Bereitstellung und die Verringerung von API-Boilerplate im Produktionscode.

Wie kann ich Infragistics-API-Aufrufe durch IronBarcode ersetzen?

Ersetzen Sie Instanzerstellung und Lizenzierung durch IronBarCode.License.LicenseKey = "key". Ersetzen Sie die Leseaufrufe durch BarcodeReader.Read(path) und die Schreibaufrufe durch BarcodeWriter.CreateBarcode(data, encoding). Statische Methoden erfordern keine Instanzverwaltung.

Wie viel Code ändert sich bei der Migration von Infragistics BarCode zu IronBarcode?

Die meisten Migrationen führen zu weniger Codezeilen. Lizenzierungs-Boilerplate, Instanzkonstruktoren und explizite Formatkonfiguration werden entfernt. Zentrale Lese-/Schreibvorgänge werden auf kürzere IronBarcode-Äquivalente mit saubereren Ergebnisobjekten abgebildet.

Muss ich während der Migration sowohl Infragistics BarCode als auch IronBarcode installiert lassen?

Nein. Die meisten Migrationen sind direkte Ersetzungen und keine Paralleloperationen. Migrieren Sie eine Serviceklasse nach der anderen, ersetzen Sie die NuGet-Referenz und aktualisieren Sie die Instanzierungs- und API-Aufrufmuster, bevor Sie zur nächsten Klasse übergehen.

Wie lautet der NuGet-Paketname für IronBarcode?

Das Paket ist 'IronBarCode' (mit großem B und C). Installieren Sie es mit 'Install-Package IronBarCode' oder 'dotnet add package IronBarCode'. Die using-Anweisung im Code lautet 'using IronBarCode;'.

Wie vereinfacht IronBarcode die Docker-Bereitstellung im Vergleich zu Infragistics BarCode?

IronBarcode ist ein NuGet-Paket, für das keine externen SDK-Dateien oder Lizenzkonfigurationen erforderlich sind. In Docker setzen Sie die Umgebungsvariable IRONBARCODE_LICENSE_KEY und das Paket übernimmt die Lizenzvalidierung beim Start.

Erkennt IronBarcode nach der Migration von Infragistics alle Barcode-Formate automatisch?

Ja, IronBarcode erkennt automatisch die Symbologie aller unterstützten Formate. Eine explizite Aufzählung von BarcodeTypes ist nicht erforderlich. Wenn das Format bereits bekannt ist und die Leistung eine Rolle spielt, ermöglicht BarcodeReaderOptions die Einschränkung des Suchraums als eine Optimierung.

Kann IronBarcode Barcodes aus PDFs ohne eine separate Bibliothek lesen?

Ja, BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien nativ. Die Ergebnisse enthalten PageNumber, Format, Value und Confidence für jeden gefundenen Barcode. Es ist kein externer PDF-Rendering-Schritt erforderlich.

Wie handhabt IronBarcode die parallele Verarbeitung von Barcodes?

Die statischen Methoden von IronBarcode sind zustandslos und thread-sicher. Verwenden Sie Parallel.ForEach direkt über Dateilisten ohne Instanzmanagement pro Thread. BarcodeReaderOptions.MaxParallelThreads steuert das interne Thread-Budget.

Welche Ergebniseigenschaften ändern sich bei der Migration von Infragistics BarCode zu IronBarcode?

Übliche Umbenennungen: BarcodeValue wird zu Value, BarcodeType wird zu Format. IronBarcode-Ergebnisse fügen auch Confidence und PageNumber hinzu. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt die Umbenennungen im bestehenden Ergebnisverarbeitungscode.

Wie kann ich die IronBarcode-Lizenzierung in einer CI/CD-Pipeline einrichten?

Speichern Sie IRONBARCODE_LICENSE_KEY als Pipeline-Geheimnis und weisen Sie IronBarCode.License.LicenseKey im Startup-Code der Anwendung zu. Ein Geheimnis deckt alle Umgebungen ab, einschließlich Entwicklung, Test, Staging und Produktion.

Unterstützt IronBarcode die Generierung von QR-Codes mit benutzerdefiniertem Styling?

Ja. QRCodeWriter.CreateQrCode() unterstützt benutzerdefinierte Farben über ChangeBarCodeColor(), das Einbetten von Logos über AddBrandLogo(), konfigurierbare Fehlerkorrekturstufen und mehrere Ausgabeformate einschließlich PNG, JPG, PDF und Stream.

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

Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an