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 SieEncode()aufrufen. - Gibt
SKImagezurück: Die Ausgabe ist ein SkiaSharp-Bildobjekt, das einenSKEncodedImageFormat-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.Commondurch 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
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:
BarcodeWriterbehandelt die Erzeugung;BarcodeReaderbehandelt 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()gibtbyte[]ohne einenMemoryStream-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:BarcodeReaderOptionsermö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
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
.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)
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)
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>
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)
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: Code128 → Code128, Ean13 → EAN13, UpcA → UPCA, Code39 → Code39. 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 = trueerkennt und gibt alle Barcodes, die in einem einzelnen Bild vorhanden sind, zurück. - Konfiguration der Lesegeschwindigkeit:
ReadingSpeed.Faster,ReadingSpeed.BalancedundReadingSpeed.ExtremeDetailpassen die Scan-Engine für Durchsatz vs. Genauigkeit an. - Gestylte QR-Code-Erstellung: Farbe, Finder-Pattern-Stil und Fehlerkorrekturstufe sind durch Verkettungsmethoden auf
QRCodeWriterkonfigurierbar. - Stream- und Bitmap-Eingabe für das Lesen:
BarcodeReader.Read()akzeptiert Dateipfade, Streams,System.Drawing.BitmapundAnyBitmap-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.

