Wie man einen Barcode-Zuschnittsbereich in C# einstellt
Migrieren von NetBarcodezu IronBarcode
Dieser Leitfaden beschreibt den kompletten Migrationspfad von NetBarcodezu IronBarcode , einschließlich der Schritte zur Paketentfernung, Namespace-Aktualisierungen, API-Übersetzungsbeispielen und einer Checkliste zum Auffinden aller Aufrufstellen vor Beginn der Migration. Der Leitfaden behandelt das häufige Szenario, in dem ein Projekt mit NetBarcodefür die 1D-Barcodenerzeugung beginnt und später 2D-Formate, Lesefähigkeiten oder Klarstellungen zu den Lizenzpflichten von SixLabors.ImageSharp benötigt — all das liegt außerhalb des Umfangs von NetBarcode.
Warum von NetBarcodemigrieren?
Formatobergrenze: NetBarcode's Type Enum definiert genau 11 Barcode-Formate, alle linear. Es gibt keinen Eintrag für QR Code, DataMatrix, PDF417 oder Aztec. Wenn ein Projekt eine QR-Code-Anforderung hinzufügt – sei es für kontaktlose Lieferlinks, mobile Deep Links oder eine DataMatrix-Vorgabe für die Pharmaindustrie – kann NetBarcodediese nicht erfüllen. Der einzige Ausweg innerhalb der Architektur der Bibliothek besteht darin, die Verwendung für dieses Format einzustellen und ein separates Paket einzuführen. Jedes zusätzliche Formatkriterium, das außerhalb des 11-Eintrag-Enums liegt, fügt einen weiteren Bibliothekseintrag zum Abhängigkeitsbaum hinzu.
Keine Lese-API: NetBarcodegeneriert Barcode-Bilder, bietet aber keine Methode zum Dekodieren dieser Bilder. Für Projekte, die Rücksendeetiketten scannen, Barcodewerte aus Lieferantenrechnungen extrahieren oder überprüfen müssen, ob ein gedruckter Barcode mit seinen Quelldaten übereinstimmt, ist eine separate Lesebibliothek erforderlich. ZXing .NET ist die gängigste Wahl und führt eine dritte API-Oberfläche in eine Codebasis ein, die bereits NetBarcodeund typischerweise eine QR-spezifische Bibliothek enthält.
ImageSharp Kommerzielle Lizenz: NetBarcodehängt von SixLabors.ImageSharp ab, das eine geteilte kommerzielle Lizenz verwendet. Das kostenlose Angebot gilt für Open-Source-Projekte und Unternehmen unterhalb einer bestimmten jährlichen Umsatzschwelle; über diesem Schwellenwert ist eine kommerzielle Lizenz erforderlich. Diese Bedingung ist in die transitive Abhängigkeitskette eingebettet und wird von NuGet während der Installation nicht angezeigt. Ein Einzelhandels- oder Logistikunternehmen, das Barcodes in großem Umfang verarbeitet – genau der Anwendungsfall, den NetBarcodeanvisiert –, kann möglicherweise über der Schwelle operieren, ohne die Verpflichtung geprüft zu haben.
Multi-Library Accumulation: Projekte, die auf QRCoder zurückgreifen, wenn QR-Codes benötigt werden, und dann auf ZXing .NET , wenn das Lesen erforderlich wird, häufen drei separate barcodebezogene Abhängigkeiten an. Jedes dieser Systeme hat seinen eigenen Veröffentlichungsplan, seine eigenen ImageSharp-Versionsanforderungen und seine eigene zu pflegende API. Die Konsolidierung in eine einzige Bibliothek, die Generierung, Lesen, 1D und 2D abdeckt, beseitigt das Problem der bibliotheksübergreifenden Versionsverwaltung.
Das grundsätzliche Problem
Ein Projekt, das zunächst nur mit NetBarcodearbeitet und dann auf 2D-Formate erweitert wird, führt letztendlich zu einem solchen aufgeteilten Import:
// NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
// NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
Imports NetBarcode
Imports QRCoder
Imports System.IO
' NetBarcode for 1D — one library, one API
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")
' QRCoder added separately for QR — second library, second API
Dim qrGenerator As New QRCodeGenerator()
Dim qrData As QRCodeData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim png As Byte() = New PngByteQRCode(qrData).GetGraphic(20)
File.WriteAllBytes("qr.png", png)
Nach der Migration zu IronBarcode stammen die gleichen beiden Ausgaben von einem einzigen Import:
using IronBarCode;
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
IronBarcode vs. NetBarcode: Funktionsvergleich
| Feature | NetBarcode | IronBarcode |
|---|---|---|
| 1D-Barcode-Generierung | Ja | Ja |
| 2D-Barcode-Generierung (QR, DataMatrix, PDF417, Aztec) | Nein | Ja |
| Barcode-Lesen aus Bildern | Nein | Ja |
| Barcode-Lesen aus PDF-Dokumenten | Nein | Ja |
| 1D-Format-Anzahl | 11 | 30+ |
| 2D-Format-Anzahl | 0 | Ab 8 Jahren |
| Gesamtsymboliken | 11 | 50+ |
| GS1-128, GS1 DataBar | Nein | Ja |
| Postformate | Nein | Ja |
| SVG-Ausgabe | Nein | Ja |
| Stapelverarbeitung | Handbuch | Eingebaut |
| ImageSharp-Abhängigkeit | Ja (geteilte Lizenz) | Nein |
| Kommerzielle Unterstützung | Gemeinschaft | Professionell |
| Lizenzmodell | MIT (+ ImageSharp-Bedingungen) | Kommerziell |
Schnellstart: Migration von NetBarcodezu IronBarcode
Schritt 1: Ersetzen des NuGet-Pakets
NetBarcode und seine transitive ImageSharp-Abhängigkeit entfernen:
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
Bitte beachten Sie, dass SixLabors.ImageSharp in der wiederhergestellten Paketliste erneut erscheinen kann, wenn andere Pakete im Projekt es auch transitiv referenzieren. Nach der Entfernung führen Sie dotnet list package --include-transitive aus, um zu bestätigen, ob ImageSharp verbleibt und ob die kommerzielle Lizenzbedingung weiterhin für das Projekt gilt.
Schritt 2: IronBarcode hinzufügen
dotnet add package IronBarcode
dotnet add package IronBarcode
Der Name des NuGet-Pakets ist IronBarcode; der im Code verwendete Namespace ist IronBarCode (beachten Sie das große C).
Schritt 3: Namensräume aktualisieren und Lizenz initialisieren
Ersetzen Sie die alten using-Anweisungen in jeder Datei, die NetBarcode-Aufrufe enthielt:
// Entfernen these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;
// Add this:
using IronBarCode;
// Entfernen these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;
// Add this:
using IronBarCode;
Imports IronBarCode
Fügen Sie die Lizenzinitialisierung einmal beim Anwendungsstart hinzu — in Program.cs, Startup.cs oder dem Einstiegspunkt des Projekts:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Zur Evaluierung steht ein kostenloser Testschlüssel zur Verfügung; Durch den Kauf einer Lizenz wird das Testwasserzeichen aus den generierten Barcode-Bildern entfernt.
Beispiele für die Code-Migration
Code-128-Generierung
Das am häufigsten verwendete NetBarcode-Anwendungsmuster lässt sich durch eine Änderung des Konstruktors in eine statische Methode und eine Umbenennung der Methode direkt auf IronBarcode übertragen.
NetBarcode-Ansatz:
using NetBarcode;
var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
using NetBarcode;
var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
Imports NetBarcode
Dim barcode As New Barcode("12345678901234", Type.Code128)
barcode.SaveImageFile("shipping-label.png")
IronBarcode -Ansatz:
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
Der new Barcode(data, Type.X) Konstruktor wird zu BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X). Die SaveImageFile() Methode wird zu SaveAsPng(), SaveAsJpeg() oder SaveAsWindowsBitmap(), abhängig vom erforderlichen Ausgabeformat. Alle verfügbaren Optionen zur Generierung von 1D-Barcodes sind in den Anleitungen von IronBarcode dokumentiert.
EAN-13
Die Barcode-Typen für Einzelhandelsprodukte lassen sich durch eine Konstantenumbenennung und eine Methodenumbenennung direkt zwischen Bibliotheken abbilden.
NetBarcode-Ansatz:
using NetBarcode;
var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
using NetBarcode;
var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
Imports NetBarcode
Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product-ean.png")
IronBarcode -Ansatz:
using IronBarCode;
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("product-ean.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("product-ean.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
.SaveAsPng("product-ean.png")
Die Konstante der Kodierung stimmt mit den NetBarcodeType Enum-Mitgliedsnamen überein, wo direkte Entsprechungen existieren. Beachten Sie, dass UPC-A (Type.UPCA), UPC-E (Type.UPCE), ITF (Type.ITF) und MSI (Type.MSI) nicht Teil des NetBarcodeType Enums sind — falls diese Formate erforderlich sind, unterstützt IronBarcode sie nativ über BarcodeEncoding.UPCA, BarcodeEncoding.UPCE, BarcodeEncoding.ITF und BarcodeEncoding.MSI.
GetImage() zu ToPngBinaryData()
NetBarcode's GetImage() Methode gibt SixLabors.ImageSharp.Image<Rgba32> zurück, was explizite ImageSharp-Importe im aufrufenden Code erfordert und die nachgelagerte Logik mit der ImageSharp API verknüpft. IronBarcode stellt binäre und Stromausgabemethoden direkt auf dem GeneratedBarcode Objekt bereit, wodurch die ImageSharp-Abhängigkeit im aufrufenden Code vollständig entfällt.
NetBarcode-Ansatz:
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO
Dim barcode As New Barcode("12345", Type.Code128)
Dim image As Image(Of Rgba32) = barcode.GetImage()
Using stream As New MemoryStream()
image.SaveAsPng(stream)
Dim bytes As Byte() = stream.ToArray()
End Using
IronBarcode -Ansatz:
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);
// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();
// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);
// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();
// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode
Dim barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
' Retrieve bytes directly — no ImageSharp type in calling code
Dim bytes As Byte() = barcode.ToPngBinaryData()
' Or write to a stream directly
Using stream As New MemoryStream()
barcode.SaveAsPng(stream)
End Using
Code, der weitere ImageSharp-Manipulationen am Image<Rgba32> Ergebnis durchgeführt hat — Größenänderung, Komposition, Formatkonvertierung — müssen diese Operationen individuell bewertet werden, da IronBarcode kein ImageSharp-Objekt bereitstellt.
Ersetzen von NetBarcodeund QRCoder
Projekte, die NetBarcodeparallel zu QRCoder verwenden, können beide gleichzeitig ersetzen. IronBarcode's 2D-Generierung verwendet die gleiche BarcodeWriter.CreateBarcode Methode wie seine 1D-Generierung; nur die BarcodeEncoding Konstante unterscheidet sich. Informationen zu Kodierungsoptionen und Konfiguration finden Sie im Leitfaden zur 2D-Barcode-Generierung .
NetBarcode- und QRCoder-Ansatz:
using NetBarcode;
using QRCoder;
// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
using NetBarcode;
using QRCoder;
// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
Imports NetBarcode
Imports QRCoder
' 1D with NetBarcode
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")
' QR with QRCoder
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20))
IronBarcode -Ansatz:
using IronBarCode;
// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
.SaveAsPng("pharma-label.png");
using IronBarCode;
// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
.SaveAsPng("pharma-label.png");
Imports IronBarCode
' 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
' QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
' Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
.SaveAsPng("pharma-label.png")
Hinzufügen der Lesefähigkeit
Falls das Projekt auch ZXing .NET zum Einlesen verwendet, kann diese Abhängigkeit zusammen mit NetBarcodeentfernt werden. IronBarcode's BarcodeReader verarbeitet Bilder und PDF-Dokumente mit automatischer Format-Erkennung.
ZXing .NET -Ansatz:
using ZXing;
using ZXing.Common;
using ZXing.Rendering;
var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };
// Bitmap loading and format-specific handling required before decode call
using ZXing;
using ZXing.Common;
using ZXing.Rendering;
var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };
// Bitmap loading and format-specific handling required before decode call
Imports ZXing
Imports ZXing.Common
Imports ZXing.Rendering
Dim reader = New BarcodeReaderGeneric()
reader.Options = New DecodingOptions With {.TryHarder = True}
' Bitmap loading and format-specific handling required before decode call
IronBarcode -Ansatz:
using IronBarCode;
// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
Console.WriteLine($"{r.Format}: {r.Value}");
}
// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
using IronBarCode;
// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
Console.WriteLine($"{r.Format}: {r.Value}");
}
// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
Imports IronBarCode
' Read from an image file — automatic format detection
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
Console.WriteLine($"{r.Format}: {r.Value}")
Next
' Read from a PDF document — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each r In pdfResults
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}")
Next
Eine vollständige Dokumentation der Leseoptionen finden Sie im Leitfaden "Barcodes aus Bildern lesen" . Darin werden die Einstellungen für Geschwindigkeitsanpassung, Mehrfach-Barcode-Erkennung und Bildkorrektur behandelt.
NetBarcodeAPI zu IronBarcode Mapping-Referenz
| NetBarcode | IronBarcode | Notizen |
|---|---|---|
new Barcode(data, Type.Code128) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
Konstruktor → statische Methode |
new Barcode(data, Type.EAN13) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) |
Direktes Mapping |
new Barcode(data, Type.Code39) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) |
Direktes Mapping |
new Barcode(data, Type.EAN8) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) |
Direktes Mapping |
new Barcode(data, Type.Codabar) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) |
Direktes Mapping |
new Barcode(data, Type.Code93) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) |
Direktes Mapping |
barcode.SaveImageFile("x.png") |
.SaveAsPng("x.png") |
Methodenumbenennung |
barcode.SaveImageFile("x.jpg") |
.SaveAsJpeg("x.jpg") |
Methodenumbenennung |
barcode.GetImage() → Image<Rgba32> |
.ToPngBinaryData() oder .SaveAsPng() |
Kein ImageSharp-Typ verfügbar |
Kein Type.QRCode |
BarcodeEncoding.QRCode |
Neue Fähigkeit |
Kein Type.DataMatrix |
BarcodeEncoding.DataMatrix |
Neue Fähigkeit |
Kein Type.PDF417 |
BarcodeEncoding.PDF417 |
Neue Fähigkeit |
Kein Type.Aztec |
BarcodeEncoding.Aztec |
Neue Fähigkeit |
| Keine Lese-API | BarcodeReader.Read(path) |
Neue Fähigkeit |
using NetBarcode; |
using IronBarCode; |
Namespace-Ersetzung |
using SixLabors.ImageSharp; |
Entfernen | Nicht mehr benötigt |
using SixLabors.ImageSharp.PixelFormats; |
Entfernen | Nicht mehr benötigt |
using SixLabors.Fonts; |
Entfernen | Nicht mehr benötigt |
Die vollständige Liste der Kodierungskonstanten finden Sie in der Referenz der unterstützten Barcode-Formate .
Gängige Migrationsprobleme und Lösungen
Problem 1: Transitive Abhängigkeit von ImageSharp bleibt nach Paketentfernung bestehen
Problem: Nach dem Ausführen von dotnet remove package NetBarcode zeigt dotnet restore, dass SixLabors.ImageSharp immer noch im Abhängigkeitsbaum vorhanden ist, da ein anderes Paket im Projekt es ebenfalls referenziert.
Lösung: Führen Sie dotnet list package --include-transitive aus, um zu identifizieren, welches Paket immer noch ImageSharp einzieht. Wenn es nur NetBarcodeist, sollte die Entfernung des expliziten Paketverweises und die Wiederherstellung es klären. Wenn ein anderes Paket verantwortlich ist, bleibt die ImageSharp-Abhängigkeit dieses Pakets und die Bedingung der kommerziellen Lizenz unabhängig von der Entfernung von NetBarcodeim Geltungsbereich.
dotnet list package --include-transitive | grep -i imagesharp
dotnet list package --include-transitive | grep -i imagesharp
Ausgabe 2: Bild Der Typ kann nach der Entfernung nicht aufgelöst werden.
Problem: Nach dem Entfernen des SixLabors.ImageSharp-Pakets führt jede als Image<Rgba32> deklarierte Variable oder als SixLabors.ImageSharp.Image<Rgba32> typisierte Parameter zu einem Kompilierungsfehler, weil der Typ nicht mehr verfügbar ist.
Lösung: Ersetzen Sie jede Verwendung durch die entsprechende IronBarcode Ausgabemethode. Wenn die Variable verwendet wurde, um Bytes zu erhalten, ersetzen Sie sie durch .ToPngBinaryData(). Wenn sie in einen Strom geschrieben wurde, ersetzen Sie sie durch .SaveAsPng(stream). Wenn sie in eine Datei gespeichert wurde, ersetzen Sie sie durch .SaveAsPng(path).
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);
// After — no external image type required
barcode.SaveAsPng(stream);
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);
// After — no external image type required
barcode.SaveAsPng(stream);
' Before — requires SixLabors.ImageSharp reference
Dim img As Image(Of Rgba32) = barcode.GetImage()
img.SaveAsPng(stream)
' After — no external image type required
barcode.SaveAsPng(stream)
Ausgabe 3: Kontext der Breaking Changes in Version 1.8
Problem: Codebasen, die gegen NetBarcodevor Version 1.8 geschrieben wurden, können GetImage() Aufrufe haben, die das Ergebnis ohne explizite Typisierung speicherten und sich auf den vor Version 1.8 internen Rückgabewert verließen. Diese Aufrufe können nach einem NetBarcode-Update bereits fehlerhaft sein, unabhängig von der IronBarcode -Migration.
Lösung: Verwenden Sie die IronBarcode-Migration als Gelegenheit, jeden bereits vorhandenen Fehler vor Version 1.8 gleichzeitig zu beheben. Alle GetImage() Aufrufstellen sollten mit einer projektweiten Suche gefunden und während des Migrationsdurchgangs durch die geeignete IronBarcode-Ausgabemethode ersetzt werden. Die grep-Befehle in der unten stehenden Migrationscheckliste identifizieren diese Speicherorte.
NetBarcode-Migrations-Checkliste
Vor der Migration
Prüfen Sie vor jeglichen Änderungen die gesamte NetBarcode-Nutzung:
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
- Identifizieren Sie alle Dateien, die eine Änderung der using-Direktive erfordern.
- Notieren Sie alle
GetImage()Aufrufstellen und wie das zurückgegebeneImage<Rgba32>Objekt nachgelagert verwendet wird - Prüfen Sie, ob QRCoder oder ZXing .NET vorhanden sind und im selben Durchgang entfernt werden können.
- Führen Sie
dotnet list package --include-transitiveaus, um den aktuellen ImageSharp-Abhängigkeitszustand vor der Entfernung zu dokumentieren - Besorgen Sie sich einen IronBarcode -Lizenzschlüssel (ein kostenloser Testschlüssel ist ohne Kauf erhältlich)
Code-Aktualisierung
- Führen Sie
dotnet remove package NetBarcodeaus - Führen Sie
dotnet remove package SixLabors.ImageSharpaus, wenn es nicht von anderen Paketen verwendet wird - Führen Sie
dotnet add package IronBarcodeaus - Fügen Sie
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";beim Anwendungsstart hinzu - Ersetzen Sie
using NetBarcode;durchusing IronBarCode;in jeder betroffenen Datei - Entfernen Sie
using SixLabors.ImageSharp;,using SixLabors.ImageSharp.PixelFormats;undusing SixLabors.Fonts;aus allen Dateien - Übersetzen Sie jeden
new Barcode(data, Type.X)Aufruf zuBarcodeWriter.CreateBarcode(data, BarcodeEncoding.X)mithilfe der API-Zuordnungstabelle - Ersetzen Sie
SaveImageFile()durchSaveAsPng()oder die geeignete formatspezifische Methode - Ersetzen Sie
GetImage()Aufrufe durchToPngBinaryData(),SaveAsPng()oderSaveAsPng(stream), wie es geeignet ist - Entfernen Sie bei der Entfernung von QRCoder: Ersetzen Sie
QRCodeGenerator+PngByteQRCodeKetten mitBarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) - Entfernen Sie bei der Entfernung von ZXing.Net: Ersetzen Sie die Lesereinrichtung mit
BarcodeReader.Read(path)
Post-Migrationstests
- Erstellen Sie das Projekt und stellen Sie sicher, dass keine Kompilierungsfehler auftreten.
- Führen Sie vorhandene Unit-Tests gegen die generierte Barcode-Ausgabe aus.
- Überprüfen Sie die Barcode-Bilder visuell auf korrekte Symbolik und lesbaren Inhalt.
- Überprüfen Sie die QR-Code-Ausgabe, falls dieses Format während der Migration hinzugefügt wurde.
- Testen der Lesefunktion, falls Barcode-Scanning hinzugefügt wurde
- Führen Sie
dotnet list package --include-transitiveaus, um zu bestätigen, dass ImageSharp nicht mehr vorhanden ist, wenn es entfernt wurde - Stellen Sie sicher, dass die Initialisierung des Lizenzschlüssels vor dem ersten Barcode-Vorgang ausgeführt wird.
Wichtigste Vorteile der Migration zu IronBarcode
Gebündelte Formatabdeckung: Nach der Migration sind QR-Codes, DataMatrix, PDF417, Aztec und alle anderen 2D-Formate über denselben API-Aufruf verfügbar, der für Code128 und EAN-13 verwendet wird. Keine zweite Bibliothek ist notwendig, wenn die Formatanforderungen erweitert werden, und die BarcodeEncoding Konstante ist das Einzige, das sich zwischen den Formattypen ändert.
Eingebaute Leseerkennung: BarcodeReader.Read() verarbeitet Bilddateien und PDF-Dokumente mit automatischer Format-Erkennung. Projekte, die bisher ZXing .NET zum Lesen benötigten, können diese Abhängigkeit beseitigen und auf eine einzige Barcode-Bibliothek umstellen, wodurch sich der Umfang der API, die die Entwickler des Projekts erlernen müssen, verringert.
Keine ImageSharp-Verpflichtung: IronBarcode hat keine Abhängigkeit von SixLabors.ImageSharp. Nach der Migration gilt die geteilte kommerzielle Lizenzbedingung, die in den transitive Abhängigkeiten von NetBarcodeeingebettet war, nicht mehr für das Projekt. Lizenzkonformitätsprüfungen werden einfacher, da die Verpflichtungen der Barcode-Bibliothek direkt angegeben sind und nicht vom Umsatzschwellenwert einer Drittanbieter-Bildverarbeitungsbibliothek abhängen.
Stabile öffentliche API: IronBarcode stellt keine Drittanbietertypen in seiner öffentlichen API-Oberfläche zur Verfügung. Der GeneratedBarcode Rückgabewert von BarcodeWriter.CreateBarcode ist IronBarcode's eigener Typ, was bedeutet, dass zukünftige Updates in IronBarcode's interner Wiedergabe keine strukturellen Änderungen im aufrufenden Code hervorrufen werden, wie es die Typänderung von NetBarcode's v1.8 GetImage() tat.
Nur noch eine Abhängigkeit zu pflegen: Durch den Ersatz von NetBarcode, QRCoder und ZXing .NET durch IronBarcode reduziert sich der Aufwand für Upgrades von drei Zyklen auf drei Versionen, drei Versionen von Versionshinweisen und drei potenzielle Versionskonflikte auf eine einzige. Mit fortschreitender Entwicklung der .NET Versionen und der damit einhergehenden Notwendigkeit von Abhängigkeitsaktualisierungen reduziert sich der Wartungsaufwand auf eine einzige Bibliothek anstatt auf drei.
Häufig gestellte Fragen
Warum sollte ich von NetBarcode zu IronBarcode migrieren?
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 kann ich NetBarcode-API-Aufrufe durch IronBarcode ersetzen?
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 NetBarcode 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.
Muss ich während der Migration sowohl NetBarcode als auch IronBarcode installiert lassen?
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 NetBarcode?
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 NetBarcode 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 NetBarcode 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.

