Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

BarcodeLib vs IronBarcode: C# Barcode Bibliothek Vergleich

BarcodeLib wurde bereits über 12 Millionen Mal heruntergeladen. Die meisten dieser Entwickler stellen schließlich fest, dass es nur Barcodes erzeugen kann. Ein erheblicher Teil von ihnen entdeckt den SkiaSharp-Konflikt auch – in der Regel im ungünstigsten Moment, wenn sie gerade BarcodeLibzu einem MAUI- oder Blazor Projekt hinzugefügt haben, das bereits von SkiaSharp abhängt, und der Build plötzlich NU1608-Warnungen ausgibt, mit denen sie an diesem Nachmittag nicht gerechnet hatten. Dieser Artikel behandelt beide Themen ehrlich. 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 für .NET, die von Brad Barnhill auf GitHub gepflegt wird. Es ist seit 2007 aktiv und unterstützt über 25 Barcode-Symbologien. Die Apache 2.0-Lizenz erlaubt die kostenlose kommerzielle Nutzung. Für die reine Barcode-Generierung – also die Erstellung eines Bildes aus einer Zeichenkette – funktioniert es zuverlässig und hat diesem Zweck über viele Jahre aktiver Nutzung hinweg gute Dienste geleistet.

Die API ist instanzbasiert. Sie erstellen ein Barcode-Objekt, legen Eigenschaften fest und rufen Encode() mit einer Typkonstante und einer Datenzeichenfolge auf. Das Ergebnis ist ein System.Drawing.Image, das Sie dann nach Bedarf speichern oder streamen können. Dieser Workflow ist übersichtlich und leicht zugänglich und für Projekte, bei denen es ausschließlich um das Drucken von Barcode-Bildern geht – 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 das Festlegen der Eigenschaften Breite, Höhe und Beschriftung, bevor Encode() aufgerufen wird.
  • Gibt System.Drawing.Image zurück: Die Ausgabe ist ein GDI+-Bildobjekt, das einen MemoryStream Zwischenschritt benötigt, um eine Byte-Array-Ausgabe für HTTP-Antworten oder die Speicherung in einer Datenbank zu erzeugen.
  • Nur 1D- und QR-Code-Generierung: Unterstützt über 25 Symbologien, darunter Code128, EAN-13, UPC-A, Code39 und QR-Code, bietet aber keine 2D-Lesefunktion.
  • SkiaSharp-Abhängigkeit (v3.x): In der 3.x-Serie wurde System.Drawing.Common durch SkiaSharp ersetzt, 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 Standard-Workflow für die BarcodeLib-Generierung erfordert das Erstellen einer Instanz, das Konfigurieren von Eigenschaften und den Aufruf von Encode():

// BarcodeLib
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;

var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");
img.Save("barcode.png", ImageFormat.Png);
// BarcodeLib
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;

var b = new Barcode();
b.IncludeLabel = true;
b.Width = 300;
b.Height = 100;
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");
img.Save("barcode.png", ImageFormat.Png);
Imports BarcodeLib
Imports System.Drawing
Imports System.Drawing.Imaging

Dim b As New Barcode()
b.IncludeLabel = True
b.Width = 300
b.Height = 100
Dim img As Image = b.Encode(TYPE.CODE128, "PRODUCT-12345")
img.Save("barcode.png", ImageFormat.Png)
$vbLabelText   $csharpLabel

Dies ist der vollständige Generierungsablauf. Das Property-Setter-Muster ist das Design: Die gesamte Konfiguration erfolgt auf der Instanz vor dem Encode()-Aufruf, und der Rückgabewert ist ein System.Drawing.Image, der separat gespeichert oder in Bytes konvertiert 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. Die Konfigurationsoptionen werden an das Ergebnis von BarcodeWriter.CreateBarcode() oder QRCodeWriter.CreateQrCode() angehängt. Die Ausgabemethoden am Ende der Kette — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — eliminieren das Zwischenmuster MemoryStream, das BarcodeLibbenötigt. Das Lesen ist Teil desselben Pakets, es muss keine separate Bibliothek oder ZXing .NET Integration gepflegt werden.

Hauptmerkmale von IronBarcode:

  • Generierung und Einlesen in einem Paket: BarcodeWriter übernimmt die Generierung; BarcodeReader verarbeitet 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 Optimierung: BarcodeReaderOptions ermöglicht gründliche Handelsscans für eine bessere Performance bei hohem Volumen

Funktionsvergleich

