Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

Accusoft BarcodeXpress im Vergleich zu IronBarcode: C# Barcode Bibliothek Vergleich

BarcodeLibvs IronBarcode: Wo der Open-Source-Generator aufhört

BarcodeLib ist eine langjährige Open-Source .NET-Bibliothek, die die meisten Entwickler irgendwann entdecken können nur Barcodes erzeugen. Ein Teil von ihnen entdeckt auch den SkiaSharp-Versionskonflikt — normalerweise im schlimmsten Moment, wenn sie BarcodeLibgerade zu einem MAUI- oder Blazor-Projekt hinzugefügt haben, das bereits von SkiaSharp abhängig ist und der Build beginnt NU1608-Warnungen zu werfen. Dieser Artikel behandelt beide Probleme. BarcodeLibist eine legitime Bibliothek mit einem klaren Anwendungsfall. Die praktische Frage ist, wo es aufhört.

BarcodeLibverstehen

BarcodeLib ist eine Open-Source-Bibliothek zur Generierung von Barcode-Bildern for .NET, die von Brad Barnhill auf GitHub gepflegt wird. Es ist seit 2007 aktiv und unterstützt etwa 30 1D-Symbologievarianten. Die Apache 2.0-Lizenz erlaubt die kostenlose kommerzielle Nutzung. Für reine lineare Barcodeerzeugung — das Erstellen eines Bildes aus einer Zeichenkette — arbeitet es zuverlässig und hat diesen Zweck über viele Jahre aktiver Nutzung gut erfüllt.

Die API ist instanzbasiert. Sie erstellen ein Barcode-Objekt, setzen Eigenschaften und rufen Encode() mit einem Typkonstanten, einem Datensaiten und Pixelmaßen auf. Das Ergebnis ist ein SKImage (SkiaSharp), das Sie dann nach Bedarf kodieren und speichern oder streamen. Dieser Arbeitsablauf ist zugänglich und für Projekte, bei denen die Anforderung ausschließlich darin besteht, lineare Barcode-Bilder zu drucken — Versandetiketten, Inventaretiketten, Preisschilder im Einzelhandel — ist er ausreichend.

Wichtigste architektonische Merkmale von BarcodeLib:

  • Nur-Generierungs-Bereich: Die Bibliothek verfügt über keine Lese- oder Dekodierungs-API jeglicher Art; seine gesamte öffentliche Oberfläche ist auf die Erzeugung von Bildern aus Datenstrings ausgerichtet
  • Instanzbasierte API: Jeder Vorgang erfordert die Instanziierung eines Barcode-Objekts und die Konfiguration von Etiketten- und Schrifteigenschaften, bevor Sie Encode() aufrufen.
  • Gibt SKImage zurück: Die Ausgabe ist ein SkiaSharp-Bildobjekt, das einen SKEncodedImageFormat-Schritt und einen Stream erfordert, um eine Datei oder ein Byte-Array zu erzeugen.
  • Nur 1D-Symbologien: Unterstützt etwa 30 lineare Formate, darunter Code128, EAN-13, UPC-A und Code39; Das BarcodeStandard.Type-Enum in der aktuellen 3.x-Quelle enthält keinen QR-Code, Data Matrix, PDF417, Aztec oder andere 2D-Einträge.
  • SkiaSharp-Abhängigkeit (v3.x): Die 3.x-Serie ersetzte System.Drawing.Common durch SkiaSharp, um plattformübergreifende Unterstützung zu ermöglichen; Dies birgt das Risiko von Versionskonflikten, wenn andere Pakete im Projekt ebenfalls von SkiaSharp abhängen.
  • Kostenlos, kein Lizenzschlüssel erforderlich: Die Apache 2.0-Lizenz deckt die kommerzielle Nutzung ab; es ist kein Laufzeitschlüssel oder eine Aktivierung erforderlich.

BarcodeLibCore-Generierungsmuster

Der standardmäßige BarcodeLib-Erstellungsvorgang erfordert das Erstellen einer Instanz, die Konfiguration von Eigenschaften und das Aufrufen von Encode() mit Maßen:

using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);

using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);

using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
Imports BarcodeStandard
Imports SkiaSharp

Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)

Using stream = File.OpenWrite("barcode.png")
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
$vbLabelText   $csharpLabel

