IRONSOFTWAREHOME
VIDEOS

Von ZXing.Net zu IronBarcode migrieren

Curtis Chau
Curtis Chau
Updated: 1. August 2026

Dieser Leitfaden beschreibt die vollständige Migration von ZXing .NET zu IronBarcode for .NET Anwendungen, die Barcodes lesen und generieren. Es behandelt die Entfernung des Kernpakets von ZXing.Net und der Bindungspakete, die Beseitigung von PdfiumViewer-Workarounds, wo vorhanden, und den Ersatz jeder zustandsbehafteten BarcodeReader Instanziierung durch die statische API von IronBarcode. Jeder Abschnitt enthält Vorher-Nachher-Codebeispiele, die den in ZXing .NET Integrationen am häufigsten vorkommenden Mustern entnommen sind.

Warum von ZXing .NET migrieren?

ZXing .NET hat der .NET Community über ein Jahrzehnt lang als kostenlose Apache 2.0 Barcode-Bibliothek gute Dienste geleistet. Allerdings werden einige architektonische Beschränkungen mit zunehmendem Umfang oder steigender Komplexität der Anwendungen zu Betriebskosten.

Thread-Sicherheitsbesitz: ZXing.Net's BarcodeReader ist ein zustandsbehaftetes Objekt. In der Dokumentation der Bibliothek selbst heißt es, dass Instanzen nicht threadübergreifend geteilt werden dürfen. In der Praxis bedeutet dies, dass jeder parallele Verarbeitungspfad – jede Controller-Aktion, die gleichzeitig Anfragen bearbeitet, jede Aufgabe in einem parallelen Batch – seinen eigenen Reader zuweisen, konfigurieren und verwerfen muss. Mit zunehmendem Anfragevolumen führt dieses Zuweisungsmuster zu messbarem Speicherdruck. Die ThreadLocal<BarcodeReader>-Alternative reduziert die Zuweisungshäufigkeit, bringt jedoch ihre eigene Entsorgungskomplexität mit sich. In beiden Fällen ist die Korrektheit unter Parallelität das Problem des Aufrufers und keine Garantie der Bibliothek.

Formatspezifikationsrisiko: ZXing.Net erfordert, dass reader.Options.PossibleFormats vor jeder Decodierung ausgefüllt ist. Ein Barcode in einem Format, das nicht in dieser Liste vorhanden ist, gibt null zurück — keine Ausnahme, keine Warnung, keine Angabe, dass ein Barcode vorhanden war, aber nicht erkannt wurde. Für Anwendungen, die Dokumente von externen Partnern erhalten, ist dieses Stille-Verpassungsverhalten ein Zuverlässigkeitsrisiko: eine falsch gelieferte Bestellung, ein verpasstes Patienteneincheckdatensatz oder ein Audit-Eintrag, der nie geschrieben wird, können alle aus einer Formatliste stammen, die für ein früheres Erfordernis konfiguriert und nie aktualisiert wurde.

PDF-Verarbeitungslücke: ZXing .NET liest nur Bitmaps. Wenn es sich bei den Quelldokumenten um PDFs handelt – Rechnungen, Versandmanifeste, Konformitätszertifikate – müssen die Aufrufer eine separate PDF-Rendering-Bibliothek integrieren (PdfiumViewer ist die gebräuchlichste), eine Seitenaufzählungsschleife implementieren, DPI konfigurieren, temporäre Dateien verwalten und die Bereinigung sowohl im Erfolgs- als auch im Fehlerfall durchführen. Dies sind 30 bis 50 Zeilen Infrastrukturcode pro Integration, die ausschließlich dazu dienen, das, was ZXing .NET nicht lesen kann (PDFs), in das umzuwandeln, was es lesen kann (Bitmaps). Diese Infrastruktur hat ihre eigenen Abhängigkeiten, ihre eigenen Bereitstellungsanforderungen und ihre eigenen Fehlermodi.