Feature BarcodeLib IronBarcode
Barcode-Generierung Ja Ja
Barcode-Lesung Nein Ja
PDF-Barcode-Lesen Nein Ja
SkiaSharp-Abhängigkeitskonflikt 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 Ja (Grundlagen) Ja (erweitert, mit Logoeinbettung)
Mehr als 25 Symboliken Ja Ja
API für flüssige, verkettbare Generierung Nein Ja
Direkte byte[] Ausgabe Handbuch (MemoryStream) .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änderliche Instanzkonfiguration, während IronBarcode eine unveränderliche, fließende Kette verwendet.

BarcodeLib-Ansatz

BarcodeLib erfordert das Erstellen einer Instanz und das Festlegen von Eigenschaften, bevor Encode() aufgerufen wird. Die Ausgabe ist ein System.Drawing.Image Objekt:

using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;

public byte[] GenerateCode128(string data)
{
    var b = new Barcode();
    b.IncludeLabel = true;
    b.Width = 300;
    b.Height = 100;
    Image img = b.Encode(TYPE.CODE128, data);

    using var ms = new MemoryStream();
    img.Save(ms, ImageFormat.Png);
    return ms.ToArray();
}
using BarcodeLib;
using System.Drawing;
using System.Drawing.Imaging;

public byte[] GenerateCode128(string data)
{
    var b = new Barcode();
    b.IncludeLabel = true;
    b.Width = 300;
    b.Height = 100;
    Image img = b.Encode(TYPE.CODE128, data);

    using var ms = new MemoryStream();
    img.Save(ms, ImageFormat.Png);
    return ms.ToArray();
}
Imports BarcodeLib
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO

Public Function GenerateCode128(data As String) As Byte()
    Dim b As New Barcode()
    b.IncludeLabel = True
    b.Width = 300
    b.Height = 100
    Dim img As Image = b.Encode(TYPE.CODE128, data)

    Using ms As New MemoryStream()
        img.Save(ms, ImageFormat.Png)
        Return ms.ToArray()
    End Using
End Function
$vbLabelText   $csharpLabel

Der Rückgabetyp System.Drawing.Image bedeutet, dass für die Ausgabe eines Byte-Arrays ein Zwischenschritt MemoryStream erforderlich ist. Die Eigenschaft IncludeLabel ist ein boolescher Schalter – BarcodeLibrendert automatisch die codierte Datenzeichenfolge als sichtbare Beschriftung unterhalb der 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)
        .AddAnnotationTextBelowBarcode(data)
        .ToPngBinaryData();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

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

.ToPngBinaryData() gibt das Byte-Array direkt zurück – ohne Zwischenobjekt Image oder MemoryStream. .AddAnnotationTextBelowBarcode() nimmt die Beschriftungszeichenkette explizit entgegen und ermöglicht so die Kontrolle darüber, welcher Text unterhalb der Balken angezeigt wird. 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. Das Fehlen ist kein Versionsunterschied – Lesen war nie Teil des Konzepts der Bibliothek. Jeder Versuch, eine Dekodierungsmethode aufzurufen, führt zu einem Kompilierungsfehler:

// BarcodeLib— reading does not exist
using BarcodeLib;

var b = new Barcode();

// This will not compile — there is no Decode or Read method
// var value = b.Decode("barcode.png");       // CS1061: no definition
// var value = b.Scan("barcode.png");          // CS1061: no definition
// var value = b.ReadBarcode("barcode.png");   // CS1061: no definition

// The only thing you can do is generate:
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");  // this works
// BarcodeLib— reading does not exist
using BarcodeLib;

var b = new Barcode();

// This will not compile — there is no Decode or Read method
// var value = b.Decode("barcode.png");       // CS1061: no definition
// var value = b.Scan("barcode.png");          // CS1061: no definition
// var value = b.ReadBarcode("barcode.png");   // CS1061: no definition

// The only thing you can do is generate:
Image img = b.Encode(TYPE.CODE128, "PRODUCT-12345");  // this works
Imports BarcodeLib

Dim b As New Barcode()

' This will not compile — there is no Decode or Read method
' Dim value = b.Decode("barcode.png")       ' CS1061: no definition
' Dim value = b.Scan("barcode.png")         ' CS1061: no definition
' Dim value = b.ReadBarcode("barcode.png")  ' CS1061: no definition

' The only thing you can do is generate:
Dim img As Image = b.Encode(TYPE.CODE128, "PRODUCT-12345")  ' this works
$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