Dies ist der vollständige Generierungsablauf. Das Property-Setter-Muster ist das Design: Die Konfiguration erfolgt auf der Instanz vor dem Encode()-Aufruf, und der Rückgabewert ist ein SKImage, das kodiert und in einen Stream geschrieben werden muss.

IronBarcode verstehen

IronBarcode ist eine kommerzielle .NET Barcode-Bibliothek, die sowohl die Generierung als auch das Lesen in einem einzigen Paket abdeckt. Es wird über NuGet installiert, läuft auf .NET Framework 4.6.2 bis .NET 9 und funktioniert unter Windows, Linux, macOS, Docker, Azure und AWS Lambda. Die Bibliothek wird von Iron Software mit einem kommerziellen Supportmodell entwickelt und gepflegt.

Die Generierungs-API ist statisch und fließend – es muss keine Instanz erstellt und keine Eigenschaften vor dem primären Aufruf festgelegt werden. Konfigurationsoptionen verketten sich mit dem Ergebnis von BarcodeWriter.CreateBarcode() oder QRCodeWriter.CreateQrCode(). Ausgabemethoden am Ende der Kette — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — beseitigen das Zwischen-MemoryStream-Muster, das BarcodeLiberfordert. Das Lesen ist Teil desselben Pakets, es muss keine separate Bibliothek oder ZXing .NET Integration gepflegt werden.

Hauptmerkmale von IronBarcode:

  • Erzeugung und Lesen in einem Paket: BarcodeWriter behandelt die Erzeugung; BarcodeReader behandelt das Lesen; Beide werden im selben NuGet Paket ausgeliefert.
  • Statische Fluent API: Keine Instanziierung erforderlich; Konfigurationsketten nach CreateBarcode() unter Verwendung von Fluent-Methoden
  • Direkte Byte-Array-Ausgabe: .ToPngBinaryData() gibt byte[] ohne einen MemoryStream-Schritt zurück.
  • PDF-Unterstützung auf beiden Seiten: BarcodeReader.Read() akzeptiert PDF-Dateien nativ; Die generierten Ergebnisse können in PDFs eingebettet werden.
  • Keine SkiaSharp-Abhängigkeit: Unabhängig vom SkiaSharp-Versionsgraphen, wodurch NU1608-Konflikte in MAUI und anderen Projekten vermieden werden.
  • Kommerzielle Lizenz mit SLA: Preis: 749–5.999 US-Dollar (unbefristet); beinhaltet kommerziellen Support und garantierte Aktualisierungsintervalle
  • ReadingSpeed-Anpassung: BarcodeReaderOptions ermöglicht den Tausch der Scan-Gründlichkeit gegen Volumenleistung.

Funktionsvergleich

Feature BarcodeLib IronBarcode
Barcode-Generierung Ja (nur 1D) Ja (1D und 2D)
Barcode-Lesung Nein Ja
2D symbologies (QR, Data Matrix, PDF417, Aztec) Nein Ja
PDF-Barcode-Lesen Nein Ja
SkiaSharp-Abhängigkeit im Diagramm Ja (Version 3.x) Nein
Fluent verkettbare API Nein Ja
Lizenz Apache 2.0 (kostenlos) 749–5.999 $ (dauerhaft)

Detaillierter Funktionsvergleich

Feature BarcodeLib IronBarcode
Generation
Code-128-Generierung Ja Ja
EAN-13 / UPC-A Generation Ja Ja
QR-Code-Generierung Nein Ja (mit Logo-Einbettung)
Data Matrix / PDF417 / Aztec Nein Ja
1D-Symbologie-Abdeckung ~30 Varianten 30+ Varianten
API für flüssige, verkettbare Generierung Nein Ja
Direkte byte[]-Ausgabe Manual (Stream-Codeierung) .ToPngBinaryData()
PDF-Generierungsausgabe Nein Ja
Lektüre
Barcode aus Bild lesen Nein Ja (BarcodeReader.Read())
Barcode-Lesen aus PDF Nein Ja (nativ, keine zusätzliche Bibliothek)
Mehrfach-Barcode-Erkennung Nein Ja (ExpectMultipleBarcodes)
Lesegeschwindigkeitseinstellung Nicht anwendbar Ja (ReadingSpeed-Enum)
Plattform
Windows Ja Ja
Linux / macOS Partiell (SkiaSharp-abhängig) Voll
Docker / Container Konfiguration erforderlich Ja
MAUI-Projektkompatibilität Konfliktrisiko (NU1608) Kein Konflikt
.NET Framework 4.6.2+ Ja Ja
.NET 6-9 Ja (SkiaSharp 3.x erforderlich) Ja
Lizenzierung
Open Source / kostenlos Ja (Apache 2.0) Nein
Kommerzieller Support / SLA Nein Ja
Lizenzschlüssel erforderlich Nein Ja
Preisgestaltung Kostenlos 749–5.999 $ (dauerhaft)