Plattform-Bindungsfragmentierung: Die Bildladefunktion von ZXing.Net ist auf plattformspezifische Bindungspakete aufgeteilt. Die Windows-Bindung verwendet System.Drawing.Bitmap; die plattformübergreifende Bindung verwendet SixLabors.ImageSharp mit einem anderen generischen Typparameter und einer anderen using-Direktive. Ein Projekt, das auf Windows beginnt und später auf Linux containerisiert wird, muss sowohl seine NuGet-Verweise als auch seinen Bildlade-Code ändern. Zwei Codepfade für dieselbe Operation erhöhen die Angriffsfläche für Fehler und erschweren zukünftige Änderungen in der Scanschicht.

Das grundsätzliche Problem

Die deutlichste Veranschaulichung der ZXing .NET -Architektur ist der Unterschied zwischen einem Single-Thread-Aufruf und einem Concurrent-Aufruf. In ZXing .NET erfordert die parallele Verarbeitung die Erstellung eines vollständigen Reader-Objekts pro paralleler Operation:

// ZXing.Net: full reader instantiation and configuration on every parallel task
Parallel.ForEach(files, file =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(file);
    var result = reader.Decode(bitmap);
    if (result != null)
        processed[file] = result.Text;
});

IronBarcode entfernt das Objekt vollständig. Der statische Aufruf ist derselbe, egal ob er auf einem oder hundert Threads ausgeführt wird:

// IronBarcode: static call, same code for single-threaded and concurrent use
Parallel.ForEach(files, file =>
{
    var result = BarcodeReader.Read(file).FirstOrDefault();
    if (result != null)
        processed[file] = result.Value;
});

IronBarcode vs. ZXing .NET: Funktionsvergleich

FeatureZXing.NetIronBarcode
LizenzApache 2.0 (kostenlos)Kommerziell
Thread-SicherheitNicht threadsicher – für jeden Thread ist eine neue Instanz erforderlich.Threadsichere statische API
FormaterkennungManuell — PossibleFormats Liste erforderlichAutomatisch – über 50 Formate
PDF-LesenNein – benötigt PdfiumViewer oder ein ähnliches Programm.Native — einzelner Methodenaufruf
Windows, Linux, macOS, Docker, Azure, AWS.Separate Bindungspakete pro PlattformEinzelpaket, alle Plattformen
Mehrere Barcodes pro BildJa — DecodeMultipleJa — Standartverhalten
Barcode-GenerierungGibt Bitmap zurück, erfordert manuelles SpeichernFluent API mit integrierter Ausgabe
Unterstützung für QR-Code-LogosNeinJa
QR-Code-FarbsteuerungNeinJa
Wiederherstellung beschädigter BarcodesTryHarder FlagML-gestützte Bildkorrektur
Zusätzliche Docker-AbhängigkeitenKann libgdiplus erfordernNone
Unterstützung für kommerzielle SLAsNeinJa
Erforderliche NuGet -Pakete2–3 (Kern + Bindung + optionales ImageSharp)1

Schnellstart

Schritt 1: Entfernen Sie die ZXing .NET -Pakete

Entfernen Sie alle ZXing .NET und zugehörigen Pakete aus dem Projekt:

dotnet remove package ZXing.Net
dotnet remove package ZXing.Net.Bindings.Windows.Compatibility
dotnet remove package ZXing.Net.Bindings.ImageSharp
dotnet remove package PdfiumViewer
SHELL

Wenn die nativen PdfiumViewer-Binärdateien als separates Paket installiert wurden:

dotnet remove package PdfiumViewer.Native.x64.v8-xfa
SHELL

Wenn die Dockerdatei apt-get install -y libgdiplus enthält — hinzugefügt, um System.Drawing über die Windows-Bindung auf Linux zu unterstützen — kann diese Zeile nach der Migration entfernt werden.

Schritt 2: IronBarcode installieren

dotnet add package IronBarcode
SHELL

Es werden keine zusätzlichen Bindungspakete oder plattformspezifische Abhängigkeiten benötigt. Das gleiche NuGet Paket läuft unter Windows, Linux, macOS und in Docker-Containern. Für Details zur Bereitstellung ist die Einrichtungsanleitung für IronBarcode Docker und Linux mit dem genauen Dockerfile-Muster versehen.

Schritt 3: Namensräume aktualisieren und Lizenz initialisieren

Entfernen Sie alle ZXing-bezogenen Namensräume aus jeder Datei, die Barcode-Operationen verwendet:

// Remove all of these:
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using PdfiumViewer;

