Migrieren von BarcodeLibzu IronBarcode
Dieser Leitfaden bietet .NET -Entwicklern einen vollständigen Migrationspfad von BarcodeLibzu IronBarcode . Es behandelt die Gründe, warum Teams diesen Übergang vornehmen, den schrittweisen Austausch von Paketen, Code-Migrationsbeispiele für jedes gängige BarcodeLib-Muster, eine vollständige API-Mapping-Referenz und eine strukturierte Checkliste für die Verwaltung der Migration über eine Codebasis hinweg.
Warum von BarcodeLibmigrieren?
Teams, die von BarcodeLibzu IronBarcode migrieren, berichten von folgenden Auslösern:
Keine Lese-API: BarcodeLibhat nie eine Lese- oder Dekodierungsfunktion integriert. Wenn ein Projekt, das Barcode-Bilder generiert hat, die neue Anforderung erhält, auch Barcodes zu scannen – sei es aus hochgeladenen Bildern, von Scannern im Lager oder von Lieferantendokumenten –, kann BarcodeLibdiese Anforderung nicht erfüllen. Die einzige Möglichkeit besteht darin, eine zweite Bibliothek wie ZXing .NET hinzuzufügen, was einen zweiten Abhängigkeitsgraphen und eine zweite API-Oberfläche mit sich bringt, die neben BarcodeLibgepflegt werden müssen.
SkiaSharp Versionskonflikt: BarcodeLib3.x hat SkiaSharp als Grafik-Backend eingeführt, um System.Drawing.Common zu ersetzen. Die Bibliothek ist an einen bestimmten SkiaSharp-Versionsbereich gebunden. In MAUI-Projekten, Blazor -Projekten und allen Projekten, in denen eine andere Abhängigkeit ebenfalls SkiaSharp einbindet, liegt die aufgelöste Version häufig außerhalb des von BarcodeLiberwarteten Bereichs. Dies führt während der Wiederherstellung zu NU1608-Warnungen und im schlimmsten Fall zu Laufzeitfehlern bei der Assemblybindung auf dem Gerät.
Keine PDF-Unterstützung: Anwendungen, die PDF-Dokumente mit eingebetteten Barcodes generieren – Rechnungen, Arbeitsaufträge, Versandmanifeste – müssen diese Barcodes manchmal bei der Weiterverarbeitung wieder einlesen. BarcodeLibgeneriert Barcode-Bilder, bietet aber auf keiner Seite PDF-Unterstützung. Um mit BarcodeLibBarcodes aus einer PDF-Datei zu extrahieren, müssen die PDF-Seiten mit einer separaten PDF-Bibliothek in Bilder umgewandelt und diese Bilder anschließend an eine separate Lesebibliothek übergeben werden.
Stream-Encoding-Schritt für Byte-Array-Ausgabe: BarcodeLib3.x gibt SKImage zurück, was einen SkiaSharp Codec-Schritt in einen MemoryStream erfordert, um die gewünschte byte[]-Ausgabe zu erzeugen, die HTTP-Antworten, Datenbank-BLOB-Spalten und die meisten nachgelagerten Verbraucher tatsächlich benötigen. IronBarcode bietet .ToPngBinaryData() direkt auf der Generationskette an.
Das grundsätzliche Problem
Die auf die reine Generationserkennung ausgerichtete Architektur von BarcodeLibbedeutet, dass das Hinzufügen einer Scanfunktion eine zweite Bibliothek im Stack erfordert:
// BarcodeLib: generation only — reading requires a completely separate library
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
// To read it back, a separate scanning library such as ZXing.Net is required —
// separate API, separate dependency graph to maintain alongside BarcodeLib.Imports BarcodeStandard
Imports SkiaSharp
Dim b = New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100)
Using stream = File.OpenWrite("barcode.png")
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End UsingIronBarcode behandelt beides im selben Paket mit dem gleichen using Statement:
// IronBarcode: generation and reading — no second library needed
using IronBarCode;
// Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng("barcode.png");
// Read back — same package, same namespace
var result = BarcodeReader.Read("barcode.png").First().Value;
Console.WriteLine(result); // "PRODUCT-12345"Imports IronBarCode
' Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.SaveAsPng("barcode.png")
' Read back — same package, same namespace
Dim result = BarcodeReader.Read("barcode.png").First().Value
Console.WriteLine(result) ' "PRODUCT-12345"IronBarcode vs. BarcodeLib: Funktionsvergleich
| Feature | BarcodeLib | IronBarcode |
|---|---|---|
| Barcode-Generierung | Ja | Ja |
| Barcode-Lesen / Scannen | Nein | Ja (BarcodeReader.Read()) |
| QR-Code-Generierung | Nein (nur 1D) | Ja (erweitert, mit Logoeinbettung) |
| PDF-Barcode-Lesen | Nein | Ja (nativ, keine zusätzliche Bibliothek) |
| Ausgabe der PDF-Barcode-Generierung | Nein | Ja |
| SkiaSharp-Abhängigkeit | Ja (Versionskonfliktrisiko) | Nein |
| MAUI-Projektkompatibilität | Konfliktrisiko (NU1608) | Kein Konflikt |
| Fluent verkettbare API | Nein | Ja |
byte[] Ausgabe direkt | Manuell (über MemoryStream) | .ToPngBinaryData() |
| Mehrfach-Barcode-Erkennung | Nein | Ja (ExpectMultipleBarcodes) |
| Lesegeschwindigkeitseinstellung | Nicht anwendbar | Ja (ReadingSpeed Typdeklaration) |
| Linux-/macOS-Unterstützung | Partiell (SkiaSharp-abhängig) | Voll |
| Docker-/Container-Unterstützung | Konfiguration erforderlich | Ja |
| Aktive Wartung | Ja (Community) | Ja (gewerblich) |
| Kommerzieller Support / SLA | Nein | Ja |
| Lizenz | Apache 2.0 (kostenlos) | $999–$5.999 unbefristet |
Schnellstart: Migration von BarcodeLibzu IronBarcode
Mit diesen grundlegenden Schritten kann die Migration sofort beginnen.
Schritt 1: Ersetzen des NuGet-Pakets
Entfernen Sie zuerst das BarcodeLib-Paket:
dotnet remove package BarcodeLib
Wenn Sie nicht sicher sind, wie es referenziert wird, überprüfen Sie die .csproj Datei:
grep -n "BarcodeLib" YourProject.csproj
Entfernen Sie alle BarcodeLib-bezogenen <PackageReference> Einträge. Wenn Sie zusätzliche <PackageReference Include="SkiaSharp"> Überschreibungen hinzugefügt haben, um die NU1608-Warnungen von BarcodeLibzu umgehen, entfernen Sie diese auch — nach der Installation von IronBarcode prüfen Sie, ob SkiaSharp aus anderen Gründen immer noch benötigt wird. Installieren Sie anschließend IronBarcode:
dotnet add package IronBarcode
Schritt 2: Namespaces aktualisieren
Ersetzen Sie die BarcodeLibusing Direktiven in jeder Datei, die auf sie verweist:
// Before
using BarcodeStandard;
using SkiaSharp;
// After
using IronBarCode;Imports IronBarCode
Imports SkiaSharpSchritt 3: Lizenz initialisieren
Hinzufügen der Lizenzinitialisierung beim Start der Anwendung:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Für ASP.NET Core-Anwendungen setzen Sie dies in Program.cs vor builder.Build(). Für Konsolenanwendungen setzen Sie es an den Anfang von Main(). Bei Klassenbibliotheken, die von anderen Anwendungen aufgerufen werden, initialisieren Sie diese dort, wo die Host-Anwendung startet.
Beispiele für die Code-Migration
Grundlegende Code128-Generierung
Das häufigste BarcodeLibMuster: Erstellen Sie eine Instanz, setzen Sie Eigenschaften und rufen Sie Encode() auf.
BarcodeLib-Ansatz:
using BarcodeStandard;
using SkiaSharp;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(Type.Code128, trackingNumber, 400, 120);
using var stream = File.OpenWrite(outputPath);
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
}Imports BarcodeStandard
Imports SkiaSharp
Public Sub GenerateShippingLabel(trackingNumber As String, outputPath As String)
Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(Type.Code128, trackingNumber, 400, 120)
Using stream = File.OpenWrite(outputPath)
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
End SubIronBarcode -Ansatz:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.AddAnnotationTextBelowBarcode(trackingNumber)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateShippingLabel(trackingNumber As String, outputPath As String)
BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.AddAnnotationTextBelowBarcode(trackingNumber) _
.SaveAsPng(outputPath)
End SubDer Eigenschaftssetzerblock zerfällt zu einer fließenden Kette. .AddAnnotationTextBelowBarcode() ersetzt b.IncludeLabel = true — es akzeptiert den Label-String explizit, sodass Sie kontrollieren, welcher Text unter den Balken erscheint. .ResizeTo() ersetzt die Breite/Höhe-Argumente. Für erweiterte Generierungsoptionen siehe die IronBarcode Barcode-Generierungsdokumentation .
Rückgabe eines Byte-Arrays – das gängige Web-API-Muster
BarcodeLib 3.x gibt ein SKImage zurück. Um Bytes daraus zu erhalten, ist eine Kodierung über SkiaSharp in ein MemoryStream erforderlich. IronBarcode bietet .ToPngBinaryData() direkt an.
BarcodeLib-Ansatz:
using BarcodeStandard;
using SkiaSharp;
using System.IO;
public byte[] GetBarcodeBytes(string data)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}Imports BarcodeStandard
Imports SkiaSharp
Imports System.IO
Public Function GetBarcodeBytes(data As String) As Byte()
Dim b As New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return ms.ToArray()
End Using
End FunctionIronBarcode -Ansatz:
using IronBarCode;
public byte[] GetBarcodeBytes(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
}Imports IronBarCode
Public Function GetBarcodeBytes(data As String) As Byte()
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.ToPngBinaryData()
End FunctionDer MemoryStream Zwischenschritt entfällt. .ToPngBinaryData() gibt das byte[] direkt zurück, was HTTP-Antwortkörper, Datenbank-BLOB-Spalten und Dateischreiber tatsächlich benötigen.
Web-API-Controller-Aktion
BarcodeLib-Ansatz:
using BarcodeStandard;
using SkiaSharp;
using Microsoft.AspNetCore.Mvc;
using System.IO;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, sku, 400, 120);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return File(ms.ToArray(), "image/png");
}
}Imports BarcodeStandard
Imports SkiaSharp
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
<ApiController>
<Route("api/labels")>
Public Class LabelsController
Inherits ControllerBase
<HttpGet("{sku}")>
Public Function GetLabel(sku As String) As IActionResult
Dim b As New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, sku, 400, 120)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return File(ms.ToArray(), "image/png")
End Using
End Function
End ClassIronBarcode -Ansatz:
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
byte[] pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.ToPngBinaryData();
return File(pngBytes, "image/png");
}
}Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/labels")>
Public Class LabelsController
Inherits ControllerBase
<HttpGet("{sku}")>
Public Function GetLabel(sku As String) As IActionResult
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.ToPngBinaryData()
Return File(pngBytes, "image/png")
End Function
End ClassDie Controller-Aktion verkürzt sich durch Entfernen des MemoryStream Blocks und des SkiaSharp Encoding-Schritts. Das Byte-Array fließt direkt von .ToPngBinaryData() in File().
QR-Code-Generierung
BarcodeLib 3.x generiert keine QR-Codes — der BarcodeStandard.Type Typdeklaration enthält keine 2D-Einträge. Projekte, die QR zusammen mit BarcodeLibbenötigten, fügten typischerweise eine zweite Bibliothek wie QRCoder hinzu. IronBarcode verwendet eine spezielle QRCodeWriter Klasse mit zusätzlichen Optionen für das Einbetten von Logos und Styling.
BarcodeLib-Ansatz:
// BarcodeLibhas no QR Code (or any 2D) support.
// Generating a QR code from a BarcodeLibproject required adding a
// second library such as QRCoder:
//
// using QRCoder;
// var qrGen = new QRCodeGenerator();
// var data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q);
// // ... separate API, separate dependency to maintain.
IronBarcode -Ansatz:
using IronBarCode;
// Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.SaveAsPng("qr.png");
// QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");Imports IronBarCode
' Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300) _
.SaveAsPng("qr.png")
' QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")QRCodeWriter.CreateQrCode() nimmt die Datenzeichenfolge und die Pixelgröße als Parameter an. Logoeinbettung, Farbanpassung und Fehlerkorrekturstufe sind alle über verkettete Methoden möglich. Informationen zu den Gestaltungsmöglichkeiten für QR-Codes finden Sie in der IronBarcode QR-Code-Dokumentation .
EAN-13 und UPC-A
Diese sind in Warenwirtschaftssystemen im Einzelhandel üblich. Die Enum-Namen ändern sich, aber die Werte sind direkt äquivalent.
BarcodeLib-Ansatz:
using BarcodeStandard;
using SkiaSharp;
// EAN-13 product barcode
var b = new Barcode();
SKImage ean = b.Encode(Type.Ean13, "5901234123457", 250, 100);
using (var s = File.OpenWrite("product-ean.png"))
ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
// UPC-A for US retail
SKImage upc = b.Encode(Type.UpcA, "012345678905", 250, 100);
using (var s = File.OpenWrite("product-upc.png"))
upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);Imports BarcodeStandard
Imports SkiaSharp
Imports System.IO
' EAN-13 product barcode
Dim b As New Barcode()
Dim ean As SKImage = b.Encode(Type.Ean13, "5901234123457", 250, 100)
Using s = File.OpenWrite("product-ean.png")
ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s)
End Using
' UPC-A for US retail
Dim upc As SKImage = b.Encode(Type.UpcA, "012345678905", 250, 100)
Using s = File.OpenWrite("product-upc.png")
upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s)
End UsingIronBarcode -Ansatz:
using IronBarCode;
// EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.ResizeTo(250, 100)
.SaveAsPng("product-ean.png");
// UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA)
.ResizeTo(250, 100)
.SaveAsPng("product-upc.png");Imports IronBarCode
' EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
.ResizeTo(250, 100) _
.SaveAsPng("product-ean.png")
' UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA) _
.ResizeTo(250, 100) _
.SaveAsPng("product-upc.png")Hinzufügen der Barcode-Lesung (neue Funktion)
BarcodeLib besitzt keine Lese-API. Wenn Ihre Migration durch eine neue Anforderung zum Scannen von Barcodes – von hochgeladenen Bildern, Lagerscannern oder gescannten PDF-Dokumenten – bedingt ist, fügen Sie dies ohne eine zweite Bibliothek hinzu:
BarcodeLib-Ansatz:
// BarcodeLib— no reading API exists
// Adding reading requires a separate library such as ZXing.Net:
// dotnet add package ZXing.Net
// using ZXing;
// var reader = new BarcodeReader();
// // ... separate API, separate dependency graph to manage
IronBarcode -Ansatz:
using IronBarCode;
// Read a barcode from an image file
var results = BarcodeReader.Read("incoming-label.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read all barcodes from a multi-page PDF — no PDF library required
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Configure for high-volume scanning with multiple barcodes per image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var warehouseResults = BarcodeReader.Read("dock-scan.png", options);Imports IronBarCode
' Read a barcode from an image file
Dim results = BarcodeReader.Read("incoming-label.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Format: {result.Format}")
Next
' Read all barcodes from a multi-page PDF — no PDF library required
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
' Configure for high-volume scanning with multiple barcodes per image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim warehouseResults = BarcodeReader.Read("dock-scan.png", options)BarcodeReader.Read() akzeptiert Bilddateien, PDF-Dateien, Streams und System.Drawing.Bitmap Objekte. Die ReadingSpeed Typdeklaration ermöglicht es Ihnen, bei großen Mengen den Grad der Gründlichkeit gegen die Leistung auszutauschen. Informationen zu den Konfigurationsoptionen finden Sie in der IronBarcode -Lesedokumentation .
Lösung des SkiaSharp-Konflikts
Falls Ihre Migration durch NU1608-Warnungen ausgelöst wird, überprüfen Sie, ob der Konflikt nach dem Paketwechsel behoben ist. Nach dem Ausführen von dotnet remove package BarcodeLib und dotnet add package IronBarcode, neu bauen und die Ausgabe prüfen:
dotnet build 2>&1 | grep -i "NU1608\|SkiaSharp"
Wenn keine Ausgabe erfolgt, ist der Konflikt gelöst. Falls SkiaSharp-Warnungen weiterhin angezeigt werden, stammen sie von einem anderen Paket in Ihrem Abhängigkeitsdiagramm – IronBarcode ist nicht die Quelle.
BarcodeLib-Ansatz:
<!-- Before — explicit overrides needed to pacify BarcodeLib-->
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<!-- Override required because MAUI converges on a newer SkiaSharp -->
<PackageReference Include="SkiaSharp" Version="3.116.1" />
</ItemGroup>
IronBarcode -Ansatz:
<!-- After — clean, no conflict -->
<ItemGroup>
<PackageReference Include="IronBarcode" Version="*" />
<!-- SkiaSharp version is now only determined by MAUI's requirements -->
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
BarcodeLib-API-zu- IronBarcode -Mapping-Referenz
| BarcodeLib | IronBarcode |
|---|---|
new Barcode() | Statische API – keine Instanz erforderlich |
b.Encode(Type.Code128, "data", w, h) | BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
b.IncludeLabel = true | .AddAnnotationTextBelowBarcode("text") |
Breite/Höhe an Encode() übergeben | .ResizeTo(width, height) |
Gibt SKImage zurück | .SaveAsPng(path) / .ToPngBinaryData() |
Type.Code128 | BarcodeEncoding.Code128 |
Type.Code39 | BarcodeEncoding.Code39 |
Type.Ean13 | BarcodeEncoding.EAN13 |
Type.UpcA | BarcodeEncoding.UPCA |
| Kein QR-Support (nur 1D) | BarcodeEncoding.QRCode (auch QRCodeWriter) |
Type.Itf14 | BarcodeEncoding.ITF14 |
Type.Codabar | BarcodeEncoding.Codabar |
| Keine Lese-API | BarcodeReader.Read(path) |
| SkiaSharp-Versionskonflikt in MAUI | Keine widersprüchlichen Abhängigkeiten |
img.Encode(...).SaveTo(stream) | .SaveAsPng(path) |
MemoryStream + SkiaSharp Kodierung | .ToPngBinaryData() |
Gängige Migrationsprobleme und Lösungen
Problem 1: Typ-Enum-Namensraumänderung
BarcodeLib 3.x: Verwendet BarcodeStandard.Type.Code128 (PascalCase, im BarcodeStandard Namensraum). Älterer 2.x Code kann BarcodeLib.TYPE.CODE128 verwenden (Großbuchstaben-Konstanten, BarcodeLib Namensraum) - beide Formen treten in echten Codebasen während der Migration auf.
Lösung: Ersetzen Sie durch BarcodeEncoding.Code128. Ein grep über .cs Dateien identifiziert alle Vorkommen:
grep -rn "Type\.\|TYPE\." --include="*.cs" .
Häufige Ersetzungen: Type.Code128 / TYPE.CODE128 → BarcodeEncoding.Code128, Type.Ean13 / TYPE.EAN13 → BarcodeEncoding.EAN13, Type.UpcA / TYPE.UPCA → BarcodeEncoding.UPCA, Type.Itf14 / TYPE.ITF14 → BarcodeEncoding.ITF14, Type.Codabar / TYPE.CO/DABAR → BarcodeEncoding.Codabar. BarcodeLibhat keinen QR-Eintrag; Jeder TYPE.QR_Code ist toter Code aus einer 2.x Version oder einem Fork - ersetzen Sie durch BarcodeEncoding.QRCode (oder verwenden Sie QRCodeWriter für gestylte Ausgabe).
Problem 2: SKImage / Rückgabetyp Bild
BarcodeLib: b.Encode() gibt in 3.x SKImage und in 2.x System.Drawing.Image zurück. Kein Typ wird mit IronBarcode kompilieren.
Lösung: Entfernen Sie die Zwischenspeicherbildvariable und ersetzen Sie die Speichertenderlogik durch die geeignete Terminalmethode in der fließenden Kette:
// Before (BarcodeLib 3.x)
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
// After
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();Imports System.IO
' Before (BarcodeLib 3.x)
Dim img As SKImage = b.Encode(Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return ms.ToArray()
End Using
' After
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.ToPngBinaryData()Suchen Sie nach SKImage img = b.Encode und Image img = b.Encode Mustern, um alle betroffenen Orte zu finden.
Problem 3: Breiten- und Höhenparameter
BarcodeLib: Breite und Höhe sind Positionsargumente bei Encode(Type, string, int, int) in 3.x, und separate b.Width / b.Height Eigenschaftszuweisungen im älteren 2.x Code. Jede Form muss portiert werden.
Lösung: Die Breite/Höhe wird zu einem einzelnen .ResizeTo(width, height) Aufruf, der nach CreateBarcode() verkettet wird. Finden Sie die Aufrufstellen:
# Find Encode() calls and any Width/Height property assignments
grep -n "\.Encode(\|\.Width = \|\.Height = " --include="*.cs" -r .
Ersetzen Sie dann die Größenargumente oder das Eigenschaftspaar durch einen einzigen .ResizeTo(width, height) Kettenaufruf.
Ausgabe 4: Boolescher Schalter für IncludeLabel
BarcodeLib: b.IncludeLabel = true ist ein boolescher Wert, der die kodierte Datenzeichenfolge automatisch als sichtbaren Text unter den Balken rendert.
Lösung: Verwenden Sie .AddAnnotationTextBelowBarcode("text"), das den Label-String explizit entgegennimmt. In den meisten Fällen wird dieselbe Datenzeichenfolge übergeben, die im Barcode kodiert wurde. Wenn der Originalcode IncludeLabel = true verwendet hat und sich darauf verlassen hat, dass BarcodeLibdie Daten automatisch als Label rendert, übergeben Sie diese gleiche Datenzeichenfolge ausdrücklich:
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.AddAnnotationTextBelowBarcode(data) // pass the same string
.SaveAsPng(outputPath);Dim barcodeWriter = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
barcodeWriter.AddAnnotationTextBelowBarcode(data) ' pass the same string
barcodeWriter.SaveAsPng(outputPath)Problem 5: Nach der Entfernung von BarcodeLibverbliebene SkiaSharp-Referenzen
BarcodeLib: Projekte häufen häufig explizite <PackageReference Include="SkiaSharp"> Einträge an, um die Versionsbeschränkung von BarcodeLibzu überschreiben. Diese werden nach der Entfernung von BarcodeLibzu verwaisten Daten.
Lösung: Nach dem Wechsel zu IronBarcode überprüfen Sie, ob SkiaSharp noch von anderen Paketen benötigt wird, bevor Sie den expliziten Verweis entfernen:
# Check if SkiaSharp is still referenced by anything other than the explicit override
dotnet list package --include-transitive 2>&1 | grep -i skia
Wenn SkiaSharp nur aufgrund der nun entfernten expliziten <PackageReference> erscheint, entfernen Sie diesen Eintrag. Falls es noch von MAUI oder einer anderen Abhängigkeit eingebunden wird, lassen Sie es so – IronBarcode wird damit nicht in Konflikt geraten.
BarcodeLib-Migrationscheckliste
Vor der Migration anfallende Aufgaben
Führen Sie diese Recherchen durch, bevor Sie beginnen, um den Umfang der erforderlichen Änderungen zu verstehen:
# Find all BarcodeLibusing directives (both 3.x BarcodeStandard and older BarcodeLib)
grep -rn "using BarcodeStandard\|using BarcodeLib" --include="*.cs" .
# Find Barcode object instantiation
grep -rn "new Barcode()" --include="*.cs" .
# Find Encode calls
grep -rn "\.Encode(" --include="*.cs" .
# Find Type enum usage (3.x PascalCase and 2.x uppercase)
grep -rn "Type\.Code128\|Type\.Ean13\|Type\.UpcA\|TYPE\.CODE128\|TYPE\.EAN13\|TYPE\.UPCA" --include="*.cs" .
# Find IncludeLabel usage
grep -rn "IncludeLabel" --include="*.cs" .
# Find the package references in project files
grep -rn "BarcodeLib" --include="*.csproj" .
# Find NU1608 evidence in lock files
grep -rn "NU1608" .
Dokumentieren Sie alle von jeder Suche betroffenen Dateien. Beachten Sie, welche Projekte direkt auf BarcodeLibverweisen und welche es transitiv erben. Identifizieren Sie alle expliziten SkiaSharp-Versionsüberschreibungen, die ausschließlich zur Behebung von BarcodeLib-Konflikten hinzugefügt wurden.
Aufgaben der Code-Aktualisierung
- Führen Sie
dotnet remove package BarcodeLibfür jedes Projekt aus - Entfernen Sie alle expliziten SkiaSharp-Versionsüberschreibungsverweise, die nur zur Behebung von BarcodeLib-Konflikten hinzugefügt wurden.
- Führen Sie
dotnet add package IronBarcodefür jedes Projekt aus - Fügen Sie
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";zum Anwendungsstart in jedem Projekt hinzu - Ersetzen Sie
using BarcodeStandard;(oderusing BarcodeLib;im älteren Code) undusing SkiaSharp;mitusing IronBarCode;in allen.csDateien - Entfernen Sie
using System.Drawing.Imaging;Importe, die vom @2.xImageFormat.PngGebrauch übrig geblieben sind - Ersetzen Sie
new Barcode()+Encode()Aufrufe durchBarcodeWriter.CreateBarcode()fluente Ketten - Ersetzen Sie
Type.Code128/TYPE.CODE128→BarcodeEncoding.Code128und alle anderen Enum-Werte - Ersetzen Sie Breite/Höhe Argumente (oder 2.x
b.Width = N; b.Height = M;) with.ResizeTo(N, M)Kettenaufrufe - Ersetzen Sie
b.IncludeLabel = true;mit.AddAnnotationTextBelowBarcode(data) - Ersetzen Sie
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(...)mit.SaveAsPng(path)oder.ToPngBinaryData() - Entfernen Sie Zwischenvariablen
SKImage/ImageundMemoryStreamBlöcke, wobei.ToPngBinaryData()sie ersetzt - Fügen Sie Barcodelesecode hinzu, wo benötigt (
BarcodeReader.Read())
Post-Migrationstests
- Erstellen Sie das Projekt und bestätigen Sie, dass im Wiederherstellungsergebnis keine NU1608-Warnungen mehr vorhanden sind.
- Führen Sie
dotnet build 2>&1aus | grep -i "NU1608|SkiaSharp"`, um zu überprüfen, ob der SkiaSharp-Konflikt vollständig behoben ist. - Vergleichen Sie die visuelle Ausgabe der generierten Barcodes mit bekannten, korrekten Beispielen aus BarcodeLib.
- Verifizieren Sie, dass QR-Codes korrekt dekodieren mit einem mobilen Scanner oder der
BarcodeReader.Read()Methode - Gegebenenfalls EAN-13- und UPC-A-Barcodes mit der Scannerhardware im Einzelhandel testen.
- Überprüfen, ob die Bilder in allen Ausgabezielen korrekt angezeigt werden: Dateisystem, HTTP-Antwort, Datenbankspeicher
- Testen Sie alle PDF-Barcodelese-Szenarien mit
BarcodeReader.Read("file.pdf")an echten Dokumenten - Sicherstellen, dass plattformübergreifende Builds erfolgreich sind, wenn das Projekt Linux oder macOS als Zielplattform hat.
- Überprüfen Sie, ob MAUI-Builds auf Android- und iOS-Zielen ohne SkiaSharp-Bindungsfehler abgeschlossen werden.
Wichtigste Vorteile der Migration zu IronBarcode
Barcode-Lesen ohne zweite Bibliothek: Der größte unmittelbare Vorteil für Teams, die eine Lesefunktion benötigen, besteht darin, die Abhängigkeit von einer zweiten Bibliothek zu beseitigen. BarcodeReader.Read() befindet sich im selben Paket, verwendet die gleiche using IronBarCode; Anweisung und erfordert keine zusätzlichen NuGet-Installationen. ZXing .NET und sein eigener Abhängigkeitsgraph sind nicht mehr Teil des Projekts.
Kein SkiaSharp-Versionskonflikt: IronBarcode teilt den SkiaSharp-Abhängigkeitsgraphen nicht mit dem Anwendungscode. Bei MAUI-Projekten, Blazor -Projekten und allen Projekten, bei denen mehrere Pakete auf SkiaSharp zusammenlaufen, kann IronBarcode ohne NU1608-Warnungen oder Laufzeitbindungsfehler installiert werden. Die von BarcodeLibeingeführte Versionsverhandlung gibt es nicht mehr.
Direkte Byte-Array-Ausgabe: .ToPngBinaryData() gibt byte[] am Ende der Fluent-Kette zurück. Der MemoryStream Zwischenbereich, den BarcodeLibfür die Byte-Array-Ausgabe erforderte, wird aus allen Controller-Aktionen, Servicemethoden und API-Handlern entfernt, die Barcodes erzeugen.
PDF Barcode-Verarbeitung: BarcodeReader.Read() akzeptiert PDF-Dateien nativ. Anwendungen, die PDF-Dokumente mit eingebetteten Barcodes erzeugen, können diese Barcodes ohne separate PDF-Rendering-Bibliothek wieder einlesen. Die gesamte Kette – Generierung, PDF-Einbettung und Lesen – wird innerhalb von IronBarcode abgewickelt.
Kommerzieller Support und SLA: IronBarcode wird vom kommerziellen Support-Modell von Iron Software unterstützt, mit einem definierten Update-Takt. Wenn neue .NET-Versionen erscheinen oder es in der .NET-Umgebung zu kritischen Änderungen kommt, veröffentlicht IronBarcode Kompatibilitätsaktualisierungen auf einer Zeitachse, die an die kommerzielle SLA gebunden ist, anstatt an die Verfügbarkeit der Community.
QR-Code-Erzeugung ohne zweite Bibliothek: QRCodeWriter unterstützt Logo-Einbettung, Farbanpassung und Konfiguration des Fehlerkorrekturgrades durch verkettete Methoden. BarcodeLib3.x erzeugt nur 1D-Symbologien — Projekte, die QR zusammen mit BarcodeLibbenötigten, fügten typischerweise eine zweite Bibliothek wie QRCoder hinzu. Teams, deren QR-Code-Anforderungen gewachsen sind, erhalten diese Funktionen im gleichen Paket ohne Änderung ihres Erzeugungsablaufs.

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.