Barcode-Generierungs-API

Die Generierungs-APIs repräsentieren unterschiedliche Designphilosophien: BarcodeLibverwendet eine veränderbare Instanzkonfiguration, während IronBarcode eine fließende Kette auf einem statischen Einstiegspunkt verwendet.

BarcodeLib-Ansatz

BarcodeLib erfordert das Erstellen einer Instanz und das Setzen von Eigenschaften, bevor Encode() mit Dimensionen aufgerufen wird. Die Ausgabe ist ein SKImage:

using BarcodeStandard;
using SkiaSharp;

public byte[] GenerateCode128(string data)
{
    var b = new Barcode();
    b.IncludeLabel = true;
    SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);

    using var ms = new MemoryStream();
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
    return ms.ToArray();
}
using BarcodeStandard;
using SkiaSharp;

public byte[] GenerateCode128(string data)
{
    var b = new Barcode();
    b.IncludeLabel = true;
    SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);

    using var ms = new MemoryStream();
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
    return ms.ToArray();
}
Imports BarcodeStandard
Imports SkiaSharp

Public Function GenerateCode128(data As String) As Byte()
    Dim b As New Barcode()
    b.IncludeLabel = True
    Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100)

    Using ms As New MemoryStream()
        img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
        Return ms.ToArray()
    End Using
End Function
$vbLabelText   $csharpLabel

Der SKImage-Rückgabetyp bedeutet, dass die Byte-Array-Ausgabe einen SKEncodedImageFormat-Kodierungsaufruf und einen MemoryStream erfordert. Die IncludeLabel-Eigenschaft ist ein boolescher Schalter — BarcodeLibrendert die kodierte Datenzeichenfolge als sichtbares Etikett unter den Balken.

IronBarcode Ansatz

Die Barcode-Generierung von IronBarcode ist vollständig statisch. Konfigurationsketten nach CreateBarcode(), und Ausgabemethoden beenden die Kette direkt:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

public byte[] GenerateCode128(string data)
{
    return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .AddBarcodeValueTextBelowBarcode()
        .ToPngBinaryData();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

public byte[] GenerateCode128(string data)
{
    return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .AddBarcodeValueTextBelowBarcode()
        .ToPngBinaryData();
}
Imports IronBarCode

Public Function GenerateCode128(data As String) As Byte()
    Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
        .ResizeTo(300, 100) _
        .AddBarcodeValueTextBelowBarcode() _
        .ToPngBinaryData()
End Function
$vbLabelText   $csharpLabel

.ToPngBinaryData() gibt das Byte-Array direkt zurück — kein Zwischen-Image- oder MemoryStream-Objekt. .AddBarcodeValueTextBelowBarcode() rendert die kodierte Datenzeichenfolge als Etikett unter den Balken. Für fortgeschrittene Generierungsszenarien siehe die IronBarcode Dokumentation zur Barcode-Generierung .

Barcode-Lesefähigkeit

Das Lesen stellt die bedeutendste funktionale Grenze zwischen diesen beiden Bibliotheken dar. BarcodeLibbesitzt keine Lesefunktion; IronBarcode beinhaltet eine vollständige Lese-Engine im selben Paket.

BarcodeLib-Ansatz

BarcodeLib besitzt keine Lese-API. Es gibt keine Decode()-, Scan()-, oder ReadBarcode()-Methode. Lesen war nie Teil des Designs der Bibliothek. Jeder Versuch, eine Dekodierungsmethode aufzurufen, führt zu einem Kompilierungsfehler:

using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();

// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png");      // does not exist
// b.Scan("barcode.png");        // does not exist
// b.ReadBarcode("barcode.png"); // does not exist

// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();

// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png");      // does not exist
// b.Scan("barcode.png");        // does not exist
// b.ReadBarcode("barcode.png"); // does not exist

// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
Imports BarcodeStandard
Imports SkiaSharp

Dim b = New Barcode()

' There is no Decode, Scan, or Read method on Barcode.
' b.Decode("barcode.png")      ' does not exist
' b.Scan("barcode.png")        ' does not exist
' b.ReadBarcode("barcode.png") ' does not exist

' The only public operation is generation:
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)
$vbLabelText   $csharpLabel

