Wie man Barcode-Datenformate in C# ausgibt | IronBarcode
Migrating from Neodynamic Barcode to IronBarcode
Dieser Leitfaden bietet einen vollständigen Migrationspfad von Neodynamic.SDK.Barcode und Neodynamic.SDK.BarcodeReader zu IronBarcode. Es umfasst die Entfernung beider Neodynamic-Pakete, den Ersatz der Dual-Lizenz-Konfiguration durch einen einzigen Schlüssel, die Übersetzung der API-Aufrufe für Generierung und Lesen sowie den Prozess der Erlangung der 2D-Barcode-Lesefähigkeit, die mit dem Neodynamic-Produktset nicht möglich war. Der Leitfaden richtet sich an Entwickler, die bereits Neodynamic-Code besitzen und eine systematische, dateiweise Vorgehensweise für die Migration benötigen.
Warum von Neodynamic Barcode migrieren?
2D-Leselücke: Das Neodynamischer BarCode ProfessionalSDK generiert QR-Code-, DataMatrix-, PDF417- und Aztec-Barcodes. Keines dieser Formate kann vom zugehörigen Barcode Reader SDK gelesen werden. Ein Projekt, das QR-Codes für Produktetiketten, Versandbehälter oder die Dokumentenverfolgung erzeugt, kann diese Codes nicht mit dem Lesegerät, das es zusammen mit dem Generator gekauft hat, wieder auslesen. IronBarcode liest und generiert QR-Codes, DataMatrix, PDF417, Aztec und alle anderen unterstützten 2D-Formate mit derselben Bibliothek und derselben Lizenz.
Doppelter Produktaufwand: Jedes Projekt, das sowohl Neodynamic SDKs verwendet, trägt zwei PackageReference Einträge, zwei using Direktiven, zwei Lizenzblöcke und zwei separate Update-Zyklen. Der Overhead wiederholt sich auf jedem Entwicklerrechner, in jeder CI-Pipeline und in jeder Produktionsumgebung. Die Zusammenführung zweier Pakete mit separaten Wartungsanforderungen zu einer einzigen Abhängigkeit mit einer einzigen Lizenz ist das mechanische Ergebnis dieser Migration.
Das Problem der dritten Bibliothek: Teams, die auf die Lücke beim Lesen von 2D-Codes stießen und sich für einen Workaround anstelle einer Migration entschieden, fügten typischerweise eine dritte Bibliothek hinzu – ZXing .NET war dabei die häufigste Wahl –, um speziell das Lesen von QR-Codes abzudecken. Diese Entscheidung tauscht eine Einschränkung gegen eine andere Komplexität: drei barcodebezogene Abhängigkeiten, jede mit ihren eigenen Versionsbeschränkungen, ihren eigenen Versionshinweisen und ihrem eigenen Konfliktpotenzial bei Aktualisierungen der .NET Laufzeitumgebung oder des abhängigen Frameworks. IronBarcode ersetzt alle drei.
Preisstrukturkomplexität: Neodynamischer BarCode ProfessionalSDK wird pro Entwickler berechnet (Basic ab ca. $352, Ultimate ab ca. $705 über ComponentSource). Das Barcode Reader SDK hat eine separate Kostenstruktur. Ein Projekt, das sowohl Generierung als auch 1D-Scannen benötigt, muss beide kaufen, und die kombinierten Kosten steigen mit der Teamgröße zusätzlich zur Reader-Gebühr. Ein Projekt, das 2D-Scannen benötigt, kann dieses Erfordernis innerhalb der Neodynamic-Produktfamilie zu keinem Preis erfüllen. IronBarcode Lite deckt Generierung und Scannen — 1D und 2D — mit einer einzigen Lizenz ab. Die aktuellen Preise finden Sie auf der IronBarcode-Lizenzierungsseite.
Das grundsätzliche Problem
Das Kernproblem in jeder Codebasis, die beide Neodynamic SDKs für einen vollständigen Barcode-Workflow nutzte, bestand darin, dass das Lesen von QR-Codes nie möglich war:
// Before: Neodynamic Barcode-Lesegerät does not support QR codes
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string ReadQrCode(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
// Results are always null or empty for 2D barcodes
if (results == null || !results.Any())
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
return results.First().Value;
}
// Before: Neodynamic Barcode-Lesegerät does not support QR codes
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string ReadQrCode(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
// Results are always null or empty for 2D barcodes
if (results == null || !results.Any())
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
return results.First().Value;
}
Imports Neodynamic.SDK.BarcodeReader
Imports System.Drawing
Public Function ReadQrCode(imagePath As String) As String
Using bitmap As New Bitmap(imagePath)
Dim reader As New BarcodeReader()
Dim results = reader.Read(bitmap)
' Results are always null or empty for 2D barcodes
If results Is Nothing OrElse Not results.Any() Then
Throw New NotSupportedException("Neodynamic Barcode Reader does not support QR codes")
End If
Return results.First().Value
End Using
End Function
Nach der Migration zu IronBarcode wird derselbe Vorgang zu einem Standard-Leseaufruf ohne formatspezifische Behandlung:
// After: IronBarcode reads QR codes with the same call used for all formats
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}
// After: IronBarcode reads QR codes with the same call used for all formats
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}
Imports IronBarCode
Public Function ReadQrCode(imagePath As String) As String
Dim result = BarcodeReader.Read(imagePath).FirstOrDefault()
Return If(result?.Value, Nothing)
End Function
Jeder throw new NotSupportedException(...) Platzhalter in einem Codebestand, der 2D-Barcodelesen referenziert, wird während dieser Migration entfernt und durch einen funktionierenden Leseaufruf ersetzt.
IronBarcode vs. Neodynamic Barcode: Funktionsvergleich
| Feature | Neodynamischer BarCode Professional | Neodynamic Barcode-Lesegerät | IronBarcode |
|---|---|---|---|
| Code 128, EAN-13, UPC-A Generation | Ja | Nicht anwendbar | Ja |
| QR-Code, DataMatrix, PDF417-Generierung | Ja | Nicht anwendbar | Ja |
| 1D-Barcode-Lesen | Nicht anwendbar | Ja | Ja |
| QR-Code-Lesen | Nicht anwendbar | NEIN | Ja |
| DataMatrix-Lesung | Nicht anwendbar | NEIN | Ja |
| PDF417 lesen | Nicht anwendbar | NEIN | Ja |
| Native PDF-Barcode-Lese | Nein | Nein | Ja |
| Automatische Formaterkennung | Nicht anwendbar | Nein | Ja |
| Erforderliche NuGet Pakete | 1 | 1 | 1 (umfasst beides) |
| Lizenzschlüssel erforderlich | 1 | 1 (separat) | 1 (umfasst alles) |
| System.Drawing-Abhängigkeit | Ja | Ja | Nein |
| Linux-/Docker-Unterstützung | Beschränkt | Beschränkt | Ja |
| .NET 8 / .NET 9 Unterstützung | Ja | Beschränkt | Ja |
| Asynchrones Batchlesen | Nein | Nein | Ja |
Schnellstart: Migration von Neodynamic Barcode zu IronBarcode
Schritt 1: Beide Neodynamic-Pakete entfernen
Beide Pakete müssen entfernt werden. Sie haben keine gemeinsamen Abhängigkeiten, die die Entfernungsreihenfolge beeinflussen:
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
Vergewissern Sie sich, dass beide Einträge aus der .csproj Datei verschwunden sind, bevor Sie fortfahren.
Schritt 2: IronBarcode hinzufügen
dotnet add package IronBarcode
dotnet add package IronBarcode
Schritt 3: Dual-Lizenzkonfiguration ersetzen
Entfernen Sie beide Neodynamic-Lizenzblöcke und ersetzen Sie sie durch eine einzelne IronBarcode Schlüsselzuweisung. Dieses Assignment wird einmal beim Anwendungsstart gemacht — in Program.cs, Startup.cs oder dem Kompositionsstamm der Anwendung:
// Before: two license blocks, two products
using Neodynamic.SDK.Barcode;
using Neodynamic.SDK.BarcodeReader;
BarcodeProfessional.LicenseOwner = "Your Company";
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY";
// Before: two license blocks, two products
using Neodynamic.SDK.Barcode;
using Neodynamic.SDK.BarcodeReader;
BarcodeProfessional.LicenseOwner = "Your Company";
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY";
Imports Neodynamic.SDK.Barcode
Imports Neodynamic.SDK.BarcodeReader
BarcodeProfessional.LicenseOwner = "Your Company"
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY"
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company"
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY"
// After: one key covers generation and reading across all formats
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// After: one key covers generation and reading across all formats
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
' After: one key covers generation and reading across all formats
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Sämtliche Konfigurationsdateien, Umgebungsvariablen oder Geheimnisspeicher, die Neodynamic-Lizenzschlüssel enthalten, können nach der Überprüfung der Migration außer Betrieb genommen werden.
Beispiele für die Code-Migration
Generieren eines Code-128-Barcodes
Neodynamischer Ansatz:
using Neodynamic.SDK.Barcode;
using System.Drawing.Imaging;
public void GenerateCode128(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.Code128;
barcode.BarcodeUnit = BarcodeUnit.Pixel;
System.Drawing.Image image = barcode.GetBarcodeImage();
image.Save(outputPath, ImageFormat.Png);
}
using Neodynamic.SDK.Barcode;
using System.Drawing.Imaging;
public void GenerateCode128(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.Code128;
barcode.BarcodeUnit = BarcodeUnit.Pixel;
System.Drawing.Image image = barcode.GetBarcodeImage();
image.Save(outputPath, ImageFormat.Png);
}
Imports Neodynamic.SDK.Barcode
Imports System.Drawing.Imaging
Public Sub GenerateCode128(data As String, outputPath As String)
Dim barcode As New BarcodeProfessional()
barcode.Code = data
barcode.Symbology = Symbology.Code128
barcode.BarcodeUnit = BarcodeUnit.Pixel
Dim image As System.Drawing.Image = barcode.GetBarcodeImage()
image.Save(outputPath, ImageFormat.Png)
End Sub
IronBarcode -Ansatz:
using IronBarCode;
public void GenerateCode128(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
}
using IronBarCode;
public void GenerateCode128(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
}
Imports IronBarCode
Public Sub GenerateCode128(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.SaveAsPng(outputPath)
End Sub
Der System.Drawing.Imaging Import ist nicht mehr erforderlich. Die BarcodeInfo Instanz und ihre Eigenschaftenzuweisungen werden in einen einzelnen Methodenaufruf zusammengefasst. Informationen zu Größenbestimmung, Beschriftung und Ausgabeformatoptionen finden Sie im Leitfaden zum Erstellen von 1D-Barcodes .
Einen QR-Code generieren
Neodynamischer Ansatz:
using Neodynamic.SDK.Barcode;
public void GenerateQrCode(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.QRCode;
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H;
barcode.GetBarcodeImage().Save(outputPath, System.Drawing.Imaging.ImageFormat.Png);
}
using Neodynamic.SDK.Barcode;
public void GenerateQrCode(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.QRCode;
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H;
barcode.GetBarcodeImage().Save(outputPath, System.Drawing.Imaging.ImageFormat.Png);
}
Imports Neodynamic.SDK.Barcode
Imports System.Drawing.Imaging
Public Sub GenerateQrCode(data As String, outputPath As String)
Dim barcode As New BarcodeProfessional()
barcode.Code = data
barcode.Symbology = Symbology.QRCode
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H
barcode.GetBarcodeImage().Save(outputPath, ImageFormat.Png)
End Sub
IronBarcode -Ansatz:
using IronBarCode;
public void GenerateQrCode(string data, string outputPath)
{
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng(outputPath);
}
using IronBarCode;
public void GenerateQrCode(string data, string outputPath)
{
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng(outputPath);
}
Imports IronBarCode
Public Sub GenerateQrCode(data As String, outputPath As String)
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.SaveAsPng(outputPath)
End Sub
Die Generationsübersetzung ändert nur die API-Oberfläche. Der entscheidende Unterschied, der durch diese Migration entsteht, ist, dass dieselbe Anwendung nun auch die von ihr generierten QR-Codes lesen kann, und zwar mit derselben IronBarcode -Bibliothek und derselben Lizenz. Eine ausführliche Beschreibung der Erstellung von 2D-Barcodes finden Sie im Leitfaden zur Erstellung von 2D-Barcodes .
Lesen von 1D-Barcodes
Neodynamischer Ansatz:
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string[] Read1DBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
return results?.Select(r => r.Value).ToArray() ?? Array.Empty<string>();
}
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string[] Read1DBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
return results?.Select(r => r.Value).ToArray() ?? Array.Empty<string>();
}
Imports Neodynamic.SDK.BarcodeReader
Imports System.Drawing
Public Function Read1DBarcodes(imagePath As String) As String()
Using bitmap As New Bitmap(imagePath)
Dim reader As New BarcodeReader()
Dim results = reader.Read(bitmap)
Return If(results?.Select(Function(r) r.Value).ToArray(), Array.Empty(Of String)())
End Using
End Function
IronBarcode -Ansatz:
using IronBarCode;
public string[] Read1DBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
}
using IronBarCode;
public string[] Read1DBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
}
Imports IronBarCode
Public Function Read1DBarcodes(imagePath As String) As String()
Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value).ToArray()
End Function
Der Bitmap Konstruktion und System.Drawing Import werden entfernt. IronBarcode akzeptiert den Dateipfad direkt. Der result.Value Eigenschaftenname ist in beiden APIs gleich, sodass nachfolgender Code, der die zurückgegebenen Werte verarbeitet, sich nicht ändert. Informationen zu Optionen für das Einlesen und die Vorverarbeitung von Bildern mit mehreren Barcodes finden Sie im Leitfaden zum Einlesen von Barcodes aus Bildern .
Lesen von QR-Codes (bisher unmöglich)
Neodynamischer Ansatz:
// This method could not be implemented with Neodynamic Barcode Reader
public string ReadQrCode(string imagePath)
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
// This method could not be implemented with Neodynamic Barcode Reader
public string ReadQrCode(string imagePath)
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
' This method could not be implemented with Neodynamic Barcode Reader
Public Function ReadQrCode(imagePath As String) As String
Throw New NotSupportedException("Neodynamic Barcode Reader does not support QR codes")
End Function
IronBarcode -Ansatz:
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}
Imports IronBarCode
Public Function ReadQrCode(imagePath As String) As String
Dim result = BarcodeReader.Read(imagePath).FirstOrDefault()
Return If(result?.Value, Nothing)
End Function
Jeder throw new NotSupportedException(...) Platzhalter, der 2D-Barcodelesen referenziert, wird zu einem Standardleseaufruf. Der Methodenrumpf ändert sich von einer ausgelösten Ausnahme zu einer funktionierenden Implementierung. Für QR-Codes ist keine besondere Behandlung erforderlich; IronBarcode erkennt das Format automatisch.
Barcodes aus PDF-Dokumenten lesen (Neue Funktion)
Neodynamischer Ansatz:
// Neodynamic Reader cannot read barcodes from PDF files directly
// An image extraction step using a separate library was required before reading
//Neindirect equivalent exists
// Neodynamic Reader cannot read barcodes from PDF files directly
// An image extraction step using a separate library was required before reading
//Neindirect equivalent exists
' Neodynamic Reader cannot read barcodes from PDF files directly
' An image extraction step using a separate library was required before reading
' No direct equivalent exists
IronBarcode -Ansatz:
using IronBarCode;
public void ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}");
}
}
using IronBarCode;
public void ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}");
}
}
Imports IronBarCode
Public Sub ReadBarcodesFromPdf(pdfPath As String)
Dim results = BarcodeReader.Read(pdfPath)
For Each result In results
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}")
Next
End Sub
IronBarcode liest Barcodes direkt aus PDF-Dokumenten über alle Seiten hinweg. Im Ergebnis wird die Seitenzahl angezeigt, auf der der jeweilige Barcode gefunden wurde. Diese Funktion erfordert keine zusätzliche Bibliothek und keinen Zwischenschritt zur Bildextraktion.
Neodynamic Barcode API zu IronBarcode Mapping-Referenz
| Neodynamische API | IronBarcode Äquivalent | Notizen |
|---|---|---|
BarcodeInfo.LicenseOwner = "..." |
IronBarCode.License.LicenseKey = "key" |
Zusammengeführt zu einem einzigen Schlüssel |
BarcodeInfo.LicenseKey = "..." |
(part of single key above) | Kein separates Eigentümerfeld |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner |
(removed) | Nicht erforderlich |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey |
(removed) | Nicht erforderlich |
new BarcodeInfo() |
BarcodeWriter.CreateBarcode(data, encoding) |
Statisch, keine Instanz |
barcode.Value = data |
Erster Parameter von CreateBarcode |
Bei der Konstruktion bestanden |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.Code128 |
Zweiter Parameter |
barcode.Symbology = Symbology.QRCode |
BarcodeEncoding.QRCode |
Vollständige Hin- und Rückreise wird jetzt unterstützt |
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H |
QRCodeWriter.QrErrorCorrectionLevel.Highest |
Unterschiedlicher Klasseneintritt |
barcode.GetImage().Save(path, ImageFormat.Png) |
.SaveAsPng(path) |
Fluent, kein ImageFormat-Enum |
BarcodeReader.Read(bitmap) |
BarcodeReader.Read(imagePath) |
Der Dateipfad ersetzt die Bitmap. |
result.Value |
result.Value |
Gleicher Eigenschaftsname |
Symbology.DataMatrix |
BarcodeEncoding.DataMatrix |
Nur Generation → Generation und Lesen |
throw new NotSupportedException(...) für 2D-Lesen |
BarcodeReader.Read(imagePath) |
Durch eine funktionierende Implementierung ersetzen. |
Gängige Migrationsprobleme und Lösungen
Ausgabe 1: Abholanordnung für zwei Pakete
Problem: Wenn Entwickler nur ein Neodynamic-Paket entfernen und das andere beibehalten, kommt es zu Kompilierungsfehlern, da die beiden SDKs keine gemeinsamen Typen haben, aber einige Quelldateien beide Namespaces in derselben Datei importieren können.
Lösung: Entfernen Sie beide Pakete, bevor Sie Änderungen am Quellcode vornehmen. Nachdem beide entfernt wurden, suchen Sie nach allen using Neodynamic.SDK.Barcode und using Neodynamic.SDK.BarcodeReader Direktiven und entfernen Sie diese gemeinsam:
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
Anschließend prüfen mit:
grep -r "Neodynamic.SDK" --include="*.cs" .
grep -r "Neodynamic.SDK" --include="*.cs" .
Problem 2: Bereinigung der Dual-Lizenz-Konfiguration
Problem: Die beiden Neodynamic-Lizenzblöcke erscheinen oft an unterschiedlichen Stellen — einer in der Anwendungsstartklasse und einer in einem Dienstinitialisierer. Wird nur ein Block entfernt, verweist der verbleibende Code auf einen Namespace, der nicht mehr existiert, und lässt sich nicht kompilieren.
Lösung: Suchen Sie nach allen vier Neodynamic-Lizenzeigenschaften und entfernen Sie diese gemeinsam, bevor Sie den IronBarcode -Schlüssel hinzufügen:
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" .
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" .
Ersetzen Sie alle vier Zeilen durch eine einzige Zuweisung:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Problem 3: Entfernung der Ausnahme "NotSupportedException" aus Catch-Blöcken
Problem: Einige Codebasen, die den Neodynamic Reader verwendeten, fügten catch (NotSupportedException) Blöcke hinzu, um das stille Versagen beim Lesen von 2D-Barcodes zu handhaben. Diese Catch-Blöcke müssen zusammen mit dem Code, der die Ausnahme auslöst, entfernt werden; andernfalls verweist die Catch-Klausel auf einen Codepfad, der sich nicht mehr ergeben kann.
Lösung: Suchen Sie nach NotSupportedException in barcodenbezogenen Dateien und überprüfen Sie jeden Vorkommnis. Wurde die Ausnahme als Reaktion auf einen Leseversuch im 2D-Format ausgelöst, entfernen Sie sowohl den throw- als auch den catch-Block:
grep -r "NotSupportedException" --include="*.cs" .
grep -r "NotSupportedException" --include="*.cs" .
Ersetzen Sie den ausführenden Methodenrumpf durch BarcodeReader.Read(imagePath) und entfernen Sie die entsprechende Catch-Klausel von jedem Anrufer.
Checkliste zur Migration von Neodynamic-Barcodes
Vor der Migration
- Suchen Sie nach allen Neodynamic Paketreferenzen:
grep -r "Neodynamic.SDK" --include="*.csproj" . - Suchen Sie nach allen Neodynamic Using-Direktiven:
grep -r "using Neodynamic" --include="*.cs" . - Suche nach Speicherorten der Lizenzkonfiguration:
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" . - Suchen Sie nach allen
BarcodeInfoInstantiierungsstellen:grep -r "new BarcodeInfo\(\)" --include="*.cs" . - Suchen Sie nach allen Neodynamic Leseaufrufen:
grep -r "BarcodeReader.Read" --include="*.cs" . - Suchen Sie nach allen
NotSupportedExceptionVerwendungen in Barcode-Pfaden:grep -r "NotSupportedException" --include="*.cs" . - Identifizieren Sie alle Drittanbieterbibliotheken (ZXing .NET oder ähnliche), die speziell zur Schließung der 2D-Leselücke hinzugefügt wurden – diese können nach der Migration entfernt werden.
- Alle Neodynamic-Lizenzschlüssel protokollieren, damit sie nach der Überprüfung aus den geheimen Speichern entfernt werden können.
Aufgaben der Code-Aktualisierung
- Führen Sie
dotnet remove package Neodynamic.SDK.Barcodeaus - Führen Sie
dotnet remove package Neodynamic.SDK.BarcodeReaderaus - Führen Sie
dotnet add package IronBarcodeaus - Entfernen Sie alle
using Neodynamic.SDK.Barcodeundusing Neodynamic.SDK.BarcodeReaderDirektiven - Fügen Sie
using IronBarCodein allen Dateien hinzu, die Barcode-Operationen ausführen - Entfernen Sie beide Neodynamic-Lizenzkonfigurationsblöcke.
- Fügen Sie
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"einmal beim Anwendungsstart hinzu - Ersetzen Sie
new BarcodeInfo()+ Eigenschaften-Zuweisungen +barcode.GetImage().Save(...)durchBarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path) - Ersetzen Sie
QRCodeWriterMuster entsprechend mitQRCodeWriter.CreateQrCode() - Ersetzen Sie
BarcodeReader.Read(bitmap)Aufrufe, indem Sie dienew Bitmap(imagePath)Konstruktion entfernen und den Dateipfad direkt anBarcodeReader.Read(imagePath)übergeben - Entfernen Sie alle
throw new NotSupportedException(...)Platzhalter für 2D-Lesen und ersetzen Sie diese mitBarcodeReader.Read(imagePath) - Entfernen Sie die entsprechenden
catch (NotSupportedException)Blöcke von Anrufern - Entfernen Sie alle Drittanbieterbibliotheken, die ausschließlich hinzugefügt wurden, um die Leselücke von Neodynamic 2D zu schließen.
Post-Migrationstests
- Überprüfen Sie, ob die Generierung von Code-128-Barcodes Ausgaben erzeugt, die den vorherigen Abmessungen und DPI-Einstellungen entsprechen.
- Überprüfen Sie, ob die QR-Code-Generierung einen scannbaren Code erzeugt.
- Überprüfen, ob das Einlesen von 1D-Barcodes dieselben Werte liefert wie die vorherige Implementierung des Neodynamic Readers.
- Verifizieren Sie, dass das QR-Code-Lesen bei Bildern erfolgreich ist, die zuvor
NotSupportedExceptionausgelöst haben - Überprüfen Sie, ob das Lesen von DataMatrix und PDF417 erfolgreich ist, wenn diese Formate in der Eingabe der Anwendung vorhanden sind.
- Testen Sie das Lesen von PDF-Barcodes, wenn die Anwendung PDF-Dokumente verarbeitet.
- Stellen Sie sicher, dass alle Verweise auf Neodynamic-Lizenzschlüssel aus Konfigurationsdateien und Umgebungsvariablen entfernt wurden.
- Stellen Sie sicher, dass die Drittanbieter-2D-Bibliothek (falls vorhanden) vollständig entfernt wurde und keine verbleibenden Importe darauf verweisen.
Wichtigste Vorteile der Migration zu IronBarcode
Einheitliche Lese- und Schreibfähigkeit: Nach der Migration kann jede Symbolik, die IronBarcode generieren kann, auch über dieselbe Bibliothek wieder eingelesen werden. Die Asymmetrie zwischen Generator und Leser von Neodynamic – bei der QR-Codes, DataMatrix, PDF417 und Aztec zwar erzeugt, aber nicht konsumiert werden konnten – wird beseitigt. Anwendungen, die bisher einen Workaround oder eine dritte Bibliothek zum Lesen von 2D-Daten benötigten, erhalten diese Funktionalität nun ohne zusätzlichen Integrationsaufwand.
Einzellizenzverwaltung: Ein NuGet Paket, ein Lizenzschlüssel und ein Konfigurationsblock ersetzen zwei separate Produktabonnements. Erneuerung, Schlüsselrotation und Management von Umgebungsvariablen werden halb so komplex. Die Reduzierung des Verwaltungsaufwands ist ein fortlaufender Prozess und kein einmaliger Gewinn.
Native PDF-Barcode-Lesung: IronBarcode liest Barcodes direkt aus PDF-Dokumenten und gibt Metadaten zur Seitenzahl zusammen mit den Barcode-Werten zurück. Anwendungen, die Versandmanifeste, Rechnungsdokumente oder medizinische Aufzeichnungen mit eingebetteten Barcodes verarbeiten, benötigen keinen Zwischenschritt der Bildextraktion oder eine zusätzliche PDF-Bibliothek mehr, um das Lesen von Barcodes zu unterstützen. Die vollständige Liste der unterstützten Barcode-Formate sowie alle abgedeckten Symbologien und Eingabetypen finden Sie hier.
Elimination der Abhängigkeit von System.Drawing: Die SDKs von Neodynamic hängen von System.Drawing ab, was eine zusätzliche Konfiguration der nativen Bibliothek unter Linux und in Docker-Containern erfordert. IronBarcode erfordert keine System.Drawing Abhängigkeit, was bedeutet, dass derselbe Codebestand auf Windows, Linux und in containerisierten Cloud-Umgebungen ohne plattformspezifische Konfigurationsänderungen läuft.
Vereinfachte Lizenzkosten für volle Funktionalität: Ein Projekt, das sowohl Neodynamic SDKs als auch eine dritte Bibliothek zum Lesen von 2D-Code benötigte, musste für drei Abhängigkeiten bezahlen, um das zu erreichen, was IronBarcode unter einer einzigen Lizenz bietet. Bei Projekten, die sowohl die Generierung als auch das Lesen von 2D-Daten erfordern, konsolidiert die Migration sowohl den technischen Aufwand als auch die Lizenzkosten in einem einzigen kommerziellen Produkt. Aktuelle Preisinformationen finden Sie auf derIronBarcode Lizenzseite .
Häufig gestellte Fragen
Warum sollte ich von Neodynamic Barcode Professional 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 kann ich Neodynamic-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 Neodynamic Barcode Professional 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 Neodynamic Barcode Professional 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 Neodynamic Barcode Professional?
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 Neodynamic alle Barcode-Formate 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 Ergebnisseigenschaften ändern sich bei der Migration von Neodynamic Barcode Professional 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.