// Add this single import:
using IronBarCode;

Fügen Sie die Lizenzinitialisierung beim Anwendungsstart vor allen Barcode-Operationen hinzu:

// Program.cs or Startup.cs — initialise once at startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

Der Lizenzschlüssel ist eine einfache Zeichenfolge, die aus einer Umgebungsvariable, appsettings.json oder einem Geheimnismanager geladen werden kann. Es gibt keine Datei zu finden und keinen Pfad zu konfigurieren.

Beispiele für die Code-Migration

Lesen eines einzelnen Barcodes aus einem Bild

Dieses Beispiel ersetzt das gängigste ZXing .NET Nutzungsmuster: Instanziieren eines Readers, Konfigurieren der Formatliste, Laden einer Bitmap und Dekodieren.

ZXing .NET -Ansatz:

using ZXing;
using ZXing.Windows.Compatibility;
using System.Drawing;

public string ReadSingleBarcode(string imagePath)
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(imagePath);
    var result = reader.Decode(bitmap);

    return result?.Text ?? string.Empty;
}

IronBarcode -Ansatz:

using IronBarCode;

public string ReadSingleBarcode(string imagePath)
{
    var result = BarcodeReader.Read(imagePath).FirstOrDefault();
    return result?.Value ?? string.Empty;
}

Die Formatliste, die Bitmap Zuweisung und der using-Block werden alle entfernt. IronBarcode akzeptiert einen Dateipfad direkt und erkennt alle unterstützten Formate automatisch. Die Eigenschaft, die zuvor die decodierte Zeichenfolge zurückgab, war result.Text in ZXing.Net; sie ist result.Value in IronBarcode.

Alle Barcodes aus einem Bild lesen

Dieses Beispiel ersetzt DecodeMultiple, das in ZXing.Net eine umfassende Formatliste erfordert, um stille Fehlschläge zu vermeiden.

ZXing .NET -Ansatz:

using ZXing;
using ZXing.Windows.Compatibility;
using System.Drawing;

public List<string> ReadAllBarcodes(string imagePath)
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.CODE_39,
        BarcodeFormat.EAN_13,
        BarcodeFormat.EAN_8,
        BarcodeFormat.UPC_A,
        BarcodeFormat.DATA_MATRIX,
        BarcodeFormat.PDF_417
    };
    reader.Options.TryHarder = true;

    using var bitmap = new Bitmap(imagePath);
    var results = reader.DecodeMultiple(bitmap);

    return results?.Select(r => r.Text).ToList() ?? new List<string>();
}

IronBarcode -Ansatz:

using IronBarCode;

public List<string> ReadAllBarcodes(string imagePath)
{
    return BarcodeReader.Read(imagePath)
        .Select(r => r.Value)
        .ToList();
}

BarcodeReader.Read gibt immer eine Sammlung zurück und gibt niemals null zurück, wodurch der Null-Wächter für das Ergebnis entfällt. Um das Gleichgewicht zwischen Genauigkeit und Geschwindigkeit zu optimieren, siehe den Leitfaden zu den Lesegeschwindigkeitsoptionen, der das ReadingSpeed enum behandelt, ohne den Formatscope einzuengen.

Gleichzeitige Stapelverarbeitung

Dieses Beispiel verdeutlicht den Unterschied in der Gewindesicherheit am deutlichsten. ZXing .NET benötigt für jeden parallelen Vorgang einen neuen Reader; IronBarcode verwendet unabhängig vom Parallelitätsgrad denselben statischen Aufruf.

ZXing .NET -Ansatz:

using ZXing;
using ZXing.Windows.Compatibility;
using System.Collections.Concurrent;
using System.Drawing;

public Dictionary<string, string> ProcessBatch(IEnumerable<string> filePaths)
{
    var output = new ConcurrentDictionary<string, string>();

    Parallel.ForEach(filePaths, new ParallelOptions { MaxDegreeOfParallelism = 4 }, file =>
    {
        // ZXing.Net is not thread-safe — a new reader is required per parallel operation
        var reader = new BarcodeReader();
        reader.Options.PossibleFormats = new List<BarcodeFormat>
        {
            BarcodeFormat.QR_CODE,
            BarcodeFormat.CODE_128
        };

        using var bitmap = new Bitmap(file);
        var result = reader.Decode(bitmap);
        if (result != null)
            output[file] = result.Text;
    });

    return output.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
}