Teams, die neben BarcodeLibsowohl die Generierung als auch das Lesen benötigen, müssen eine zweite Bibliothek hinzufügen – typischerweise ZXing .NET –, was einen eigenen Aufwand für die Abhängigkeitsverwaltung und eine zweite zu pflegende API-Oberfläche mit sich bringt.

IronBarcode Ansatz

BarcodeReader.Read() akzeptiert Bilddateien, PDF-Dateien, Streams und System.Drawing.Bitmap-Objekte. Zum Lesen einer PDF-Datei ist keine zusätzliche Bibliothek erforderlich:

using IronBarCode;

// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value);  // "PRODUCT-12345"

// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}

// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;

// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value);  // "PRODUCT-12345"

// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}

// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode

' Read from an image
Dim results = BarcodeReader.Read("barcode.png")
Console.WriteLine(results.First().Value)  ' "PRODUCT-12345"

' Read all barcodes from a PDF — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next

' Tune reading for speed vs. thoroughness
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-scan.png", options)
$vbLabelText   $csharpLabel

Das ReadingSpeed-Enum ermöglicht die Feinabstimmung der Scanleistung für Szenarien mit hohem Volumen. Hinweise zur Konfiguration des Lesevorgangs finden Sie in der IronBarcode -Lesedokumentation .

SkiaSharp Abhängigkeitskonflikt

Die in BarcodeLib3.x eingeführte SkiaSharp-Abhängigkeit erzeugt eine Konfliktklasse, die in IronBarcode nicht existiert.

BarcodeLib-Ansatz

Ab BarcodeLib3.x führte die Bibliothek SkiaSharp als Grafik-Backend ein, um System.Drawing.Common zu ersetzen, das nach .NET 6 nur noch unter Windowsverwendet werden konnte. BarcodeLib3.1.5 erklärt SkiaSharp >= 2.88.8. Wenn ein Projekt bereits SkiaSharp über eine andere Abhängigkeit verwendet — was in MAUI-Projekten mit SkiaSharp.Views.Maui und Microsoft.Maui.Graphics häufig vorkommt, die zu SkiaSharp 3.x tendieren — können sich die aufgelösten Versionen nicht vereinbaren. Das Ergebnis ist mindestens eine NU1608-Warnung und schlimmstenfalls ein Assembly-Bindungsfehler zur Laufzeit:

warning NU1608: Detected package version outside of dependency constraint:
BarcodeLib 3.1.5 requires SkiaSharp (>= 2.88.8) but
version SkiaSharp 3.116.1 was resolved.

Eine Lösung zu erzwingen, indem man explizite Paketreferenzen verwendet, ist ein Weg, aber es gibt keine Garantie für Laufzeitkompatibilität:

<ItemGroup>
  <PackageReference Include="BarcodeLib" Version="3.1.5" />
  <PackageReference Include="SkiaSharp" Version="3.116.1" />
  <PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
  <PackageReference Include="BarcodeLib" Version="3.1.5" />
  <PackageReference Include="SkiaSharp" Version="3.116.1" />
  <PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
XML

Selbst mit expliziten Überschreibungen hängt die Kompatibilität davon ab, dass die internen API-Aufrufe von BarcodeLibmit dem übereinstimmen, was die aufgelöste SkiaSharp-Version bereitstellt. Als von der Community gepflegtes Projekt hat BarcodeLibkeinen kommerziellen Support-Vertrag, der mit seinem Release-Rhythmus verbunden ist.

IronBarcode Ansatz

IronBarcode teilt den SkiaSharp-Abhängigkeitsgraphen nicht mit dem Anwendungscode. Es gibt keine Versionsverhandlungen, die verwaltet werden müssen, keine NU1608-Fehlerdiagnose und kein Laufzeit-Assembly-Bindungsrisiko im Zusammenhang mit der SkiaSharp-Versionsauflösung. MAUI-Projekte, Blazor -Projekte und alle anderen Anwendungen, die von SkiaSharp abhängen, können IronBarcode ohne Versionskonflikte installieren. Für MAUI-spezifische Integrationsmuster siehe die IronBarcode MAUI-Dokumentation .

API-Mapping-Referenz

