Jak wyprowadzać formaty danych kodów kreskowych w C# | IronBarcode
Migrating from Neodynamic Barcode to IronBarcode
Ten przewodnik zapewnia kompletną ścieżkę migracji z Neodynamic.SDK.Barcode i Neodynamic.SDK.BarcodeReader do IronBarcode. Obejmuje to usunięcie obu pakietów Neodynamic, zastąpienie konfiguracji podwójnej licencji jednym kluczem, tłumaczenie wywołań API generowania i odczytu oraz proces uzyskania możliwości odczytu kodów kreskowych 2D, co nie było możliwe w przypadku zestawu produktów Neodynamic. Przewodnik jest przeznaczony dla programistów, którzy posiadają istniejący kod Neodynamic i potrzebują systematycznego, plik po pliku podejścia do przeprowadzenia migracji.
Dlaczego warto przejść z Neodynamic BarCode
2D Reading Gap: Neodynamic BarCode Professional SDK generuje kody kreskowe QR, DataMatrix, PDF417 i Aztec. Żaden z tych formatów nie może być odczytany przez towarzyszący mu zestaw SDK BarCode Reader. Projekt, który generuje kody QR na etykiety produktów, kontenery transportowe lub śledzenie dokumentów, nie może odczytać tych samych kodów za pomocą czytnika zakupionego wraz z generatorem.IronBarcode odczytuje i generuje kody QR, DataMatrix, PDF417, Aztec oraz wszystkie inne obsługiwane formaty 2D za pośrednictwem tej samej biblioteki IronBarcode i tej samej licencji.
Podwójne obciążenie produktów: Każdy projekt, który używa obu SDK Neodynamic, niesie ze sobą dwa PackageReference wpisy, dwie dyrektywy using, dwa bloki licencjonowania i dwa oddzielne cykle aktualizacji. Nakład pracy powtarza się na każdym komputerze programisty, w każdym potoku CI i w każdym środowisku produkcyjnym. Wynikiem tej migracji jest połączenie dwóch pakietów o odrębnych wymaganiach konserwacyjnych w jedną zależność z jedną licencją.
Problem trzeciej biblioteki: zespoły, które napotkały lukę w odczycie 2D i zdecydowały się ją obejść zamiast przeprowadzać migrację, zazwyczaj dodawały trzecią bibliotekę — najczęściej wybierano ZXing.Net — specjalnie w celu obsługi odczytu kodów QR. Decyzja ta zamienia jedno ograniczenie na inną złożoność: trzy zależności związane z kodami kreskowymi, z których każda ma własne ograniczenia dotyczące wersji, własne informacje o wydaniu oraz własny potencjał konfliktów w przypadku aktualizacji środowiska uruchomieniowego .NET lub zależnego frameworka.IronBarcode zastępuje wszystkie trzy.
Złożoność cenowa: Neodynamic BarCode Professional SDK jest cenowo licencjonowany na dewelopera (Basic od około 352 USD, Ultimate od około 705 USD przez ComponentSource). SDK Barcode Reader ma osobny koszt. Projekt, który potrzebuje zarówno generowania, jak i odczytu 1D, musi zakupić oba, a łączny koszt rośnie z wielkością zespołu oprócz opłaty za Reader. Projekt, który wymaga odczytu 2D, wciąż nie może spełnić tego wymagania w żadnej cenie w ramach produktów Neodynamic.IronBarcode Lite obejmuje generowanie i odczytywanie — 1D i 2D — pod pojedynczą licencją. Aktualne ceny są na stronie licencyjnej IronBarcode.
Podstawowy problem
Głównym problemem w każdym kodzie źródłowym, który wykorzystywał oba zestawy SDK firmy Neodynamic do obsługi pełnego przepływu pracy związanego z kodami barcode, było to, że odczyt kodów QR nigdy nie był możliwy:
// Before: Neodynamic BarCode Reader 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 Reader 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
Po migracji do IronBarcode ta sama operacja staje się standardowym wywołaniem odczytu bez obsługi specyficznej dla formatu:
// 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
Każdy throw new NotSupportedException(...) placeholder w bazie kodu, która odwołuje się do odczytu kodów kreskowych 2D, jest usuwany podczas tej migracji i zastępowany działającym wywołaniem odczytu.
IronBarcode a Neodynamic BarCode: porównanie funkcji
| Funkcja | Neodynamic BarCode Professional | Neodynamic BarCode Reader | IronBarcode |
|---|---|---|---|
| Generowanie kodów 128, EAN-13, UPC-A | Tak | Nie dotyczy | Tak |
| Generowanie kodów QR, DataMatrix, PDF417 | Tak | Nie dotyczy | Tak |
| Odczytywanie kodów kreskowych 1D | Nie dotyczy | Tak | Tak |
| Odczytywanie kodów QR | Nie dotyczy | Nie | Tak |
| Odczyt DataMatrix | Nie dotyczy | Nie | Tak |
| Odczyt PDF417 | Nie dotyczy | Nie | Tak |
| Natywny odczyt BARCODE z plików PDF | Nie | Nie | Tak |
| Automatyczne wykrywanie formatu | Nie dotyczy | Nie | Tak |
| Wymagane pakiety NuGet | 1 | 1 | 1 (obejmuje oba) |
| Wymagane klucze licencyjne | 1 | 1 (osobno) | 1 (obejmuje wszystko) |
| Zależność od System.Drawing | Tak | Tak | Nie |
| Obsługa systemu Linux / Docker | Ograniczone | Ograniczone | Tak |
| Obsługa .NET 8 / .NET 9 | Tak | Ograniczone | Tak |
| Asynchroniczne odczytywanie partii danych | Nie | Nie | Tak |
Szybki start: Migracja z Neodynamic BarCode do IronBarcode
Krok 1: Usuń oba pakiety Neodynamic
Oba pakiety muszą zostać usunięte. Nie mają one wspólnych zależności, które miałyby wpływ na kolejność usuwania:
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
Zweryfikuj, czy oba wpisy zostały usunięte z pliku .csproj przed kontynuowaniem.
Krok 2: Dodaj IronBarcode
dotnet add package IronBarcode
dotnet add package IronBarcode
Krok 3: Zastąp konfigurację podwójnej licencji
Usuń oba bloki licencji Neodynamic i zastąp je jednym przypisaniem klucza IronBarcode. To przypisanie wykonywane jest raz podczas uruchamiania aplikacji — w Program.cs, Startup.cs lub w komponencie głównym aplikacji:
// 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"
Wszelkie pliki konfiguracyjne, zmienne środowiskowe lub magazyny kluczy, w których przechowywane są klucze licencyjne Neodynamic, można wycofać z użytku po zweryfikowaniu migracji.
Przykłady migracji kodu
Generowanie kodu kreskowego Code 128 BarCode
Podejście Neodynamic:
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
Podejście IronBarcode:
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
Import System.Drawing.Imaging nie jest już wymagany. Instancja BarcodeInfo i jej przypisania właściwości łączą się w jedno wywołanie metody. Opcje dotyczące rozmiaru, adnotacji i formatu wyjściowego można znaleźć w przewodniku dotyczącym tworzenia kodów kreskowych 1D.
Generowanie kodu QR
Podejście Neodynamic:
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
Podejście IronBarcode:
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
Tłumaczenie generowane zmienia jedynie powierzchnię API. Kluczową zmianą wprowadzoną przez tę migrację jest to, że ta sama aplikacja może teraz odczytywać generowane przez siebie kody QR, korzystając z tej samej biblioteki IronBarcode i tej samej licencji. Pełne omówienie tworzenia kodów kreskowych 2D znajduje się w przewodniku dotyczącym tworzenia kodów kreskowych 2D.
Odczytywanie BarCodes 1D
Podejście Neodynamic:
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
Podejście IronBarcode:
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
Konstrukcja Bitmap i import System.Drawing są usuwane.IronBarcode akceptuje bezpośrednio ścieżkę do pliku. Nazwa właściwości result.Value jest taka sama w obu API, więc kod downstream przetwarzający wartości zwracane nie ulega zmianom. Aby zapoznać się z opcjami odczytu i wstępnego przetwarzania obrazów zawierających wiele kodów kreskowych, zapoznaj się z przewodnikiem dotyczącym odczytu kodów kreskowych z obrazów.
Odczytywanie kodów QR (wcześniej niemożliwe)
Podejście Neodynamic:
// 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
Podejście IronBarcode:
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
Każdy placeholder throw new NotSupportedException(...), który odnosi się do odczytu kodów kreskowych 2D, staje się standardowym wywołaniem odczytu. Treść metody zmienia się z rzucanego wyjątku na działającą implementację. Nie jest wymagane żadne specjalne traktowanie kodów QR;IronBarcode automatycznie rozpoznaje format.
Odczytywanie BarCodes z dokumentów PDF (nowa funkcja)
Podejście Neodynamic:
// Neodynamic Reader cannot read barcodes from PDF files directly
// An image extraction step using a separate library was required before reading
// Nie direct equivalent exists
// Neodynamic Reader cannot read barcodes from PDF files directly
// An image extraction step using a separate library was required before reading
// Nie direct equivalent exists
' Neodynamic Reader cannot read barcodes from PDF files directly
' An image extraction step using a separate library was required before reading
' Nie direct equivalent exists
Podejście IronBarcode:
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 odczytuje kody kreskowe bezpośrednio z dokumentów PDF na wszystkich stronach. W wyniku zwracany jest numer strony, na której znaleziono każdy BARCODE. Ta funkcja nie wymaga żadnej dodatkowej biblioteki ani pośredniego etapu wyodrębniania obrazu.
Dokumentacja API Neodynamic Barcode do IronBarcode
| API Neodynamic | Odpowiednik IronBarcode | Uwagi |
|---|---|---|
BarcodeInfo.LicenseOwner = "..." |
IronBarCode.License.LicenseKey = "key" |
Połączono w jeden klucz |
BarcodeInfo.LicenseKey = "..." |
(part of single key above) | Brak oddzielnego pola właściciela |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner |
(removed) | Nie jest wymagane |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey |
(removed) | Nie jest wymagane |
new BarcodeInfo() |
BarcodeWriter.CreateBarcode(data, encoding) |
Statyczne, bez instancji |
barcode.Value = data |
Pierwszy parametr CreateBarcode |
Zaliczone na etapie tworzenia |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.Code128 |
Drugi parametr |
barcode.Symbology = Symbology.QRCode |
BarcodeEncoding.QRCode |
Obsługa pełnego cyklu (round-trip) jest teraz dostępna |
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H |
QRCodeWriter.QrErrorCorrectionLevel.Highest |
Różne punkty wejścia do klas |
barcode.GetImage().Save(path, ImageFormat.Png) |
.SaveAsPng(path) |
Płynny, bez wyliczenia ImageFormat |
BarcodeReader.Read(bitmap) |
BarcodeReader.Read(imagePath) |
Ścieżka do pliku zastępuje bitmapę |
result.Value |
result.Value |
Ta sama nazwa właściwości |
Symbology.DataMatrix |
BarcodeEncoding.DataMatrix |
Tylko generowanie → generowanie i odczyt |
throw new NotSupportedException(...) do odczytu 2D |
BarcodeReader.Read(imagePath) |
Zastąp działającą implementacją |
Typowe problemy związane z migracją i ich rozwiązania
Problem 1: Kolejność usuwania dwóch pakietów
Problem: Usunięcie przez programistów tylko jednego pakietu Neodynamic i pozostawienie drugiego powoduje błędy kompilacji, ponieważ te dwa zestawy SDK nie mają wspólnych typów, ale niektóre pliki źródłowe mogą importować obie przestrzenie nazw w tym samym pliku.
Rozwiązanie: Usuń oba pakiety przed wprowadzeniem jakichkolwiek zmian w kodzie źródłowym. Po usunięciu obu, przeszukaj wszystkie dyrektywy using Neodynamic.SDK.Barcode i using Neodynamic.SDK.BarcodeReader i usuń je razem:
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
Następnie sprawdź za pomocą:
grep -r "Neodynamic.SDK" --include="*.cs" .
grep -r "Neodynamic.SDK" --include="*.cs" .
Problem 2: Uporządkowanie konfiguracji podwójnej licencji
Problem: Dwa bloki licencji Neodynamic często pojawiają się w różnych lokalizacjach — jeden w klasie startowej aplikacji, a drugi w inicjatorze usług. Jeśli usunie się tylko jeden blok, pozostały kod odwołuje się do przestrzeni nazw, która już nie istnieje, i nie da się go skompilować.
Rozwiązanie: Wyszukaj wszystkie cztery przypisania właściwości licencji Neodynamic i usuń je razem przed dodaniem klucza IronBarcode:
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" .
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" .
Zastąp wszystkie cztery wiersze jednym zadaniem:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Problem 3: Usunięcie wyjątku NotSupportedException z bloków Catch
Problem: Niektóre bazy kodu, które używały Neodynamic Reader, dodawały bloki catch (NotSupportedException) specyficznie w celu obsługi cichej awarii odczytu kodów kreskowych 2D. Te bloki catch muszą zostać usunięte wraz z kodem wywołującym wyjątek; w przeciwnym razie klauzula catch odnosi się do ścieżki kodu, która nie może się już zdarzyć.
Rozwiązanie: Wyszukaj NotSupportedException w plikach związanych z kodami kreskowymi i przeanalizuj każde wystąpienie. Jeśli wyjątek został zgłoszony w odpowiedzi na próbę odczytu formatu 2D, usuń zarówno instrukcję throw, jak i catch:
grep -r "NotSupportedException" --include="*.cs" .
grep -r "NotSupportedException" --include="*.cs" .
Zastąp ciało metody wyrzucającej BarcodeReader.Read(imagePath) i usuń odpowiadającą klauzulę catch od każdego wywołującego.
Lista kontrolna migracji BarCode Neodynamic
Przed migracją
- Wyszukaj wszystkie odniesienia do paczek Neodynamic:
grep -r "Neodynamic.SDK" --include="*.csproj" . - Wyszukaj wszystkie dyrektywy using Neodynamic:
grep -r "using Neodynamic" --include="*.cs" . - Wyszukiwanie lokalizacji konfiguracji licencji:
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" . - Wyszukaj wszystkie miejsca tworzenia instancji
BarcodeInfo:grep -r "new BarcodeInfo\(\)" --include="*.cs" . - Wyszukaj wszystkie wywołania odczytu Neodynamic:
grep -r "BarcodeReader.Read" --include="*.cs" . - Wyszukaj wszystkie użycia
NotSupportedExceptionw ścieżkach kodów kreskowych:grep -r "NotSupportedException" --include="*.cs" . - Zidentyfikuj wszelkie biblioteki stron trzecich (ZXing.Net lub podobne), które zostały dodane specjalnie w celu wypełnienia luki w odczycie 2D — można je usunąć po migracji
- Zapisz wszystkie klucze licencyjne Neodynamic, aby po weryfikacji można je było usunąć z magazynów sekretów
Zadania związane z aktualizacją kodu
- Uruchom
dotnet remove package Neodynamic.SDK.Barcode - Uruchom
dotnet remove package Neodynamic.SDK.BarcodeReader - Uruchom
dotnet add package IronBarcode - Usuń wszystkie dyrektywy
using Neodynamic.SDK.Barcodeiusing Neodynamic.SDK.BarcodeReader - Dodaj
using IronBarCodewe wszystkich plikach, które wykonują operacje na kodach kreskowych - Usuń oba bloki konfiguracji licencji Neodynamic
- Dodaj
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"raz podczas uruchamiania aplikacji - Zastąp
new BarcodeInfo()+ przypisania właściwości +barcode.GetImage().Save(...)za pomocąBarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path) - Zastąp wzorce
QRCodeWriterodpowiednio używającQRCodeWriter.CreateQrCode() - Zastąp wywołania
BarcodeReader.Read(bitmap)przez usunięcie konstrukcjinew Bitmap(imagePath)i przekazanie ścieżki do pliku bezpośrednio doBarcodeReader.Read(imagePath) - Usuń wszystkie placeholdery
throw new NotSupportedException(...)dla odczytu 2D i zastąpBarcodeReader.Read(imagePath) - Usuń odpowiadające bloki
catch (NotSupportedException)od wywołujących - Usuń wszelkie biblioteki stron trzecich, które zostały dodane wyłącznie w celu wypełnienia luki w odczycie Neodynamic 2D
Testy po migracji
- Sprawdź, czy generowanie BarCode'ów Code 128 daje wyniki zgodne z poprzednimi wymiarami i ustawieniami DPI
- Sprawdź, czy generowanie kodów QR zapewnia wynik nadający się do skanowania
- Sprawdź, czy odczyt BarCodes 1D zwraca te same wartości, co poprzednia implementacja Neodynamic Reader
- Zweryfikuj, czy odczyt kodu QR kończy się powodzeniem na obrazach, które wcześniej wyrzucały
NotSupportedException - Sprawdź, czy odczyt kodów DataMatrix i PDF417 przebiega pomyślnie, jeśli formaty te pojawiają się w danych wejściowych aplikacji
- Sprawdź odczyt BarCodes w plikach PDF, jeśli aplikacja przetwarza dokumenty PDF
- Sprawdź, czy wszystkie odniesienia do kluczy licencyjnych Neodynamic zostały usunięte z plików konfiguracyjnych i zmiennych środowiskowych
- Sprawdź, czy biblioteka 2D innej firmy (jeśli była) została całkowicie usunięta i czy żadne pozostałe importy do niej nie odwołują się
Kluczowe korzyści wynikające z migracji do IronBarcode
Ujednolicona funkcja odczytu i zapisu: Po migracji każdy symbol, który może wygenerować IronBarcode, może być również odczytany za pomocą tej samej biblioteki IronBarcode. Zlikwidowano asymetrię między generatorem a czytnikiem firmy Neodynamic — gdzie kody QR, DataMatrix, PDF417 i Aztec mogły być generowane, ale nie odczytywane. Aplikacje, które wcześniej wymagały obejścia lub biblioteki zewnętrznej do odczytu 2D, zyskują tę możliwość bez dodatkowej integracji.
Zarządzanie pojedynczą licencją: Jeden pakiet NuGet, jeden klucz licencyjny i jeden blok konfiguracyjny zastępują dwie oddzielne subskrypcje produktów. Odnawianie, rotacja kluczy i zarządzanie zmiennymi środowiskowymi stają się o połowę mniej skomplikowane. Zmniejszenie nakładów administracyjnych ma charakter ciągły, a nie jednorazowy.
Natywny odczyt kodów kreskowych z plików PDF:IronBarcode odczytuje kody kreskowe bezpośrednio z dokumentów PDF, zwracając metadane dotyczące numeru strony wraz z wartościami kodów kreskowych. Aplikacje przetwarzające listy przewozowe, faktury lub dokumentację medyczną zawierającą osadzone kody kreskowe nie wymagają już pośredniego etapu wyodrębniania obrazu ani dodatkowej biblioteki PDF do obsługi odczytu kodów kreskowych. Zobacz pełną listę obsługiwanych formatów BARCODE, aby zapoznać się z kompletnym zestawem symboli i typów danych wejściowych.
Eliminacja zależności od System.Drawing: SDK Neodynamic zależą od System.Drawing, który wymaga dodatkowej konfiguracji natywnych bibliotek na Linuksie i w kontenerach Docker.IronBarcode nie ma zależności System.Drawing, co oznacza, że ta sama baza kodu działa na Windows, Linuksie i w kontenerowych środowiskach chmurowych bez zmian w konfiguracji zależnej od platformy.
Uproszczony koszt licencji zapewniającej pełną funkcjonalność: Projekt, który wymagał zarówno zestawów SDK firmy Neodynamic, jak i trzeciej biblioteki do odczytu 2D, płacił za trzy zależności, aby osiągnąć to, co IronBarcode zapewnia w ramach jednej licencji. W przypadku projektów wymagających generowania oraz odczytu 2D migracja konsoliduje zarówno ślad techniczny, jak i koszty licencji w jednym produkcie komercyjnym. Aktualne informacje o cenach są dostępne na stronie licencyjnej IronBarcode.
Neodynamic i ZXing.NET są zarejestrowanymi znakami towarowymi ich właścicieli. Ta strona nie jest powiązana, zatwierdzona ani sponsorowana przez Neodynamic lub ZXing.NET. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.)}]
Często Zadawane Pytania
Dlaczego warto przejść z Neodynamic BarCode Professional na IronBarcode?
Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.
Jak zastąpić wywołania API Neodynamic za pomocą IronBarcode?
Zastąp standardowe fragmenty kodu dotyczące tworzenia instancji i licencjonowania wyrażeniem IronBarCode.License.LicenseKey = "key". Zastąp wywołania czytnika wyrażeniem BarcodeReader.Read(path), a wywołania zapisu wyrażeniem BarcodeWriter.CreateBarcode(data, encoding). Metody statyczne nie wymagają zarządzania instancjami.
Jak bardzo zmienia się kod podczas migracji z Neodynamic BarCode Professional do IronBarcode?
Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.
Czy podczas migracji muszę mieć zainstalowane zarówno Neodynamic Barcode Professional, jak i IronBarcode?
Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.
Jaka jest nazwa pakietu NuGet dla IronBarcode?
Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.
W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z Neodynamic Barcode Professional?
IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.
Czy IronBarcode automatycznie wykrywa wszystkie formaty BARCODE po migracji z Neodynamic?
Tak. IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach. Wyraźne wyliczenie typów kodów kreskowych nie jest wymagane. Jeśli format jest już znany, a wydajność ma znaczenie, BarcodeReaderOptions pozwala ograniczyć obszar wyszukiwania w celu optymalizacji.
Czy IronBarcode może odczytywać BarCodes z plików PDF bez oddzielnej biblioteki?
Tak. BarCodeReader.Read("document.pdf") przetwarza pliki PDF natywnie. Wyniki obejmują PageNumber, Format, Value i Confidence dla każdego znalezionego kodu kreskowego. Nie jest wymagany żaden zewnętrzny etap renderowania pliku PDF.
W jaki sposób IronBarcode obsługuje równoległe przetwarzanie kodów kreskowych?
Metody statyczne IronBarcode są bezstanowe i bezpieczne dla wątków. Użyj Parallel.ForEach bezpośrednio na listach plików bez zarządzania instancjami dla poszczególnych wątków. BarcodeReaderOptions.MaxParallelThreads kontroluje wewnętrzny limit wątków.
Jakie właściwości wyników ulegają zmianie podczas migracji z Neodynamic Barcode Professional do IronBarcode?
Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.
Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?
Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.
Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?
Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