IronBarcode -Ansatz:

using IronBarCode;
using System.Collections.Concurrent;

public Dictionary<string, string> ProcessBatch(IEnumerable<string> filePaths)
{
    var output = new ConcurrentDictionary<string, string>();
    var options = new BarcodeReaderOptions { MaxParallelThreads = 4 };

    Parallel.ForEach(filePaths, file =>
    {
        var result = BarcodeReader.Read(file, options).FirstOrDefault();
        if (result != null)
            output[file] = result.Value;
    });

    return output.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
}

Es gibt keine Leserinstanz, die geschützt oder isoliert werden müsste. Informationen zu asynchronen Pipeline-Mustern und zur Konfiguration der Thread-Anzahl finden Sie im Leitfaden zum asynchronen und multithreadbasierten Lesen von Barcodes .

Barcodes aus einer PDF-Datei extrahieren

Dieses Beispiel ersetzt die PdfiumViewer-Render-Schleife. Wenn die bestehende Integration statt PdfiumViewer Ghostscript oder iText verwendet hat, sieht der Vorblock im Detail anders aus, ist aber strukturell identisch: eine Seitendurchlauf-Schleife, die Bitmaps an ZXing.Net übergibt.

ZXing .NET -Ansatz:

using ZXing;
using ZXing.Windows.Compatibility;
using PdfiumViewer;
using System.Drawing;
using System.Drawing.Imaging;

public List<string> ExtractBarcodesFromPdf(string pdfPath)
{
    var collected = new List<string>();

    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.PDF_417
    };

    using var document = PdfDocument.Load(pdfPath);
    for (int page = 0; page < document.PageCount; page++)
    {
        string temp = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
        try
        {
            using var rendered = document.Render(page, 200, 200, PdfRenderFlags.CorrectFromDpi);
            rendered.Save(temp, ImageFormat.Png);

            using var bmp = new Bitmap(temp);
            var decoded = reader.DecodeMultiple(bmp);
            if (decoded != null)
                collected.AddRange(decoded.Select(d => d.Text));
        }
        finally
        {
            if (File.Exists(temp))
                File.Delete(temp);
        }
    }

    return collected;
}

IronBarcode -Ansatz:

using IronBarCode;

public List<string> ExtractBarcodesFromPdf(string pdfPath)
{
    return BarcodeReader.Read(pdfPath)
        .Select(r => r.Value)
        .ToList();
}

Die PdfiumViewer-Abhängigkeit, die Seitenrenderschleife, die DPI-Konfiguration, die Erstellung der temporären Datei und der Aufräumblock werden alle entfernt. IronBarcode liest Barcodes nativ aus PDFs und verarbeitet alle Seiten automatisch.

Barcode generieren

Der ZXing.Net-Schreiber gibt ein Bitmap zurück, das Anrufer mit System.Drawing.Imaging speichern müssen. IronBarcode gibt ein GeneratedBarcode mit integrierten Ausgabemethoden zurück.

ZXing .NET -Ansatz:

using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing;
using System.Drawing.Imaging;

public void WriteCode128(string content, string outputPath)
{
    var writer = new BarcodeWriter
    {
        Format = BarcodeFormat.CODE_128,
        Options = new EncodingOptions
        {
            Width = 400,
            Height = 120,
            Margin = 10
        }
    };

    using var bitmap = writer.Write(content);
    bitmap.Save(outputPath, ImageFormat.Png);
}

IronBarcode -Ansatz:

using IronBarCode;