BarcodeLib IronBarcode
new Barcode() Statische API – keine Instanz erforderlich
b.Encode(BarcodeStandard.Type.Code128, "data", 300, 100) BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).ResizeTo(300, 100)
b.IncludeLabel = true .AddBarcodeValueTextBelowBarcode()
Gibt SKImage zurück .SaveAsPng(path) / .ToPngBinaryData()
BarcodeStandard.Type.Code128 BarcodeEncoding.Code128
BarcodeStandard.Type.Code39 BarcodeEncoding.Code39
BarcodeStandard.Type.Ean13 BarcodeEncoding.EAN13
BarcodeStandard.Type.UpcA BarcodeEncoding.UPCA
Nicht unterstützt (kein 2D in BarcodeLib) BarcodeEncoding.QRCode (auch QRCodeWriter)
Keine Lese-API BarcodeReader.Read(path)
SkiaSharp in Abhängigkeitsdiagramm Keine SkiaSharp-Abhängigkeit

Wenn Teams einen Wechsel von BarcodeLibzu IronBarcode erwägen

Leseanforderung erscheint

Ein System, das seit Monaten Versandetiketten generiert, erhält eine neue Anforderung: Die Anwendung muss nun auch von Lieferanten zurückgesendete Etiketten verarbeiten können. Die Lagerintegration muss Barcodes aus eingehenden Lieferscheinen auslesen können. Ein Dokumentenmanagementsystem muss Barcodes auf gescannten PDFs indexieren können. BarcodeLibkann keine dieser Anforderungen erfüllen – die Lese-API existiert nicht. Das Team prüft die Möglichkeit, ZXing .NET parallel zu BarcodeLibzu installieren, wägt den Wartungsaufwand für zwei Bibliotheken und die zwei separaten Abhängigkeitsgraphen ab und entscheidet sich schließlich für eine Bibliothek, die sowohl die Generierung als auch das Lesen mit einer einzigen NuGet Installation ermöglicht.

SkiaSharp-Konflikt in einem MAUI-Projekt

Ein Team fügt BarcodeLibzu einer bestehenden MAUI-Anwendung hinzu und stößt während der Wiederherstellung sofort auf NU1608-Warnungen. Sie untersuchen das Versionsmismatch zwischen dem erwarteten SkiaSharp-Bereich von BarcodeLibund der von MAUI benötigten Version, fügen explizite <PackageReference>-Überschreibungen hinzu, um eine Lösung zu erzwingen, und bringen den Build zum Bestehen. Dann kommt es auf dem Gerät zu einem Laufzeitabsturz, wenn die nativen Binärdateien von SkiaSharp die falsche Version laden. Zur Behebung des Problems ist eine genauere Untersuchung des Assembly-Bindungsprotokolls erforderlich. Durch den Wechsel zu IronBarcode wird der Konflikt an der Wurzel beseitigt – nicht etwa durch das Finden einer kompatiblen SkiaSharp-Version, sondern durch die vollständige Eliminierung der gemeinsamen Abhängigkeit.

PDF-Barcode-Verarbeitung erforderlich

Anwendungen, die PDF-Dokumente mit eingebetteten Barcodes generieren – Rechnungen, Arbeitsaufträge, Versandmanifeste – müssen diese Barcodes manchmal bei der Weiterverarbeitung wieder einlesen. BarcodeLibgeneriert Barcode-Bilder, bietet aber auf keiner Seite PDF-Unterstützung. Das Einlesen von Barcodes aus einer PDF-Datei mit BarcodeLiberfordert, dass die PDF-Datei zunächst mithilfe einer separaten PDF-Bibliothek in Bilder umgewandelt wird, bevor diese Bilder an eine separate Lesebibliothek übergeben werden können. IronBarcode behandelt die gesamte Kette nativ: BarcodeReader.Read("file.pdf") durchläuft jede Seite und gibt alle erkannten Barcodes ohne einen Zwischenschritt der Darstellung zurück.

QR-Code oder andere 2D-Symbologie-Anforderung erscheint

