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, bevorEncode()aufgerufen wird. - Gibt
System.Drawing.Imagezurück: Die Ausgabe ist ein GDI+-Bildobjekt, das einenMemoryStreamZwischenschritt 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.Commondurch 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)
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;BarcodeReaderverarbeitet 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
ReadingSpeedOptimierung:BarcodeReaderOptionsermö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
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
.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
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)
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>
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);
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: CODE128 → Code128, EAN13 → EAN13, UPCA → UPCA, QR_Code → QRCode.
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 = trueerkennt und gibt alle in einem einzelnen Bild vorhandenen Barcodes zurück. - Konfiguration der Lesegeschwindigkeit :
ReadingSpeed.Faster,ReadingSpeed.BalancedundReadingSpeed.ExtremeDetailoptimieren die Scan-Engine hinsichtlich Durchsatz vs. Genauigkeit. - Stilisierte QR-Code-Generierung : Farbe, Suchmuster und Fehlerkorrekturstufe sind über verkettete Methoden auf
QRCodeWriterkonfigurierbar. - Stream- und Bitmap-Eingabe zum Lesen :
BarcodeReader.Read()akzeptiert Dateipfade, Streams,System.Drawing.BitmapundAnyBitmapEingaben
.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.