Die Aufzählung ReadingSpeed ermöglicht die Optimierung der Scan-Performance für Szenarien mit hohem Datenaufkommen. 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 wurde SkiaSharp als Grafik-Backend eingeführt, um System.Drawing.Common zu ersetzen, das nach .NET 6 nur noch unter Windowsverfügbar war. BarcodeLibist auf einen bestimmten SkiaSharp-Versionsbereich festgelegt. Wenn ein Projekt SkiaSharp bereits über eine andere Abhängigkeit verwendet – was häufig bei MAUI-Projekten mit SkiaSharp.Views.Maui und Microsoft.Maui.Graphics der Fall ist – kann die aufgelöste Version außerhalb des von BarcodeLiberwarteten Bereichs liegen. Das Ergebnis ist mindestens eine NU1608-Warnung und schlimmstenfalls ein Assembly-Bindungsfehler zur Laufzeit:

Warnung NU1608: Paketversion außerhalb der Abhängigkeitsbeschränkung erkannt:
BarcodeLib 3.1.5 benötigt SkiaSharp (>= 2.88.7 && < 2.89.0), aber
Das Problem mit SkiaSharp Version 3.116.1 wurde behoben.

Das Erzwingen einer Auflösung durch explizite Paketverweise erhöht die Komplexität ohne Garantie:


<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 bei expliziten Überschreibungen hängt die Kompatibilität davon ab, dass die internen API-Aufrufe von BarcodeLibmit denen der festgelegten Version übereinstimmen. Es gibt keinen Supportvertrag, der eine Fehlerbehebung zu einem für das Projekt relevanten Zeitpunkt garantiert.

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(TYPE.CODE128, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
b.IncludeLabel = true .AddAnnotationTextBelowBarcode("text")
b.Width = 300; b.Höhe = 100 .ResizeTo(300, 100)
Gibt System.Drawing.Image zurück .SaveAsPng(path) / .ToPngBinaryData()
TYPE.CODE128 BarcodeEncoding.Code128
TYPE.CODE39 BarcodeEncoding.Code39
TYPE.EAN13 BarcodeEncoding.EAN13
TYPE.UPCA BarcodeEncoding.UPCA
TYPE.QR_Code BarcodeEncoding.QRCode (auch QRCodeWriter)
Keine Lese-API BarcodeReader.Read(path)
SkiaSharp-Versionskonflikt in MAUI Keine widersprüchlichen Abhängigkeiten

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 den Fehler, identifizieren die Versionsabweichung zwischen dem von BarcodeLiberwarteten SkiaSharp-Bereich und der von MAUI benötigten Version, fügen explizite <PackageReference>-Überschreibungen hinzu, um eine Lösung zu erzwingen, und bringen den Build zum Erfolg. 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 verarbeitet die gesamte Kette nativ: BarcodeReader.Read("file.pdf") durchläuft jede Seite und gibt alle erkannten Barcodes ohne einen Zwischenrendering-Schritt zurück.

Die Funktionen des QR-Codes übertreffen die der Basisgeneration.

Projekte, die anfänglich nur die einfache Generierung von QR-Codes erforderten, entwickeln sich oft weiter und benötigen dann die Einbettung eines Logos, die Anpassung der Farben oder die Konfiguration des Fehlerkorrekturniveaus. BarcodeLibunterstützt QR-Codes bis einschließlich TYPE.QR_Code, bietet aber keine Optionen über die Standardeigenschaften Width, Height und IncludeLabel hinaus. IronBarcodes QRCodeWriter ermöglicht das Einbetten von Logos, die Farbsteuerung und die Feinabstimmung der Fehlerkorrektur durch verkettete Methoden. Teams, deren Anforderungen an QR-Codes über die Möglichkeiten der Basisimplementierung von BarcodeLibhinausgehen, stellen fest, dass die Funktionslücke den Ausschlag für die Migration gibt.

Gemeinsame Überlegungen zur Migration

Instanz-API zu statischer Fluent-API

Der Code von BarcodeLibverwendet ein veränderliches Objektmuster: Erstellen einer Barcode-Instanz, Festlegen von Eigenschaften, Aufruf von Encode(). IronBarcode verwendet ein statisches Fluent-Muster: Aufruf von BarcodeWriter.CreateBarcode(), Verkettung von Konfigurationsmethoden, Abschluss mit einer Ausgabemethode. Vorhandener Code, der eine Barcode-Instanz als Feld speichert oder sie zwischen Methoden übergibt, muss umstrukturiert 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)
    .AddAnnotationTextBelowBarcode(data)
    .SaveAsPng(outputPath);
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .AddAnnotationTextBelowBarcode(data)
    .SaveAsPng(outputPath);
$vbLabelText   $csharpLabel

System.Drawing.Image zu Direktausgabe