public void WriteCode128(string content, string outputPath)
{
    BarcodeWriter.CreateBarcode(content, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .SaveAsPng(outputPath);
}

Wenn eine binäre Ausgabe anstelle des Speicherns in einer Datei benötigt wird, sind ToPngBinaryData() und ToJpegBinaryData() auf dem zurückgegebenen GeneratedBarcode Objekt ohne jegliche MemoryStream-Verrohrung verfügbar.

ZXing .NET API zu IronBarcode Mapping-Referenz

ZXing.NetIronBarcodeNotizen
new BarcodeReader()Statisch – keine InstanzBarcodeReader.Read(...) ist ein statischer Aufruf
reader.Options.PossibleFormats = new List<BarcodeFormat> { ... }Nicht erforderlichDie automatische Erkennung deckt alle über 50 Formate ab.
reader.Options.TryHarder = trueSpeed = ReadingSpeed.BalancedGenauigkeitsabstimmung über BarcodeReaderOptions
reader.Decode(bitmap)BarcodeReader.Read(imagePath).FirstOrDefault()Dateipfad übergeben — keine Bitmap Konstruktion erforderlich
reader.DecodeMultiple(bitmap)BarcodeReader.Read(imagePath)Gibt immer eine Sammlung zurück; never null
result.Textresult.ValueImmobilie umbenannt
result.BarcodeFormatresult.FormatImmobilie umbenannt
BarcodeFormat.QR_CODEBarcodeEncoding.QRCodeÄnderung der Namenskonvention für Enumerationen
BarcodeFormat.CODE_128BarcodeEncoding.Code128Änderung der Namenskonvention für Enumerationen
BarcodeFormat.EAN_13BarcodeEncoding.EAN13Änderung der Namenskonvention für Enumerationen
BarcodeFormat.DATA_MATRIXBarcodeEncoding.DataMatrixÄnderung der Namenskonvention für Enumerationen
BarcodeFormat.PDF_417BarcodeEncoding.PDF417Änderung der Namenskonvention für Enumerationen
new BarcodeWriter { Format = ..., Options = new EncodingOptions { ... } }BarcodeWriter.CreateBarcode(data, encoding)Statische Fabrik, kein Optionsobjekt
writer.Write(data) gibt Bitmap zurück.SaveAsPng(path) / .ToPngBinaryData()Integrierte Ausgabe auf GeneratedBarcode
EncodingOptions { Width, Height }.ResizeTo(width, height)Fluent-Dimensionierungsmethode
Keine PDF-UnterstützungBarcodeReader.Read("file.pdf")Native PDF-Unterstützung, alle Seiten

Gängige Migrationsprobleme und Lösungen

Ausgabe 1: Instanziierungsmuster für Barcode-Lesegeräte

ZXing.Net: Anrufer erstellen eine new BarcodeReader(), setzen reader.Options.PossibleFormats, laden eine Bitmap, rufen reader.Decode(bitmap) oder reader.DecodeMultiple(bitmap) auf und lesen result.Text.

Lösung: Die Instanziierung vollständig entfernen. Ersetzen Sie das vollständige Muster durch einen statischen Aufruf:

// Before: reader creation + format config + bitmap + decode + result.Text
// After:
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
var value = result?.Value ?? string.Empty;

Durchsuchen Sie die Codebasis nach new BarcodeReader(), um jede Instanz zu finden. Jeder einzelne Eintrag wird entfernt, nicht refaktoriert.

Problem 2: Entfernung des PossibleFormats-Blocks

ZXing .NET: Jedem Dekodieraufruf geht ein reader.Options.PossibleFormats = new List voraus.<BarcodeFormat> { ... }Zuweisung. Diese Listen sind oft lang und projektspezifisch.

Lösung: Löschen Sie jedes PossibleFormats Zuweisungsblock vollständig. IronBarcode führt eine automatische Formaterkennung durch; Es wird keine Formatliste akzeptiert oder benötigt. Wenn das TryHarder = true-Flag zusammen mit der Formatliste gesetzt wurde, ersetzen Sie es durch Speed = ReadingSpeed.Balanced auf einem BarcodeReaderOptions Objekt, wenn eine Genauigkeitsabstimmung erforderlich ist.

Problem 3: Bereinigung des Bindungspakets

ZXing.Net: Projekte, die ZXing.Net.Bindings.Windows.Compatibility verwenden, haben Code, der sich auf System.Drawing.Bitmap als Eingabetyp bezieht. Projekte, die ZXing.Net.Bindings.ImageSharp verwenden, beziehen sich auf SixLabors.ImageSharp.Image<Rgba32>. Beide Muster funktionieren nicht mehr, nachdem die Bindungspakete entfernt wurden.

Lösung: Entfernen Sie beide Binding-Pakete und ersetzen Sie den gesamten Code zum Laden von Bildern. IronBarcode's BarcodeReader.Read akzeptiert einen Dateipfad als Zeichenfolge, eine byte[], eine Stream oder eine Uri — keine Bitmap oder Image<t> Konstruktion ist erforderlich. Übrige using System.Drawing; Importe, die ausschließlich zum Bitmap Laden existierten, können ebenfalls entfernt werden.

Problem 4: result.Text zu result.Value

ZXing.Net: Der decodierte Barcode-Wert wird über result.Text aufgerufen. Das Barcode-Format wird über result.BarcodeFormat aufgerufen.

Lösung: Ersetzen Sie result.Text durch result.Value und result.BarcodeFormat durch result.Format in der gesamten Codebasis. Beide Änderungen sind einfache Eigenschafts-Umbenennungen ohne Verhaltensunterschied.

ZXing .NET Migrations-Checkliste

Vor der Migration anfallende Aufgaben

Prüfen Sie den Quellcode auf alle ZXing .NET -Referenzen, bevor Sie Änderungen vornehmen:

grep -r "using ZXing" --include="*.cs" .
grep -r "new BarcodeReader" --include="*.cs" .
grep -r "PossibleFormats" --include="*.cs" .
grep -r "BarcodeFormat\." --include="*.cs" .
grep -r "reader\.Decode\|reader\.DecodeMultiple" --include="*.cs" .
grep -r "result\.Text\|result\.BarcodeFormat" --include="*.cs" .
grep -r "new BarcodeWriter\|writer\.Write\|EncodingOptions" --include="*.cs" .
grep -r "PdfiumViewer\|PdfDocument\.Load" --include="*.cs" .
grep -r "using System\.Drawing" --include="*.cs" .
SHELL

Dokumentieren Sie, welche Dateien auf ZXing-Bindungspakete (Windows vs. ImageSharp) verweisen und vermerken Sie, wo System.Drawing.Bitmap ausschließlich für ZXing-Eingaben verwendet wird. Überprüfen Sie die Dockerdatei (falls vorhanden) auf libgdiplus Installation.

Aufgaben der Code-Aktualisierung

  1. Entfernen Sie ZXing.Net, ZXing.Net.Bindings.Windows.Compatibility, ZXing.Net.Bindings.ImageSharp und PdfiumViewer NuGet-Pakete
  2. Installieren Sie das IronBarcode NuGet-Paket
  3. Fügen Sie IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; zum Anwendungsstart hinzu
  4. Ersetzen Sie alle using ZXing* und using SixLabors.ImageSharp* Importe durch using IronBarCode;
  5. Entfernen Sie jede new BarcodeReader() Instanziierung
  6. Löschen Sie jeden reader.Options.PossibleFormats = ... Block
  7. Ersetzen Sie reader.Decode(bitmap) durch BarcodeReader.Read(imagePath).FirstOrDefault()
  8. Ersetzen Sie reader.DecodeMultiple(bitmap) durch BarcodeReader.Read(imagePath)
  9. Ersetzen Sie result.Text durch result.Value
  10. Ersetzen Sie result.BarcodeFormat durch result.Format
  11. Aktualisieren Sie BarcodeFormat.X Enum-Referenzen zu BarcodeEncoding.X Äquivalenten
  12. Ersetzen Sie new BarcodeWriter { Format = ..., Options = new EncodingOptions { ... } }with BarcodeWriter.CreateBarcode(data, encoding).ResizeTo(w, h)
  13. Ersetzen Sie writer.Write(data) + bitmap.Save(...) durch .SaveAsPng(path) oder .ToPngBinaryData()
  14. Entfernen Sie alle using System.Drawing; Importe, die ausschließlich für ZXing.Net Bitmap-Laden existierten
  15. Entfernen Sie die PDFViewer-Seitenrenderschleife überall dort, wo sie als PDF-Workaround implementiert wurde.
  16. Entfernen Sie libgdiplus aus der Dockerdatei, wenn es hinzugefügt wurde, um System.Drawing auf Linux zu unterstützen

Post-Migrationstests

  • Überprüfen Sie, ob jedes Barcode-Format, für dessen Erkennung die Anwendung zuvor konfiguriert wurde, erfolgreich erkannt wird.
  • Testen Sie mit Bildern, die Barcode-Formate enthalten, die zuvor von der PossibleFormats-Liste ausgeschlossen waren, um sicherzustellen, dass die automatische Erkennung sie erfasst.
  • Führen Sie die parallelen Verarbeitungspfade unter Last aus und stellen Sie sicher, dass keine Race Conditions oder Null-Ergebnisse auftreten.
  • Falls die Anwendung PDFs über PdfiumViewer verarbeitet hat, geben Sie dieselben PDF-Eingaben an und überprüfen Sie, ob die Barcode-Werte übereinstimmen.
  • Prüfen Sie, ob die generierten Barcodes (Code 128, QR-Code usw.) das korrekte Ausgabeformat und die korrekten Abmessungen aufweisen.
  • Bestätigen Sie auf Linux- oder Docker-Bereitstellungen, dass das Lesen von Bildern und von PDFs ohne libgdiplus funktioniert
  • Führen Sie die vollständige Suite aus und vergleichen Sie die Ausgabe mit der Baseline vor der Migration.

Wichtigste Vorteile der Migration zu IronBarcode

Wegfall des Thread-Sicherheitsaufwands: Die statische API von IronBarcode beseitigt das Instanzmuster pro Thread vollständig. Es gibt keinen Leser zum Instanziieren, keine Formatliste pro Thread zu konfigurieren und keinen ThreadLocal Pool zu verwalten. Derselbe Aufruf ist sowohl in Single-Thread- als auch in hochgradig parallelen Umgebungen korrekt, und die Parallelitätskorrektheit wird von der Bibliothek gewährleistet und nicht an jeden Aufrufer delegiert.

Automatische Format-Erkennung: Das Entfernen der PossibleFormats-Liste beseitigt die Kategorie der stillen-Fehltreffer, die auftreten, wenn Dokumente Barcode-Formate enthalten, die während der Entwicklung nicht erwartet wurden. Anwendungen, die Dokumente von externen Partnern verarbeiten oder mit sich entwickelnden Barcode-Standards arbeiten, benötigen keine Formatlistenpflege mehr, um zuverlässig zu bleiben.

Native PDF-Verarbeitung: Die PdfiumViewer-Rendering-Schleife – einschließlich Seitenaufzählung, DPI-Konfiguration, Lebenszyklus temporärer Dateien und Aufräumcode – wird vollständig entfernt. Anwendungen, die bisher zwei Bibliotheken (ZXing .NET und einen PDF-Renderer) zur Verarbeitung eines PDF-Barcodes benötigten, verwenden jetzt nur noch eine. Die Reduzierung der bereitgestellten Abhängigkeiten vereinfacht sowohl den Build- als auch den Bereitstellungsprozess.

Einheitliches plattformübergreifendes Paket: Die Unterscheidung zwischen Windows- und Linux-Bereitstellungen mittels Bindungspaketen entfällt. Der gleiche BarcodeReader.Read(path)-Aufruf kompiliert und verhält sich identisch auf allen Zielplattformen, wodurch die Notwendigkeit von Plattformkonditionals im Bildlade-Code entfällt und die plattformübergreifende Entwicklung und Containerisierungs-Workflows vereinfacht werden.

Reduzierter Infrastrukturcode: Das wichtigste Ergebnis der Migration ist die Entfernung der umgebenden Infrastruktur – der Bitmap-Ladeblöcke, der Formatlisten, der PdfiumViewer-Renderschleifen, der ThreadLocal-Pools –, die in ZXing .NET -Integrationen nicht für die Barcode-Verarbeitung, sondern zur Erfüllung der architektonischen Anforderungen der Bibliothek existierten. Was nach der Migration übrig bleibt, ist die Barcode-Logik selbst. Für einen umfassenderen Kontext zu Erkennungsraten und Scan-Szenarien bietet der Scannervergleich ZXing .NET vs. IronBarcode eine detailliertere Analyse.

Hinweis:: Ghostscript, PDFium, ZXing.NET und iText sind eingetragene Marken ihrer jeweiligen Eigentümer). Diese Seite ist nicht mit Artifex Software, Chromium Project, Google, ZXing.NET oder iText Group verbunden, genehmigt oder gesponsert. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber. 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.