Migrating from Accusoft BarcodeXpressto IronBarcode
Der größte Teil der Arbeit bei dieser Migration besteht aus dem Löschen von Dateien. Das Zwei-Schlüssel-Lizenzsystem — SetSolutionName, SetSolutionKey und SetOEMLicenseKey für Runtime — verschwindet vollständig. Die tatsächlichen Barcode-Operationen (ein Bild lesen, einen Barcode in eine Datei schreiben) werden in kürzere IronBarcode-Äquivalente übersetzt. Wenn Ihr Codebase eine BarcodeService-Klasse hat, die BarcodeXpress einbindet, ist der Lizenzcode oft ein großer Anteil davon. Nach der Migration schrumpft diese Klasse.
Warum von Accusoft BarcodeXpressmigrieren?
Teams, die von BarcodeXpress migrieren, berichten von folgenden Auslösern:
Bewertungsmodus blockiert genaues Benchmarking: Ohne gültigen OEM-/Laufzeit-Schlüssel versieht BarcodeXpress dekodierte Ergebnisse mit dem literal String " UNLICENSED accusoft.com " und wendet denselben Stempel auf generierte 2D-Barcodes an. Vor dem Kauf produziertes Genauigkeitstest auf echten Dokumenten ergibt dieses mit Wasserzeichen versehene Ergebnis, sodass Sie nicht überprüfen können, ob die Bibliothek Ihre tatsächlichen Scan-Typen korrekt liest, bevor Sie sich zum Kauf verpflichten.
Zwei-Schlüssel-Lizenzierung erhöht den Betriebsaufwand: BarcodeXpress trennt die SDK-Lizenz (SetSolutionName + SetSolutionKey) von der OEM/Runtime-Lizenz (SetOEMLicenseKey). CI/CD-Pipelines, Docker-Container und Container-Orchestrierungsplattformen benötigen jeweils zwei Schlüsselsysteme, die als separate Geheimnisse verwaltet werden. Ein fehlender oder ungültiger Laufzeitschlüssel fällt auf das mit Wasserzeichen versehene Ergebnis zurück, anstatt einen Fehler anzuzeigen, wodurch ein Fehlerzustand entsteht, der automatisierte Tests bestehen kann, wenn die Überprüfungen nur auf nicht-nulle Ergebnisse prüfen.
Mindestens fünf Laufzeitlizenzen für jede Produktionsumgebung: Selbst für eine Einzelserver-Bereitstellung müssen mindestens fünf Laufzeitlizenzen erworben werden. Teams, die einen Produktionsserver und einen Staging-Server betreiben, zahlen mindestens zehn Laufzeitlizenzen, unabhängig von der tatsächlichen Nutzung.
40 Seiten pro Minute Standard Edition Höchstgeschwindigkeit: Die Standard Edition drosselt die Verarbeitung auf 40 Seiten pro Minute. Bei diesem Tempo dauert die Bearbeitung eines Stapels von 100.000 Dokumenten etwa 41 Stunden. Um die Beschränkung aufzuheben, ist ein Upgrade auf die Professional Edition erforderlich, die zusätzlich zu den bereits erworbenen Laufzeitlizenzen höhere Kosten pro Entwicklerplatz verursacht.
Keine native PDF-Unterstützung: PDF-Dateien müssen mithilfe einer separaten Bibliothek in Bilder umgewandelt werden, bevor BarcodeXpress sie lesen kann. Diese externe Abhängigkeit verursacht zusätzliche Lizenzkosten, einen weiteren Konvertierungsschritt und einen erhöhten Speicherbedarf durch das Speichern der gerenderten Seitenbilder.
Thread-Sicherheit erfordert Instanzisolierung: Das reader-Objekt von BarcodeXpress ist zustandsbehaftet und nicht sicher für parallelen Zugriff. Parallele Batch-Verarbeitung erfordert eine voll initialisierte BarcodeXpress-Instanz pro Thread, wobei die vollständige Zwei-Schicht-Lizenzinitialisierung in jedem Thread-Kontext wiederholt wird.
Das grundsätzliche Problem
BarcodeXpress erfordert eine mehrstufige Initialisierung, ein Bitmap-Laden und eine BarcodeType[]-Konfiguration, bevor ein Barcode gelesen werden kann:
using var bitmap = new Bitmap(imagePath);
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...");
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
var value = results.FirstOrDefault()?.BarcodeValue;Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Using bitmap As New Bitmap(imagePath)
Dim barcodeXpress = New BarcodeXpress(".")
barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...")
barcodeXpress.Reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = barcodeXpress.Reader.Analyze(bitmap)
Dim value = results.FirstOrDefault()?.BarcodeValue
End UsingIronBarcode ersetzt diesen gesamten Block durch einen einzigen statischen Aufruf:
var value = BarcodeReader.Read(imagePath).First().Value;Dim value = BarcodeReader.Read(imagePath).First().ValueIronBarcode vs. Accusoft BarcodeXpress: Funktionsvergleich
| Feature | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| Lizenzmodell | SDK-Schlüssel + OEM-/Laufzeit-Schlüssel (separate Einkäufe) | Ein einziger ewiger Schlüssel |
| Mindestlaufzeitlizenzen | 5 (auch für 1 Server) | Konzept ohne Laufzeitlizenz |
| Auswertungsmodus | Dekodierte Werte und generierte 2D-Barcodes mit " UNLICENSED accusoft.com " gestempelt | Vollständige Werte zurückgegeben; wasserzeichen nur auf der generierten Ausgabe |
| Durchsatzgrenze | 40 PPM (Standardausgabe) | Keine Begrenzung auf keiner Stufe |
| automatische Formaterkennung | Handbuch — muss ein BarcodeType[]-Array zu BarcodeTypes zuweisen | Automatischer Ablauf über alle unterstützten Formate hinweg |
| PDF-Unterstützung | Externe Bibliothek erforderlich, um Seiten in Bitmaps zu rendern | Nativ — BarcodeReader.Read("doc.pdf") |
| API-Stil | Instanzbasiert; Bitmap-Eingabe; Eigenschafts-/Methodenkonfiguration | Statische Factory-Methoden, flüssige API |
| Thread-Sicherheit | Instanz pro Thread erforderlich | Zustandslose statische Methoden — threadsicher |
| Docker-Lizenzkonfiguration | Lizenzdatei einbinden oder Lizenzserver | Einzelne Umgebungsvariable |
| CI/CD-Geheimnisse erforderlich | SDK-Schlüsselpaar + OEM-/Laufzeit-Schlüssel | Ein Geheimnis |
| .NET Framework / .NET Core | Separate Pakete: Accusoft.BarcodeXpress.Net und Accusoft.BarcodeXpress.NetCore | Single IronBarcode package (.NET Framework 4.6.2+, .NET Core 3.1+, .NET 5–8) |
| Linux/macOS | Ja (über .NetCore-Paket) | Ja – Windows x64/x86, Linux x64, macOS x64/ARM |
| QR-Code mit Logo | Manuelle GDI+-Überlagerung erforderlich | AddBrandLogo("logo.png") eingebaut |
| Einstiegspreis | $1,960+ SDK + mindestens 5 Laufzeitlizenzen | 749 $ (dauerhaft) (Lite, 1 Entwickler) |
| Dauerlizenz | Nicht Standard – bitte kontaktieren Sie den Vertrieb. | Ja, alle Stufen. |
Schnellstart: Migration von Accusoft BarcodeXpresszu IronBarcode
Schritt 1: Ersetzen des NuGet-Pakets
dotnet remove package Accusoft.BarcodeXpress.NetCore
dotnet add package IronBarcode
Schritt 2: Namespaces aktualisieren
// Remove
using Accusoft.BarcodeXpressSdk;
// Add
using IronBarCode;Imports IronBarCodeSchritt 3: Lizenz initialisieren
Fügen Sie die Lizenzinitialisierung einmal beim Anwendungsstart in Program.cs, Startup.cs oder Ihrer Dependency Injection-Konfiguration hinzu:
// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";' Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Im Produktionsbetrieb lesen Sie den Schlüssel aus einer Umgebungsvariablen oder Ihrem Geheimnismanager:
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
?? throw new InvalidOperationException("IronBarcode license key not configured");Imports IronBarCode
Imports System
License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE"), Throw New InvalidOperationException("IronBarcode license key not configured"))Kein SetSolutionKey, kein SetOEMLicenseKey, keine per-Server Runtime-Aktivierung. Das ist die vollständige Lizenzkonfiguration.
Beispiele für die Code-Migration
Lizenzinitialisierung
BarcodeXpress-Ansatz:
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
// Constructor takes the path containing the Barcode Xpress runtime files.
_barcodeXpress = new BarcodeXpress(".");
// SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// OEM/runtime license — separate purchase, minimum 5 licenses required.
// Without this call, decoded values and generated 2D barcodes are
// stamped with " UNLICENSED accusoft.com ".
_barcodeXpress.Licensing.SetOEMLicenseKey(
"2.0.OEMLicenseStringFromAccusoft...");
}
}Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
' Constructor takes the path containing the Barcode Xpress runtime files.
_barcodeXpress = New BarcodeXpress(".")
' SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
' OEM/runtime license — separate purchase, minimum 5 licenses required.
' Without this call, decoded values and generated 2D barcodes are
' stamped with " UNLICENSED accusoft.com ".
_barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...")
End Sub
End ClassIronBarcode -Ansatz:
using IronBarCode;
// In Program.cs
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// BarcodeService no longer needs a constructor or any license management
public class BarcodeService
{
// Ready to use — no initialization needed
}Imports IronBarCode
' In Program.vb
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
' BarcodeService no longer needs a constructor or any license management
Public Class BarcodeService
' Ready to use — no initialization needed
End ClassDer BarcodeXpress-Konstruktor existiert ausschließlich, um zwei Lizenzschlüsselsysteme und den Laufzeitpfad zu verwalten. IronBarcode ersetzt es mit einer einzigen Zeile beim Anwendungsstart. Die BarcodeService-Klasse benötigt überhaupt keinen Konstruktor.
BarCode lesen
BarcodeXpress-Ansatz:
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public string ReadFirstBarcode(string imagePath)
{
// Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.FirstOrDefault()?.BarcodeValue;
}Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Function ReadFirstBarcode(imagePath As String) As String
' Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
Using bitmap As New Bitmap(imagePath)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = _barcodeXpress.reader.Analyze(bitmap)
Return results.FirstOrDefault()?.BarcodeValue
End Using
End FunctionIronBarcode -Ansatz:
using IronBarCode;
public string ReadFirstBarcode(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.First().Value;
}Imports IronBarCode
Public Function ReadFirstBarcode(imagePath As String) As String
Dim results = BarcodeReader.Read(imagePath)
Return results.First().Value
End FunctionDer BarcodeTypes Array-Filter und der new Bitmap(...) Lade-Schritt verschwinden beide. IronBarcode erkennt automatisch das Format in allen unterstützten Symbologien und akzeptiert direkt einen Dateipfad. Wenn ein Lieferant von Code 128 auf DataMatrix umstellt, funktioniert IronBarcode weiterhin ohne Codeänderung. Auch Ergebnisattribute ändern sich: BarcodeValue wird zu Value, und BarcodeType wird zu Format. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt beide Umbenennungen.
Lesen mehrerer Barcodes aus einem Bild
BarcodeXpress-Ansatz:
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue).ToList();
}Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Function ReadAllBarcodes(imagePath As String) As IReadOnlyList(Of String)
Using bitmap As New Bitmap(imagePath)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = _barcodeXpress.reader.Analyze(bitmap)
Return results.Select(Function(r) r.BarcodeValue).ToList()
End Using
End FunctionIronBarcode -Ansatz:
using IronBarCode;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
var options = new BarcodeReaderOptions { ExpectMultipleBarcodes = true };
var results = BarcodeReader.Read(imagePath, options);
return results.Select(r => r.Value).ToList();
}Imports IronBarCode
Public Function ReadAllBarcodes(imagePath As String) As IReadOnlyList(Of String)
Dim options As New BarcodeReaderOptions With {.ExpectMultipleBarcodes = True}
Dim results = BarcodeReader.Read(imagePath, options)
Return results.Select(Function(r) r.Value).ToList()
End FunctionExpectMultipleBarcodes sagt IronBarcode, nach dem ersten Treffer weiter zu scannen, was bei Dokumenten mit mehreren Codes in verschiedenen Regionen nützlich ist. Weitere Details zu den Leseoptionen finden Sie in der IronBarcode -Lesedokumentation .
Batch-Verarbeitung
BarcodeXpress ist instanzbasiert und sein reader-Objekt ist zustandsbehaftet, daher erfordert parallele Batch-Verarbeitung eine Instanz pro Thread mit der vollständigen Zwei-Schicht-Lizenzinitialisierung pro Thread. Die statischen Methoden von IronBarcode sind zustandslos, daher erfordert Parallel.ForEach keine Instanzverwaltung.
BarcodeXpress-Ansatz:
using System.Collections.Generic;
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
using var bitmap = new Bitmap(path);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
Result[] barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}Imports System.Collections.Generic
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Function ProcessBatch(imagePaths As IEnumerable(Of String)) As Dictionary(Of String, String)
Dim results As New Dictionary(Of String, String)()
For Each path In imagePaths
Using bitmap As New Bitmap(path)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
}
Dim barcodes As Result() = _barcodeXpress.reader.Analyze(bitmap)
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
End Using
Next
Return results
End FunctionIronBarcode -Ansatz:
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
public Dictionary<string, string> ProcessBatch(string[] imagePaths)
{
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, file =>
{
var r = BarcodeReader.Read(file);
var first = r.FirstOrDefault();
if (first != null)
results[file] = first.Value;
});
return new Dictionary<string, string>(results);
}Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
Public Function ProcessBatch(imagePaths As String()) As Dictionary(Of String, String)
Dim results = New ConcurrentDictionary(Of String, String)()
Parallel.ForEach(imagePaths, Sub(file)
Dim r = BarcodeReader.Read(file)
Dim first = r.FirstOrDefault()
If first IsNot Nothing Then
results(file) = first.Value
End If
End Sub)
Return New Dictionary(Of String, String)(results)
End FunctionFalls die Begrenzung von 40 Seiten pro Minute in der BarcodeXpress Standard Edition Sie dazu veranlasst hat, Code zur Behandlung der Ratenbegrenzung hinzuzufügen – z. B. Wartezeiten zwischen 40er-Gruppen, einen Minutenzähler oder Verzögerungen –, entfernen Sie diesen Code vollständig. IronBarcode hat keine Durchsatzbegrenzung.
PDF-Unterstützung hinzufügen
BarcodeXpress liest Barcodes nicht direkt aus PDF-Dateien. Die übliche Lösung besteht darin, eine separate PDF-Rendering-Bibliothek hinzuzufügen, jede Seite als Bild im Speicher zu rendern und diese Bilder dann nacheinander an den Barcode-Leser zu übergeben.
BarcodeXpress-Ansatz:
// Requires a separate PDF library (not shown — varies by team choice)
// Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
foreach (Bitmap pageBitmap in pdfRenderer.RenderPages("document.pdf"))
{
using (pageBitmap)
{
_barcodeXpress.reader.BarcodeTypes = Enum.GetValues(typeof(BarcodeType));
Result[] barcodes = _barcodeXpress.reader.Analyze(pageBitmap);
// ... collect results
}
}Imports System
Imports System.Drawing
' Requires a separate PDF library (not shown — varies by team choice)
' Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
For Each pageBitmap As Bitmap In pdfRenderer.RenderPages("document.pdf")
Using pageBitmap
_barcodeXpress.reader.BarcodeTypes = [Enum].GetValues(GetType(BarcodeType))
Dim barcodes As Result() = _barcodeXpress.reader.Analyze(pageBitmap)
' ... collect results
End Using
NextIronBarcode -Ansatz:
using IronBarCode;
// One call — no rendering step, no external dependency
var results = BarcodeReader.Read("document.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}Imports IronBarCode
' One call — no rendering step, no external dependency
Dim results = BarcodeReader.Read("document.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
NextWenn Aspose.PDF, PdfiumViewer, itext7 oder irgendeine andere PDF-Bibliothek allein hinzugefügt wurde, um den BarcodeXpress-Leseworkflow zu unterstützen, kann sie nach der Migration entfernt werden. Weitere Optionen, einschließlich der Auswahl eines Seitenbereichs, finden Sie im IronBarcode PDF-Leseguide.
Barcode-Erzeugung
BarcodeXpress-Ansatz:
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public void GenerateBarcode(string data, string outputPath)
{
_barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode;
_barcodeXpress.writer.BarcodeValue = data;
// CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save(outputPath);
}Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Sub GenerateBarcode(data As String, outputPath As String)
_barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode
_barcodeXpress.writer.BarcodeValue = data
' CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
Using bitmap As Bitmap = _barcodeXpress.writer.CreateBitmap()
bitmap.Save(outputPath)
End Using
End SubIronBarcode -Ansatz:
using IronBarCode;
public void GenerateBarcode(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateBarcode(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(outputPath)
End SubDie fließende Kette ersetzt die Eigenschaftenzuweisungen, den CreateBitmap-Aufruf und den Bitmap.Save-Schritt. Um den Barcode als Binärdaten für die Speicherung in einer Datenbank oder den Abruf von einer API zu erhalten:
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ToPngBinaryData();Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128).ToPngBinaryData()QR-Code-Generierung
BarcodeXpress-Ansatz:
_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode;
_barcodeXpress.writer.BarcodeValue = data;
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save("qr.png");
// Logo overlay required manual GDI+ drawing on the returned BitmapImports System.Drawing
_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode
_barcodeXpress.writer.BarcodeValue = data
Using bitmap As Bitmap = _barcodeXpress.writer.CreateBitmap()
bitmap.Save("qr.png")
' Logo overlay required manual GDI+ drawing on the returned Bitmap
End UsingIronBarcode -Ansatz:
using IronBarCode;
using IronSoftware.Drawing;
// Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
// With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
// With high error correction (for logo overlays)
QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded-high-ecc.png");
// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
.ChangeBarCodeColor(Color.DarkBlue)
.SaveAsPng("qr-colored.png");Imports IronBarCode
Imports IronSoftware.Drawing
' Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.SaveAsPng("qr.png")
' With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
' With high error correction (for logo overlays)
QRCodeWriter.CreateQrCode( _
"https://example.com", _
500, _
QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded-high-ecc.png")
' Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300) _
.ChangeBarCodeColor(Color.DarkBlue) _
.SaveAsPng("qr-colored.png")Logoeinbettung, Fehlerkorrekturstufe und Farbanpassung sind allesamt in die Fluent API integriert. BarcodeXpress erfordert für jede dieser Funktionen ein manuelles GDI+-Zeichnen nach dem ersten Schreiben der Datei. Für mehr QR-Code-Optionen lesen Sie den QR-Code-Erstellungsguide.
Accusoft BarcodeXpressAPI zu IronBarcode Mapping-Referenz
| Accusoft BarcodeXpress | IronBarcode |
|---|---|
new BarcodeXpress(".") | Statische Methoden – keine Instanz erforderlich |
Licensing.SetSolutionName("...") | IronBarCode.License.LicenseKey = "key" |
Licensing.SetSolutionKey(a, b, c, d) | (removed — not needed) |
Licensing.SetOEMLicenseKey(string) | (removed — no OEM/runtime key concept) |
new Bitmap(path) + reader.Analyze(bitmap) | BarcodeReader.Read(path) |
reader.BarcodeTypes = new[] { BarcodeType.Code128Barcode, ... } | (removed — auto-detection handles all formats) |
result.BarcodeValue | result.Value |
result.BarcodeType | result.Format |
writer.BarcodeType = BarcodeType.Code128Barcode | BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
writer.BarcodeValue = "data" | (first argument to CreateBarcode) |
writer.CreateBitmap() + bitmap.Save(path) | .SaveAsPng(path) |
writer.BarcodeType = BarcodeType.QRCodeBarcode | QRCodeWriter.CreateQrCode(data, size) |
| 40 ppm Standardgrenzwert | Keine Durchsatzbegrenzung auf keiner Ebene |
Gängige Migrationsprobleme und Lösungen
Problem 1: Kompilierungsfehler bei Eigenschaftsnamen
BarcodeXpress: Ergebnisobjekte bieten BarcodeValue und BarcodeType, die in IronBarcode nicht existieren.
Lösung: Führen Sie vor dem Erstellen eine Suchen-und-Ersetzen-Operation in der gesamten Lösung durch:
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
Ersetzen Sie result.BarcodeValue mit result.Value und result.BarcodeType mit result.Format in allen gefundenen Dateien.
Problem 2: Verwaiste Lizenzkonfigurationsaufrufe
BarcodeXpress: SetSolutionName, SetSolutionKey und SetOEMLicenseKey-Aufrufe — plus alle benutzerdefinierten Assertions, die das " UNLICENSED accusoft.com "-Wasserzeichen im entschlüsselten Ergebnis erkennen — existieren in vielen Codebasen als Schutzmechanismen gegen den wasserzeichenbehafteten Ausfallmodus.
Lösung: Lokalisieren und löschen Sie alle derartigen Aufrufstellen — IronBarcode hat keinen entsprechenden Zustand. Der Lizenzschlüssel ist entweder gültig oder nicht, und wenn nicht, gelten die Testbeschränkungen einheitlich, anstatt einzelne dekodierte Werte abzuwerten:
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "UNLICENSED accusoft" --include="*.cs" .
Alle diese Anrufseiten können gelöscht werden.
Problem 3: Docker-Lizenzdatei in Umgebungsvariable einbinden
BarcodeXpress: Docker-Deployments binden typischerweise eine BarcodeXpress-Lizenzkonfigurationsdatei an einen bekannten Pfad im Container ein, mithilfe einer COPY- oder Volume-Mount-Anweisung.
Lösung: Entfernen Sie die Konfigurationsdateikopie und ersetzen Sie sie durch eine Umgebungsvariable:
# Remove this
COPY accusoft-license.lic /app/license/
# Add this
ENV IRONBARCODE_LICENSE=YOUR-LICENSE-KEY
Beim Anwendungsstart:
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")In Kubernetes wird der Lizenzschlüssel zu einer geheimen Referenz in der Pod-Spezifikation:
env:
- name: IRONBARCODE_LICENSE
valueFrom:
secretKeyRef:
name: ironbarcode-secrets
key: license-key
Problem 4: Code zur Behandlung von Ratenbegrenzungen
BarcodeXpress: Teams, die große Stapel unterhalb der Obergrenze von 40 PPM der Standard Edition verarbeiten, fügen oft Code hinzu, um zwischen Dokumentengruppen zu pausieren, Minutenzähler zu verfolgen oder Verzögerungen einzuführen, um innerhalb des Limits zu bleiben.
Lösung: Entfernen Sie den gesamten Code zur Ratenbegrenzung. Finden Sie es mit:
grep -r "40\|PPM\|pagesPerMinute\|minuteStart" --include="*.cs" .
IronBarcode hat keine Durchsatzbegrenzung – die Verarbeitung erfolgt mit der Geschwindigkeit, die Ihre Infrastruktur zulässt.
Ausgabe 5: Thread-Sicherheit – Entfernung von Instanzpools
BarcodeXpress: Codebasen, die gleichzeitige Verarbeitung unterstützen, verwalten häufig einen Pool von BarcodeXpress-Instanzen oder verwenden ein ThreadLocal<BarcodeXpress>-Muster, um den zustandsbehafteten Leser pro Thread zu isolieren.
Lösung: Die Pooling-Logik vollständig entfernen. IronBarcode's BarcodeReader.Read und BarcodeWriter.CreateBarcode sind zustandslose statische Methoden. Gleichzeitige Aufrufe von beliebig vielen Threads beeinträchtigen sich nicht gegenseitig.
Accusoft BarcodeXpressMigrations-Checkliste
Vor der Migration anfallende Aufgaben
Prüfen Sie den Quellcode, um alle BarcodeXpress-Verwendungen zu identifizieren, bevor Sie Codeänderungen vornehmen:
grep -r "BarcodeXpress" --include="*.cs" .
grep -r "Accusoft" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "reader\.Analyze" --include="*.cs" .
grep -r "writer\.CreateBitmap" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "BarcodeType\." --include="*.cs" .
- Notieren Sie sich, welche Barcode-Formate explizit in
BarcodeTypes-Zuweisungen aufgeführt sind — diese werden alle in IronBarcode automatisch erkannt - Identifizieren Sie jeglichen Code zur Ratenbegrenzungsbehandlung, der entfernt werden kann.
- Identifizieren Sie alle PDF-Rendering-Bibliotheken, die ausschließlich zur Unterstützung des BarcodeXpress-Lesens hinzugefügt wurden – diese können ebenfalls entfernt werden.
- Besorgen Sie sich Ihren IronBarcode -Lizenzschlüssel und fügen Sie ihn Ihrem Geheimnismanager hinzu.
Aufgaben der Code-Aktualisierung
- Entfernen Sie
Accusoft.BarcodeXpress.NetCoreaus allen.csproj-Dateien - Fügen Sie
IronBarcodein alle.csproj-Dateien ein, die Barcode-Funktionalität benötigen - Ersetzen Sie
using Accusoft.BarcodeXpressSdk;mitusing IronBarCode;in allen Dateien - Fügen Sie
IronBarCode.License.LicenseKey = ...zum Anwendungsstart hinzu - Löschen Sie alle
BarcodeXpress-Konstruktoraufrufe und Instanzfelder - Löschen Sie alle
SetSolutionName,SetSolutionKeyundSetOEMLicenseKey-Aufrufe - Löschen Sie benutzerdefinierte Assertions, die dekodierte Ausgaben auf das Wasserzeichen " UNLIZENZIERT accusoft.com " überprüfen
- Ersetzen Sie
new Bitmap(path)+reader.Analyze(bitmap)mitBarcodeReader.Read(path) - Entfernen Sie alle
reader.BarcodeTypes = ...-Zuweisungen - Ersetzen Sie
result.BarcodeValuemitresult.Value - Ersetzen Sie
result.BarcodeTypemitresult.Format - Ersetzen Sie
writer.CreateBitmap()+bitmap.Save(path)mitBarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path) - Entfernen Sie den Code zur Drosselung der Datenrate.
- Entfernen Sie gegebenenfalls den Zwischencode für die PDF-Darstellung.
- Entfernen Sie Instanzen-Pooling oder
ThreadLocal-Muster für BarcodeXpress-Instanzen - Entfernen Sie die Lizenzdateieinbindungen aus den Dockerfile- und docker-compose-Dateien.
- Fügen Sie die
IRONBARCODE_LICENSE-Umgebungsvariable den Docker- und Containerkonfigurationen hinzu - Kubernetes-Secrets und Pod-Spezifikationen aktualisieren
- Aktualisieren Sie die CI/CD-Pipeline-Geheimnisse — entfernen Sie
ACCUSOFT_SOLUTION_KEYundACCUSOFT_RUNTIME_KEY; fügen SieIRONBARCODE_LICENSEhinzu
Post-Migrationstests
- Erstellen Sie die Lösung – beheben Sie alle verbleibenden Kompilierungsfehler aufgrund umbenannter Eigenschaften.
- Führen Sie Unit-Tests für alle Barcode-Lesevorgänge durch.
- Führen Sie Unit-Tests für alle Barcode-Generierungsvorgänge durch.
- Gegebenenfalls mit PDF-Eingaben testen
- Führen Sie einen Stapelverarbeitungstest durch, um zu bestätigen, dass keine Durchsatzdrosselung auftritt.
- In einer Testumgebung bereitstellen und überprüfen, ob der Lizenzschlüssel korrekt aus der Umgebungsvariablen aufgelöst wird.
Wichtigste Vorteile der Migration zu IronBarcode
Beseitigung der Komplexität der Zwei-Schlüssel-Lizenz: Die SetSolutionName, SetSolutionKey und SetOEMLicenseKey-Einrichtung verschwindet vollständig. Ein Schlüssel deckt jede Umgebung von der Entwicklung bis zur Produktion ab, und der Testmodus liefert vollständige dekodierte Werte (anstatt jeden mit " UNLIZENZIERT accusoft.com " zu stempeln), sodass eine Vorkauf-Benchmarking auf realen Dokumenten möglich ist.
Keine Mindestabnahmemenge für Laufzeitlizenzen: BarcodeXpress benötigt für jede Produktionsbereitstellung mindestens fünf Laufzeitlizenzen. IronBarcode kennt kein Laufzeitlizenzkonzept – der einzelne unbefristete Schlüssel deckt eine beliebige Anzahl von Produktionsinstallationen innerhalb seiner Stufe ab.
Durchsatz ohne Obergrenze: Die Standard Edition beschränkt den Durchsatz auf 40 ppm, und jeglicher Code zur Ratenbegrenzung, der geschrieben wurde, um innerhalb dieser Grenze zu bleiben, kann entfernt werden. IronBarcode verarbeitet Anfragen mit der Geschwindigkeit, die von der zugrunde liegenden Hardware und dem Netzwerk unterstützt wird, ohne softwareseitige Begrenzung in irgendeiner Preisstufe.
Natives PDF-Lesen: BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien direkt und gibt seitenweise Ergebnisse mit Seitenzahl, Format, Wert und Zuversichtswert zurück. Jede PDF-Rendering-Bibliothek, die ausschließlich zur Unterstützung von BarcodeXpress hinzugefügt wurde, kann entfernt werden, wodurch Abhängigkeiten und Lizenzkosten reduziert werden.
Zustandslose Thread-Sicherheit: BarcodeReader.Read und BarcodeWriter.CreateBarcode sind zustandslose statische Methoden. Instanzen-Pools, ThreadLocal-Muster und pro-Thread-Initialisierungsblöcke können alle entfernt werden. Die gleichzeitige Verarbeitung mit Parallel.ForEach erfordert keine strukturellen Änderungen, außer dass die Threading-Umgehungen entfernt werden.
Vereinfachte Containerbereitstellung: Docker- und Kubernetes-Bereitstellungen verwenden eine einzige Umgebungsvariable zur Lizenzkonfiguration. Die Verteilung von Lizenzdateien, die Infrastruktur des Lizenzservers und die Einbindung von Konfigurationsdateien entfallen vollständig.

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.