Wie man Barcodes aus Bildern in C# liest
Migrieren von BarCodezu IronBarcode
Dieser Leitfaden beschreibt den kompletten Migrationspfad von BarCodezu IronBarcode for .NET Entwickler. Die Migration konsolidiert zwei Pakete zu einem, ersetzt die Encoder-Renderer-Pipeline durch einen einzigen Methodenaufruf und vereint alle format-spezifischen Namespace-Importe — using Barcoder.Code128, using Barcoder.Qr, using Barcoder.DataMatrix — in einem einzigen using IronBarCode;. Der IBarcode-Typ und die ImageRenderer / ImageRendererOptions-Typen werden vollständig entfernt. Wenn das Lesen eine fehlende Fähigkeit war, die Sie dazu veranlasst hat, neben BarCodeeine zweite Bibliothek hinzuzufügen, deckt IronBarcode das Lesen nativ mit BarcodeReader.Read() ab.
Warum von BarCodemigrieren?
Teams, die von BarCodemigrieren, melden folgende Auslöser:
Leseanforderung hinzugefügt: BarCodeist eine reine Generierungsbibliothek ohne Dekodierungsfunktion. Wenn eine Anwendung eingehende Barcodes überprüfen, gescannte Dokumente verarbeiten oder Barcodes aus hochgeladenen PDFs lesen muss, bietet BarCodekeine Lösung. Das Hinzufügen einer zweiten Bibliothek zum Lesen führt zu einer geteilten Codebasis mit zwei NuGet Abhängigkeiten, zwei zu pflegenden APIs und zwei zu verfolgenden Versionsverläufen. IronBarcode übernimmt sowohl die Generierung als auch das Lesen über dasselbe Paket.
.NET Framework-Kompatibilität gebrochen: Barcoder.Renderer.Image hat die Unterstützung für .NET Framework eingestellt. Teams, die Dienste oder Desktop-Anwendungen auf .NET Framework 4.x ausführen und das Image-Renderer-Paket im Rahmen der routinemäßigen Abhängigkeitswartung aktualisieren, stoßen auf einen Build-Fehler. IronBarcode unterstützt .NET Framework 4.6.2 bis .NET 9 ohne bedingte Paketierung für verschiedene Zielplattformen.
Package Version Drift: Barcoder und Barcoder.Renderer.Image sind unabhängig versionierte NuGet-Pakete. Wenn bei einer Aktualisierung der Abhängigkeiten nur eine der beiden Komponenten aktualisiert wird, kann dies zu Inkompatibilitäten führen. In Repositories mit mehreren Projekten stellt die Sicherstellung konsistenter Versionen jedes Renderers in allen Projekten eine Koordinierungsbelastung dar, die mit der Teamgröße zunimmt.
Hinzufügen mehrerer Formate: Ein Projekt, das mit Code128 beginnt und später QR und dann DataMatrix hinzufügt, muss einen neuen Namespace importieren und für jedes Format eine andere Encoder-Klasse mit unterschiedlichen Methodenparametern lernen. IronBarcode verwendet ein BarcodeEncoding-Enum — das Hinzufügen eines Formats ist eine Änderung von einem Wort in einem bestehenden Aufruf. Kein neuer Namensraum, keine neue Klasse, keine andere Methodensignatur.
Anforderungen an die MAUI- und Cloud-Bereitstellung: BarCodedokumentiert keine Unterstützung für MAUI-, Docker-, AWS Lambda- oder Azure-Bereitstellungen. Teams, die plattformübergreifende mobile Anwendungen oder serverlose Barcode-Verarbeitungspipelines entwickeln, stellen fest, dass die dokumentierten Ziele von BarCodediese Szenarien nicht abdecken.
Das grundsätzliche Problem
Barcoder verknüpft die Formatauswahl mit Namespace-Importen und erzwingt eine Renderer-Pipeline für jede Ausgabeoperation. Das Umschalten von Formaten oder Ausgabetypen erfordert strukturelle Änderungen am Code:
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2,
.BarHeightFor1DBarcode = 50
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
IronBarcode drückt dieselbe Operation als einen einzigen verketteten Aufruf aus:
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
IronBarcode vs. Barcoder: Funktionsvergleich
| Feature | BarCode | IronBarcode |
|---|---|---|
| Erforderliche NuGet Pakete | Mindestens 2 (Barcoder + Barcoder.Renderer.Image) | 1 (IronBarcode) |
| Barcode-Generierung | Ja | Ja |
| Barcode-Lesen / Dekodieren | Nein | Ja |
| Pro-Format-Encoderklassen | Ja — Code128Encoder, QrEncoder, DataMatrixEncoder, etc. |
Nein — BarcodeEncoding-Enum |
| Importe von Namespaces pro Format | Ja — Barcoder.Code128, Barcoder.Qr, Barcoder.DataMatrix |
Nein — nur using IronBarCode |
| Ausgabemethoden für das Ergebnisobjekt | Nein — IBarcode hat keine Speicherfunktionen |
Ja — GeneratedBarcode hat SaveAsPng, ToPngBinaryData, ToStream |
| PDF lesen | Nein | Ja — BarcodeReader.Read(path) |
| QR-Code mit Logo | Nein | Ja — .AddBrandLogo(path) |
| .NET Framework -Unterstützung | Bildrenderer hinzugefügt | .NET Framework 4.6.2+ |
| .NET 9-Unterstützung | Unklare / eingeschränkte Aktivität | Ja |
| MAUI-Unterstützung | Nein | Ja – iOS, Android, Windows, macOS |
| Docker / Azure / AWS Lambda | Nicht dokumentiert | Ja |
| Lizenz | MIT (Open Source) | Kommerziell — Lite $999, Plus 1.499 USD, Professional 2.999 USD, Unlimited 5.999 USD |
| Lesegeschwindigkeitssteuerung | Nein | Ja — ReadingSpeed-Enum |
| Mehrfach-Barcode-Erkennung | Nein | Ja — ExpectMultipleBarcodes-Option |
Schnellstart: Migration von BarCodezu IronBarcode
Schritt 1: Ersetzen des NuGet-Pakets
Entfernen Sie alle Barcoder-Pakete aus Ihrem Projekt:
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
Wenn Sie auch den SVG-Renderer hinzugefügt haben:
dotnet remove package Barcoder.Renderer.Svg
dotnet remove package Barcoder.Renderer.Svg
IronBarcode installieren:
dotnet add package IronBarcode
dotnet add package IronBarcode
Schritt 2: Namespaces aktualisieren
Entfernen Sie alle using Barcoder.*-Anweisungen aus jeder Datei im Projekt:
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
Ersetzen Sie alle durch eine einzige using-Anweisung:
using IronBarCode;
using IronBarCode;
Imports IronBarCode
Schritt 3: Lizenz initialisieren
Fügen Sie die Lizenzinitialisierung beim Anwendungsstart hinzu — Program.cs, Startup.cs oder MauiProgram.cs:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Ein kostenloser Testschlüssel ist auf ironsoftware.com erhältlich.
Beispiele für die Code-Migration
Code-128-Generierung
Barcoder-Ansatz:
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2,
.BarHeightFor1DBarcode = 50
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
IronBarcode -Ansatz:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
Der Code128Encoder, ImageRenderer, ImageRendererOptions und Stream-Verwaltung werden vollständig entfernt. Das Format wird als BarcodeEncoding.Code128 auf der einheitlichen BarcodeWriter-Klasse angegeben. Ausgabemethoden leben direkt auf dem zurückgegebenen GeneratedBarcode-Objekt. Die IronBarcode Dokumentation zur Barcode-Generierung umfasst die Anpassung von Stil, Rändern und Farben.
QR-Code-Generierung
Barcoder-Ansatz:
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;
IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 4
});
using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;
IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 4
});
using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Qr
Imports Barcoder.Renderers
Dim barcode As IBarcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 4
})
Using stream = File.OpenWrite("qr.png")
renderer.Render(barcode, stream)
End Using
IronBarcode -Ansatz:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.SaveAsPng("qr.png")
Der zweite Parameter für CreateQrCode ist die Ausgabedimension in Pixel. Der Fehlerkorrekturgrad ist standardmäßig auf einen sinnvollen Wert eingestellt und kann bei Bedarf konfiguriert werden. IronBarcode unterstützt außerdem eine Funktion, die mit BarCodenicht möglich ist – das Einbetten eines Markenlogos in die Mitte des QR-Codes:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
Datenmatrixgenerierung
Barcoder-Ansatz:
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 5
});
using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 5
});
using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.DataMatrix
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = DataMatrixEncoder.Encode("ITEM-XYZ-001")
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 5
})
Using stream As FileStream = File.OpenWrite("datamatrix.png")
renderer.Render(barcode, stream)
End Using
IronBarcode -Ansatz:
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
.SaveAsPng("datamatrix.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
.SaveAsPng("datamatrix.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix) _
.SaveAsPng("datamatrix.png")
Das Muster ist identisch mit Code128 — nur der BarcodeEncoding-Wert ändert sich. Kein neuer Namespace-Import, keine andere Klasse, keine andere Methodensignatur.
Steuerung der Ausgabegröße
Barcoder verwendet PixelSize als Skalierungsfaktor für die Modulgröße des Barcodes und BarHeightFor1DBarcode für die 1D-Höhe — es gibt keine direkte Breite/Höhe-API.
Barcoder-Ansatz:
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 3,
BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 3,
BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports System.IO
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 3,
.BarHeightFor1DBarcode = 80
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
IronBarcode -Ansatz:
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
.ResizeTo(width, height) erfordert explizite Pixeldimensionen. Es kettet sich mit anderen Ausgabemethoden am selben GeneratedBarcode-Objekt.
Empfangen von Binärdaten anstelle einer Datei
Barcoder-Ansatz:
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2
});
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2
});
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2
})
Using ms As New MemoryStream()
renderer.Render(barcode, ms)
Dim pngBytes As Byte() = ms.ToArray()
End Using
IronBarcode -Ansatz:
using IronBarCode;
byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
using IronBarCode;
byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports IronBarCode
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128).ToPngBinaryData()
Das MemoryStream und ToArray()-Muster wird durch einen einzigen verketteten Methodenaufruf auf GeneratedBarcode ersetzt.
Barcodes lesen (Neue Funktion)
Barcoder besitzt keine Lese-API. Falls Sie zuvor eine zweite Bibliothek zum Lesen hinzugefügt haben, kann diese entfernt werden. IronBarcode liest aus Dateien, Byte-Arrays, Datenströmen und PDFs mit demselben Paket, das auch für die Generierung verwendet wird.
IronBarcode -Ansatz:
using IronBarCode;
// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");
// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
Console.WriteLine(result.Value);
// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
using IronBarCode;
// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");
// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
Console.WriteLine(result.Value);
// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
Imports IronBarCode
' Read from image file
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Format: {result.Format}")
Next
' Read from PDF natively — no image extraction step, no extra dependency
Dim pdfResults = BarcodeReader.Read("invoice.pdf")
' Read multiple barcodes from one image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-sheet.png", options)
For Each result In multiResults
Console.WriteLine(result.Value)
Next
' Read from a stream directly
Using fileStream = File.OpenRead("barcode.png")
Dim streamResults = BarcodeReader.Read(fileStream)
End Using
Die IronBarcode Dokumentation zum Barcode-Lesen umfasst mehrseitige PDFs, das Lesen von Bereichen von Interesse sowie Optionen zur Leistungsoptimierung.
SVG-Ausgabe
Barcoder-Ansatz:
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
Imports Barcoder.Renderers
Dim svgRenderer = New SvgRenderer()
Using stream = File.OpenWrite("barcode.svg")
svgRenderer.Render(barcode, stream)
End Using
IronBarcode -Ansatz:
using IronBarCode;
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.SaveAsSvg("barcode.svg");
using IronBarCode;
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.SaveAsSvg("barcode.svg");
Imports IronBarCode
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
.SaveAsSvg("barcode.svg")
Das Barcoder.Renderer.Svg-Paket kann entfernt werden, sobald alle SVG-Handel zurückgestellt worden sind.
Barcoder-API-zu- IronBarcode -Mapping-Referenz
| BarCode | IronBarcode |
|---|---|
Code128Encoder.Encode("data", false) |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
QrEncoder.Encode("data", ErrorCorrectionLevel.M) |
QRCodeWriter.CreateQrCode("data", 500) |
DataMatrixEncoder.Encode("data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix) |
new ImageRenderer(new ImageRendererOptions { ... }) |
Nicht erforderlich |
renderer.Render(barcode, fileStream) |
.SaveAsPng(path) |
renderer.Render(barcode, memoryStream) + ms.ToArray() |
.ToPngBinaryData() |
IBarcode |
GeneratedBarcode |
PixelSize = 2, BarHeightFor1DBarcode = 50 |
.ResizeTo(width, height) |
SvgRenderer + renderer.Render(barcode, stream) |
.SaveAsSvg(path) |
| Keine Lese-API | BarcodeReader.Read(path / stream / bytes / pdf) |
2 Pakete — Barcoder + Barcoder.Renderer.Image |
1 Paket — IronBarcode |
Format-Namespace pro Encoder (Barcoder.Code128, Barcoder.Qr, usw.) |
BarcodeEncoding-Enum, einzelner Namespace |
Gängige Migrationsprobleme und Lösungen
Problem 1: IBarcode verfügt über keine Speichermethoden
Barcoder: Code, der eine IBarcode-Variable speichert und später an einen Renderer weitergibt, folgt einem Deferred-Rendering-Muster. Jede Hilfsmethode, die IBarcode akzeptiert und renderer.Render() aufruft, muss umgestaltet werden.
Lösung: Ändern Sie IBarcode-Typreferenzen in GeneratedBarcode. Das GeneratedBarcode-Objekt trägt seine Ausgabemethoden mit sich — übergeben Sie es an jede Methode, die das Ergebnis speichern oder serialisieren muss:
// IronBarcode — GeneratedBarcode carries output methods
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");
static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
barcode.SaveAsPng(path);
}
// IronBarcode — GeneratedBarcode carries output methods
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");
static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
barcode.SaveAsPng(path);
}
Imports IronBarCode
Dim barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
SaveBarcodeToFile(barcode, "output.png")
Private Sub SaveBarcodeToFile(barcode As GeneratedBarcode, path As String)
barcode.SaveAsPng(path)
End Sub
Eine Suche nach renderer.Render( in der gesamten Lösung findet alle Stellen des verzögerten Renderings.
Problem 2: PixelSize hat kein direktes Äquivalent.
Barcoder: PixelSize ist ein Skalierungsfaktor für die natürliche Modulgröße des Barcodes. Die Ausgabedimensionen hängen von der Inhaltslänge, dem Format und dem Multiplikator in Kombination ab. BarHeightFor1DBarcode steuert die 1D-Höhe unabhängig. Es gibt keine direkte Angabe zu Breite/Höhe.
Lösung: Messen Sie die tatsächliche Pixel-Ausgabe, die der bestehende Barcoder-Code produziert und geben Sie diese Werte an .ResizeTo(width, height) weiter:
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.ResizeTo(300, 80)
.SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.ResizeTo(300, 80)
.SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
.ResizeTo(300, 80) _
.SaveAsPng("barcode.png")
Problem 3: Format Namespace Imports häufen sich
Barcoder: Jedes in einem Projekt verwendete Barcode-Format fügt eine using Barcoder.[Format]-Direktive in jede Datei ein, die es verwendet. Ein Projekt, das Code128, QR und DataMatrix verwendet, hat typischerweise drei formatspezifische Importe pro Datei plus using Barcoder und using Barcoder.Renderers.
Lösung: Führen Sie eine Suche nach allen using Barcoder-Anweisungen aus und ersetzen Sie alle durch using IronBarCode;:
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
Jedes Ergebnis ist eine Zeile zum Entfernen, ersetzt durch die einzelne using IronBarCode;-Direktive einmal pro Datei.
Problem 4: Fehler bei der Paketversionssynchronisierung
Barcoder: Das Builden nach dem Aktualisieren nur eines von Barcoder oder Barcoder.Renderer.Image kann zu Typ-Auflösungsfehlern führen, da die zwei Pakete möglicherweise bei verschiedenen Versionskombinationen nicht kompatibel sind.
Lösung: Nach Entfernung beider Barcoder-Pakete und Installation von IronBarcode gibt es ein Paket und eine Version. Paketsperrkonflikte in dieser Kategorie werden beseitigt. Überprüfen Sie, dass die .csproj-Datei nur die einzelne IronBarcode-Referenz und keine verbleibenden Barcoder.*-Referenzen enthält, bevor Sie bauen.
Barcoder-Migrations-Checkliste
Vor der Migration anfallende Aufgaben
Prüfen Sie Ihren Quellcode, um alle Barcoder-Nutzungen zu identifizieren, bevor Sie Änderungen vornehmen:
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
Alle Standorte dokumentieren, an denen IBarcode als Variablentyp gespeichert oder als Methodenparameter übergeben wird — dies sind die delayed Rendering-Bereiche, die die meiste Aufmerksamkeit erfordern. Notieren Sie alle PixelSize und BarHeightFor1DBarcode-Werte und messen Sie die entsprechenden Ausgabedimensionen.
Aufgaben der Code-Aktualisierung
- Entfernen Sie das
Barcoder-NuGet-Paket aus allen Projekten. - Entfernen Sie das
Barcoder.Renderer.Image-NuGet-Paket aus allen Projekten. - Entfernen Sie das
Barcoder.Renderer.Svg-NuGet-Paket, wenn vorhanden. - Installieren Sie das
IronBarcode-NuGet-Paket. - Fügen Sie
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";beim Anwendungsstart hinzu. - Ersetzen Sie alle
using Barcoder.*-Anweisungen durchusing IronBarCode;. - Ersetzen Sie
Code128Encoder.Encode(...)durchBarcodeWriter.CreateBarcode(..., BarcodeEncoding.Code128). - Ersetzen Sie
QrEncoder.Encode(...)durchQRCodeWriter.CreateQrCode(..., size). - Ersetzen Sie
DataMatrixEncoder.Encode(...)durchBarcodeWriter.CreateBarcode(..., BarcodeEncoding.DataMatrix). - Entfernen Sie alle
new ImageRenderer(new ImageRendererOptions {...})-Konstruktionen. - Ersetzen Sie
renderer.Render(barcode, fileStream)durch.SaveAsPng(path)aufGeneratedBarcode. - Ersetzen Sie
renderer.Render(barcode, memoryStream)+ms.ToArray()durch.ToPngBinaryData(). - Ersetzen Sie die Verwendung von
SvgRendererdurch.SaveAsSvg(path). - Ändern Sie
IBarcode-Typreferenzen zuGeneratedBarcode. - Ersetzen Sie
PixelSize/BarHeightFor1DBarcode-Optionen durch.ResizeTo(width, height).
Post-Migrationstests
- Überprüfen Sie, ob jedes generierte Barcode-Format mit einem Standardscanner oder dem Lesegerät von IronBarcode korrekt gescannt werden kann.
- Vergleichen Sie visuelle Ausgabedimensionen mit der Vor-Migration-Ausgabe — bestätigen Sie, dass
.ResizeTo()-Werte äquivalente Größen erzeugen. - Testen Sie die QR-Code-Ausgabe mit einem Smartphone-Scanner, um sicherzustellen, dass die Fehlerkorrektur ausreichend ist.
- Überprüfen Sie, ob die SVG-Ausgabe im Browser und im Druckkontext korrekt dargestellt wird, falls Ihr Projekt SVG verwendet.
- Wenn Sie eine zweite Lese-Bibliothek entfernt haben, verifizieren Sie, dass
BarcodeReader.Read()für die gleichen Eingaben äquivalente Dekodierwerte erzeugt. - Testen Sie das Lesen von PDFs, falls Ihr Projekt PDF-Dokumente verarbeitet – stellen Sie sicher, dass mehrseitige PDFs alle Seiten korrekt lesen.
- Führen Sie einen Build mit null verbleibenden
Barcoder.*-Referenzen durch — Compiler-Fehler weisen auf nicht berücksichtigte Migrationsstellen hin.
Wichtigste Vorteile der Migration zu IronBarcode
Vereinheitlichte Paketabhängigkeit: Ein NuGet Paket ersetzt zwei (oder drei, wenn der SVG-Renderer ebenfalls verwendet wurde). Eine Versionsverfolgung, ein Änderungsprotokoll zur Überwachung und keine Kompatibilitätsprobleme zwischen Paketen bei Abhängigkeitsaktualisierungen. Die .csproj und packages.lock.json-Komplexität reduziert sich sofort.
Native Lesefunktion: Anwendungen, die bisher eine zweite Bibliothek zum Lesen von Barcodes benötigten, können nun auf IronBarcode umgestellt werden. BarcodeReader.Read() akzeptiert Bilddateien, Byte-Arrays, Streams und PDFs über die gleiche API, mit einer integrierten Multi-Barcode-Erkennung und Lesegeschwindigkeitsanpassung.
Formatwahl als Konfiguration: Das Hinzufügen eines neuen Barcode-Formats zu einem bestehenden Projekt ist eine Änderung von einem Wort zum BarcodeEncoding-Enum-Wert in einem vorhandenen CreateBarcode-Aufruf. Kein neuer Namespace-Import, keine neue Encoder-Klasse und kein neues Paket. Dadurch wird die Formaterweiterung bei sich ändernden Produktanforderungen unkompliziert.
Explizite Ausgabeabmessungen: .ResizeTo(width, height) ersetzt das indirekte PixelSize-Multiplikatorsystem durch eine explizite Pixelspezifikation. Die Beziehung zwischen Code und Ausgabe ist direkt und vorhersehbar, unabhängig von der Länge des Barcode-Inhalts oder der formatspezifischen Modulgröße.
Erweiterte Plattformabdeckung: IronBarcode unterstützt .NET Framework 4.6.2 bis .NET 9, MAUI-Bereitstellungen auf iOS, Android, Windows und macOS sowie die dokumentierte Bereitstellung auf Docker, AWS Lambda und Azure Functions. Teams, deren Plattformanforderungen über .NET Core hinausgehen, werden nicht auf die Framework-Unterstützungslücke stoßen, die Barcoder.Renderer.Image betrifft.
Aktive Wartung und zukünftige Kompatibilität: IronBarcode veröffentlicht regelmäßig Updates mit dokumentierten .NET Kompatibilitätszeitplänen. Der aktive Veröffentlichungsrhythmus hält die Bibliothek mit den aktuellen .NET-Versionen auf dem Laufenden, was bei einer Bibliothek mit begrenzter aktueller Veröffentlichungsaktivität nicht gewährleistet ist.
Häufig gestellte Fragen
Warum sollte ich von BarCode auf IronBarcode umsteigen?
Zu den häufigsten Gründen gehören die Vereinfachung der Lizenzierung (Beseitigung der Komplexität von SDK und Laufzeitschlüsseln), die Beseitigung von Durchsatzbeschränkungen, die Verbesserung der nativen PDF-Unterstützung, die Verbesserung der Docker/CI/CD-Bereitstellung und die Verringerung von API-Boilerplate im Produktionscode.
Wie ersetze ich Barcoder API-Aufrufe durch IronBarcode?
Ersetzen Sie Instanzerstellung und Lizenzierung durch IronBarCode.License.LicenseKey = "key". Ersetzen Sie die Leseaufrufe durch BarcodeReader.Read(path) und die Schreibaufrufe durch BarcodeWriter.CreateBarcode(data, encoding). Statische Methoden erfordern keine Instanzverwaltung.
Wie viel Code ändert sich bei der Migration von BarCode zu IronBarcode?
Die meisten Migrationen führen zu weniger Codezeilen. Lizenzierungs-Boilerplate, Instanzkonstruktoren und explizite Formatkonfiguration werden entfernt. Zentrale Lese-/Schreibvorgänge werden auf kürzere IronBarcode-Äquivalente mit saubereren Ergebnisobjekten abgebildet.
Müssen während der Migration sowohl BarCode als auch IronBarcode installiert bleiben?
Nein. Die meisten Migrationen sind direkte Ersetzungen und keine Paralleloperationen. Migrieren Sie eine Serviceklasse nach der anderen, ersetzen Sie die NuGet-Referenz und aktualisieren Sie die Instanzierungs- und API-Aufrufmuster, bevor Sie zur nächsten Klasse übergehen.
Wie lautet der NuGet-Paketname für IronBarcode?
Das Paket ist 'IronBarCode' (mit großem B und C). Installieren Sie es mit 'Install-Package IronBarCode' oder 'dotnet add package IronBarCode'. Die using-Anweisung im Code lautet 'using IronBarCode;'.
Wie vereinfacht IronBarcode die Docker-Bereitstellung im Vergleich zu BarCode?
IronBarcode ist ein NuGet-Paket, für das keine externen SDK-Dateien oder Lizenzkonfigurationen erforderlich sind. In Docker setzen Sie die Umgebungsvariable IRONBARCODE_LICENSE_KEY und das Paket übernimmt die Lizenzvalidierung beim Start.
Erkennt IronBarcode nach der Migration von Barcoder alle Barcodeformate automatisch?
Ja, IronBarcode erkennt automatisch die Symbologie aller unterstützten Formate. Eine explizite Aufzählung von BarcodeTypes ist nicht erforderlich. Wenn das Format bereits bekannt ist und die Leistung eine Rolle spielt, ermöglicht BarcodeReaderOptions die Einschränkung des Suchraums als eine Optimierung.
Kann IronBarcode Barcodes aus PDFs ohne eine separate Bibliothek lesen?
Ja, BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien nativ. Die Ergebnisse enthalten PageNumber, Format, Value und Confidence für jeden gefundenen Barcode. Es ist kein externer PDF-Rendering-Schritt erforderlich.
Wie handhabt IronBarcode die parallele Verarbeitung von Barcodes?
Die statischen Methoden von IronBarcode sind zustandslos und thread-sicher. Verwenden Sie Parallel.ForEach direkt über Dateilisten ohne Instanzmanagement pro Thread. BarcodeReaderOptions.MaxParallelThreads steuert das interne Thread-Budget.
Welche Ergebniseigenschaften ändern sich bei der Migration von BarCode zu IronBarcode?
Übliche Umbenennungen: BarcodeValue wird zu Value, BarcodeType wird zu Format. IronBarcode-Ergebnisse fügen auch Confidence und PageNumber hinzu. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt die Umbenennungen im bestehenden Ergebnisverarbeitungscode.
Wie kann ich die IronBarcode-Lizenzierung in einer CI/CD-Pipeline einrichten?
Speichern Sie IRONBARCODE_LICENSE_KEY als Pipeline-Geheimnis und weisen Sie IronBarCode.License.LicenseKey im Startup-Code der Anwendung zu. Ein Geheimnis deckt alle Umgebungen ab, einschließlich Entwicklung, Test, Staging und Produktion.
Unterstützt IronBarcode die Generierung von QR-Codes mit benutzerdefiniertem Styling?
Ja. QRCodeWriter.CreateQrCode() unterstützt benutzerdefinierte Farben über ChangeBarCodeColor(), das Einbetten von Logos über AddBrandLogo(), konfigurierbare Fehlerkorrekturstufen und mehrere Ausgabeformate einschließlich PNG, JPG, PDF und Stream.