Projekte, die ursprünglich nur lineare Barcodes benötigten, entwickeln sich oft dahingehend, dass sie QR-Code, Data Matrix, PDF417 oder Aztec-Ausgabe benötigen. BarcodeLibgeneriert keine 2D-Symbologie in seiner 3.x-Serie — das BarcodeStandard.Type-Enum enthält keinen QR-Code oder andere 2D-Einträge — daher bedeutet jede 2D-Anforderung entweder die Hinzufügung einer zweiten Bibliothek oder den vollständigen Ersatz von BarcodeLib. IronBarcode's QRCodeWriter und BarcodeWriter decken QR-Code (mit Logo-Einbettung, Farbsteuerung und Fehlerkorrektur-Anpassung), Data Matrix, PDF417 und Aztec über die gleiche Fluent-API ab. Teams, deren Symbologie-Anforderungen in 2D übergehen, stellen fest, dass die Lücke die Migrationsentscheidung antreibt.

Gemeinsame Überlegungen zur Migration

Instanz-API zu statischer Fluent-API

BarcodeLib-Code verwendet ein veränderliches Objektmuster: erstellen Sie eine Barcode-Instanz, setzen Sie Eigenschaften, rufen Sie Encode() auf. IronBarcode verwendet ein statisches Fluent-Muster: Rufen Sie BarcodeWriter.CreateBarcode() auf, verketten Sie Konfigurationsmethoden, beenden Sie mit einer Ausgabemethode. Vorhandener Code, der eine Barcode-Instanz als Feld speichert oder zwischen Methoden übergibt, muss neu strukturiert werden. Die typische Änderung besteht darin, den Property-Setter-Block durch eine Methodenkette zu ersetzen:

// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .AddBarcodeValueTextBelowBarcode()
    .SaveAsPng(outputPath);
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .AddBarcodeValueTextBelowBarcode()
    .SaveAsPng(outputPath);
' The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .AddBarcodeValueTextBelowBarcode() _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

SKImage zu direkter Ausgabe

BarcodeLib 3.x gibt SKImage zurück, das SKEncodedImageFormat und einen Stream benötigt, um Bytes zu erzeugen. Jeder Code, der auf SKImage typisiert ist oder durch image.Encode(...).SaveTo(stream) geht, muss aktualisiert werden. Die Fluent-Kette von IronBarcode endet direkt mit dem gewünschten Ausgabeformat — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — und entfernt die Notwendigkeit für das Zwischenabbildobjekt und den Kodierungs-zu-Stream-Schritt.

Type Enum to BarcodeEncoding Enum

BarcodeLib 3.x verwendet das BarcodeStandard.Type-Enum mit PascalCase-Werten wie BarcodeStandard.Type.Code128. IronBarcode verwendet das BarcodeEncoding-Enum mit Werten wie BarcodeEncoding.Code128. Die 1D-Werte werden direkt zugeordnet: Code128Code128, Ean13EAN13, UpcAUPCA, Code39Code39. Ein grep für BarcodeStandard.Type. über .cs-Dateien identifiziert alle Vorkommen, die aktualisiert werden müssen.

SkiaSharp Referenzbereinigung

Projekte, die explizite <PackageReference Include="SkiaSharp">-Einträge nur hinzugefügt haben, um BarcodeLibs NU1608-Warnungen zu lösen, können diese Überschreibungen nach dem Wechsel zu IronBarcode entfernen. Der dotnet list package --include-transitive-Befehl bestätigt, ob SkiaSharp immer noch von anderen Paketen im Projekt benötigt wird, bevor es entfernt wird.

Zusätzliche IronBarcode Funktionen

Über die direkte Generierung und den Lesevergleich hinaus bietet IronBarcode Funktionen, die BarcodeLibnicht abdeckt:

  • QR-Code-Logo-Einbettung: QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") bettet ein Markenlogo in die Mitte eines QR-Codes mit automatischer Anpassung der Fehlerkorrektur ein.
  • PDF-Barcode-Extraktion: BarcodeReader.Read("file.pdf") liest Barcodes von jeder Seite eines PDF-Dokuments ohne eine separate PDF-Darstellungsbibliothek.
  • Mehrfach-Barcodes-Erkennung: BarcodeReaderOptions.ExpectMultipleBarcodes = true erkennt und gibt alle Barcodes, die in einem einzelnen Bild vorhanden sind, zurück.
  • Konfiguration der Lesegeschwindigkeit: ReadingSpeed.Faster, ReadingSpeed.Balanced und ReadingSpeed.ExtremeDetail passen die Scan-Engine für Durchsatz vs. Genauigkeit an.
  • Gestylte QR-Code-Erstellung: Farbe, Finder-Pattern-Stil und Fehlerkorrekturstufe sind durch Verkettungsmethoden auf QRCodeWriter konfigurierbar.
  • Stream- und Bitmap-Eingabe für das Lesen: BarcodeReader.Read() akzeptiert Dateipfade, Streams, System.Drawing.Bitmap und AnyBitmap-Eingaben.