BarcodeLib gibt System.Drawing.Image zurück, wofür MemoryStream benötigt wird, um Bytes zu erzeugen. Jeder Code, der in Image oder System.Drawing.Image eingegeben wird, muss aktualisiert werden. Die flüssige Kette von IronBarcode endet direkt mit dem gewünschten Ausgabeformat — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — wodurch die Notwendigkeit des Zwischenbildobjekts und des Schritts MemoryStream entfällt.

Typ-Enum zu BarcodeEncoding-Enum

BarcodeLib verwendet die Klasse TYPE mit Großbuchstabenkonstanten wie TYPE.CODE128. IronBarcode verwendet die Aufzählung BarcodeEncoding mit PascalCase-Werten wie z. B. BarcodeEncoding.Code128. Die Werte werden direkt zugeordnet. Eine Suche mit grep nach TYPE\. in .cs Dateien identifiziert alle Vorkommen, die aktualisiert werden müssen, und eine systematische Suche und Ersetzung deckt die gängigen Formate ab: CODE128Code128, EAN13EAN13, UPCAUPCA, QR_CodeQRCode.

SkiaSharp Referenzbereinigung

Projekte, die explizite <PackageReference Include="SkiaSharp">-Einträge nur zur Behebung der NU1608-Warnungen von BarcodeLibhinzugefügt haben, können diese Überschreibungen nach dem Wechsel zu IronBarcode entfernen. Der Befehl dotnet list package --include-transitive prüft, ob SkiaSharp 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-Logoeinbettung : QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") bettet ein Markenlogo in die Mitte eines QR-Codes ein und passt die Fehlerkorrektur automatisch an.
  • PDF-Barcode-Extraktion : BarcodeReader.Read("file.pdf") liest Barcodes von jeder Seite eines PDF-Dokuments ohne separate PDF-Rendering-Bibliothek
  • Mehrfach-Barcode-Erkennung : BarcodeReaderOptions.ExpectMultipleBarcodes = true erkennt und gibt alle in einem einzelnen Bild vorhandenen Barcodes zurück.
  • Konfiguration der Lesegeschwindigkeit : ReadingSpeed.Faster, ReadingSpeed.Balanced und ReadingSpeed.ExtremeDetail optimieren die Scan-Engine hinsichtlich Durchsatz vs. Genauigkeit.
  • Stilisierte QR-Code-Generierung : Farbe, Suchmuster und Fehlerkorrekturstufe sind über verkettete Methoden auf QRCodeWriter konfigurierbar.
  • Stream- und Bitmap-Eingabe zum 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 wirklich geeignete Wahl für Projekte mit stabilen, nur generationsbezogenen Anforderungen unter Windowsoder in Umgebungen, in denen die SkiaSharp-Versionslandschaft kontrolliert wird. Dank der Apache 2.0-Lizenz, der kostenlosen Nutzung und der unkomplizierten API ist es eine praktische Lösung für Versandetikettensysteme, Inventaretikettengeneratoren und ähnliche Anwendungen, die niemals Barcodes scannen müssen. Die 12 Millionen Downloads spiegeln wider, dass ein großer Teil der .NET -Entwickler genau diesen Anwendungsfall hat.

IronBarcode wird zur praktischeren Wahl, wenn die Anforderungen über die reine Bildgenerierung hinausgehen: wenn Lesefunktionen benötigt werden, wenn es sich bei dem Projekt um eine MAUI- oder plattformübergreifende Anwendung handelt, bei der Versionskonflikte mit SkiaSharp wahrscheinlich sind, wenn die Verarbeitung von PDF-Barcodes geplant ist oder wenn QR-Code-Funktionen benötigt werden, die über die grundlegende Generierung hinausgehen. Die Kosten für die kommerzielle Lizenz stellen die entscheidende Frage dar – für Teams, deren Anforderungen mit dem übereinstimmen, was IronBarcode gegenüber BarcodeLibbietet, ist die Komplettlösung und die kommerzielle Service-Level-Vereinbarung (SLA) der sinnvolle Tausch.

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 für .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.

Jordi Bardia
Software Ingenieur
Jordi ist am besten in Python, C# und C++ versiert. Wenn er nicht bei Iron Software seine Fähigkeiten einsetzt, programmiert er Spiele. Mit Verantwortung für Produkttests, Produktentwicklung und -forschung trägt Jordi mit immensem Wert zur kontinuierlichen Produktverbesserung bei. Die abwechslungsreiche Erfahrung hält ihn gefordert und engagiert, ...
Weiterlesen

Iron Support Team

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