.NET-Kompatibilität und Zukunftsfähigkeit

IronBarcode unterstützt .NET Framework 4.6.2 bis .NET 9 und hält einen regelmäßigen Veröffentlichungszyklus ein, der mit dem .NET Veröffentlichungsplan von Microsoft übereinstimmt. Da die Verbreitung von .NET 10 bis 2026 zunimmt, gewährleistet die aktive Weiterentwicklung von IronBarcode die Vorwärtskompatibilität, ohne dass Projektänderungen erforderlich sind. Die Bibliothek läuft ohne Änderungen unter Windows, Linux, macOS, Docker, Azure und AWS Lambda. BarcodeLibpflegt außerdem eine aktive Community-Entwicklung, wobei die plattformübergreifende Unterstützung in der 3.x-Serie von der in den obigen Vergleichsabschnitten erläuterten SkiaSharp-Versionskompatibilität abhängt. Für Projekte, die auf modernes .NET unter Linux oder in Containern abzielen, vermeidet die abhängigkeitsfreie, plattformübergreifende Architektur von IronBarcode die Versionsverhandlung, die das SkiaSharp-Backend von BarcodeLibmit sich bringt.

Abschluss

BarcodeLib und IronBarcode repräsentieren unterschiedliche Lösungsansätze für die Barcode-Verarbeitung in .NET. BarcodeLibist eine fokussierte, kostenlose Bibliothek, die ausschließlich für die Generierung von Barcodes verwendet wird und ihren definierten Anwendungsfall seit fast zwei Jahrzehnten zuverlässig erfüllt. IronBarcode ist eine kommerzielle Bibliothek, die sowohl die Generierung als auch das Lesen abdeckt, mit einer statischen Fluent-API und ohne SkiaSharp-Abhängigkeit. Der Unterschied liegt nicht in der Qualität innerhalb des gemeinsamen Geltungsbereichs – er liegt im Geltungsbereich selbst.

BarcodeLib bleibt eine geeignete Wahl für Projekte mit stabilen, ausschließlich linearer Generation auf Windowsoder in Umgebungen, wo die SkiaSharp-Versionslandschaft kontrolliert wird. Seine Apache 2.0-Lizenz, der Null-Kostenpreis und die unkomplizierte API machen es zu einer praktischen Lösung für Versandetikettensysteme, Inventaretikettengeneratoren und ähnliche Anwendungen, die niemals Barcodes scannen oder 2D-Symbologien erzeugen müssen.

IronBarcode wird zur praktischeren Wahl, wenn die Anforderungen über die lineare Bildgeneration hinausgehen: wenn eine Lese-Fähigkeit benötigt wird, wenn das Projekt eine MAUI- oder plattformübergreifende Anwendung ist, wo SkiaSharp-Versionskonflikte wahrscheinlich sind, wenn die PDF-Barcode-Verarbeitung auf der Roadmap steht oder wenn irgendeine 2D-Symbologie (QR-Code, Data Matrix, PDF417, Aztec) erforderlich ist. Die Kosten für die kommerzielle Lizenz stellen die Frage der Schwelle dar — für Teams, deren Anforderungen mit dem übereinstimmen, was IronBarcode gegenüber BarcodeLibbietet, sind die Ein-Paket-Lösung und der kommerzielle Support der Werttausch.

Die ehrliche Einschätzung ist, dass die meisten Teams nicht von Anfang an mit IronBarcode arbeiten. Sie beginnen mit BarcodeLib, weil es kostenlos und ausreichend ist. Sie wechseln zu IronBarcode , wenn ihre Anforderungen über den reinen Generierungsumfang von BarcodeLibhinausgehen. Die Migration ist gut dokumentiert und die Änderungen an der API-Oberfläche sind vorhersehbar. Zu verstehen, wo BarcodeLibaufhört – und insbesondere, dass es bei der Generierung aufhört – ist die praktische Information, die benötigt wird, um diese Timing-Entscheidung richtig zu treffen.

Häufig gestellte Fragen

Was ist BarcodeLib?

BarcodeLib ist eine .NET Barcode-Bibliothek zum Erzeugen und Lesen von Barcodes in C#-Anwendungen. Sie ist eine von mehreren Alternativen, die Entwickler bei der Auswahl einer Barcode-Lösung for .NET-Projekte in Betracht ziehen.

Was sind die Hauptunterschiede zwischen BarcodeLib und IronBarcode?

IronBarcode verwendet eine statische, zustandslose API, die keine Instanzverwaltung erfordert, während BarcodeLib in der Regel eine Instanzerstellung und -konfiguration vor der Verwendung erfordert. IronBarcode bietet außerdem native PDF-Unterstützung, automatische Formaterkennung und Single-Key-Lizenzierung in allen Umgebungen.

Ist IronBarcode einfacher zu lizenzieren als BarcodeLib?

IronBarcode verwendet einen einzigen Lizenzschlüssel, der sowohl die Entwicklungs- als auch die Produktionsbereitstellung abdeckt. Dies vereinfacht CI/CD-Pipelines und Docker-Konfigurationen im Vergleich zu Lizenzierungssystemen, die SDK-Schlüssel von Laufzeitschlüsseln trennen.

Unterstützt IronBarcode alle Barcode-Formate, die BarcodeLib unterstützt?

IronBarcode unterstützt über 30 Barcode-Symbologien, darunter QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 und viele mehr. Die automatische Formaterkennung bedeutet, dass keine explizite Formataufzählung erforderlich ist.

Unterstützt IronBarcode das native Lesen von PDF-Barcodes?

Ja, IronBarcode liest Barcodes direkt aus PDF-Dateien mit BarcodeReader.Read("document.pdf"), ohne dass eine separate PDF-Rendering-Bibliothek erforderlich ist. Die seitenweisen Ergebnisse umfassen Seitenzahl, Barcodeformat, Wert und Konfidenzwert.

Wie handhabt IronBarcode die Stapelverarbeitung im Vergleich zu BarcodeLib?

Die statischen Methoden von IronBarcode sind zustandslos und natürlich thread-sicher, was die direkte Verwendung von Parallel.ForEach ohne Instanzverwaltung pro Thread ermöglicht. Es gibt auf keiner Preisstufe eine Obergrenze für den Durchsatz.

Welche .NET Versionen werden von IronBarcode unterstützt?

IronBarcode unterstützt .NET Framework 4.6.2+, .NET Core 3.1 und .NET 5, 6, 7, 8 und 9 in einem einzigen NuGet-Paket. Zu den Zielplattformen gehören Windows x64/x86, Linux x64 und macOS x64/ARM.

Wie installiere ich IronBarcode in einem .NET-Projekt?

Installieren Sie IronBarcode über NuGet: Führen Sie "Install-Package IronBarCode" in der Paketmanager-Konsole oder "dotnet add package IronBarCode" in der CLI aus. Es sind keine zusätzlichen SDK-Installationsprogramme oder Laufzeitdateien erforderlich.

Kann ich IronBarcode vor dem Kauf testen, im Gegensatz zu BarcodeLib?

Ja, der Testmodus von IronBarcode liefert vollständige dekodierte Barcodewerte - nur die erzeugten Ausgabebilder erhalten ein Wasserzeichen. Sie können die Lesegenauigkeit an Ihren eigenen Dokumenten testen, bevor Sie sich zum Kauf verpflichten.

Was ist der Preisunterschied zwischen BarcodeLib und IronBarcode?

Die Preise für IronBarcode beginnen bei 749 US-Dollar für eine unbefristete Einzelentwicklerlizenz für Entwicklung und Produktion. Preisdetails und Volumenoptionen sind auf der IronBarcode-Lizenzierungsseite verfügbar. Es ist keine separate Runtime-Lizenz erforderlich.

Ist es einfach, von BarcodeLib zu IronBarcode zu wechseln?

Die Migration von BarcodeLib zu IronBarcode beinhaltet in erster Linie das Ersetzen von instanzbasierten API-Aufrufen durch statische Methoden von IronBarcode, das Entfernen von Lizenzierungs-Boilerplate und das Aktualisieren der Namen von Ergebniseigenschaften. Bei den meisten Migrationen wird eher Code reduziert als hinzugefügt.

Kann IronBarcode QR-Codes mit Logos generieren?

Ja. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") bettet ein Markenbild nativ in einen QR-Code mit konfigurierbarer Fehlerkorrektur ein. Farbige QR-Codes werden auch über ChangeBarCodeColor() unterstützt.

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