Jak dostosowywać i stylizować kody kreskowe w C#
Migracja zOnBarcodedo IronBarcode
Niniejszy przewodnik obejmuje kompletną ścieżkę migracji zOnBarcodedo IronBarcode. Omawia trzyetapową zmianę konfiguracji, podaje przykłady kodu przed i po zmianie dla każdego popularnego wzorca, mapuje APIOnBarcodena jego odpowiedniki w IronBarcode, dokumentuje problemy pojawiające się podczas migracji oraz dostarcza listę kontrolną terminów wyszukiwania do audytu kodu źródłowego przed uznaniem migracji za zakończoną.
Dlaczego warto przejść z OnBarcode
Dwupoziomowa nadwyżka zakupów:OnBarcodepublikuje ceny wieczyste dla SDK Generatora (jedynie liniowe i liniowe + 2D) i wymienia SDK Reader jako produkt o osobnej cenie. Organizacja, która potrzebuje obu możliwości, musi przejść przez dwa procesy zakupu na dwóch SKU — wybierając odpowiedni poziom Generatora dla używanych symbolik, a następnie osobno kupując Reader — zanim całkowity koszt zostanie ustalony. Tarcia to dublowanie się w dwóch zakupach zamiast jednego elementu.
Podział kosztów ogólnych produktu: Generowanie i odczyt to odrębne produkty z oddzielnymi pakietami NuGet, oddzielnymi przestrzeniami nazw licencji, oddzielnymi kluczami licencyjnymi i oddzielnymi harmonogramami wersji. Projekt wykorzystujący oba produkty musi skonfigurować dwa klucze licencyjne podczas uruchamiania, śledzić dwie wersje pakietów w trakcie aktualizacji oraz uwzględniać dwa niezależne cykle wydawnicze. Gdy do projektu, który pierwotnie obejmował wyłącznie generowanie, dodaje się wymóg odczytu, cały proces zakupu i integracji musi zostać powtórzony dla drugiego produktu.
Luki w przepływie pracy z plikami PDF:OnBarcodenie obsługuje natywnie odczytu BarCode z dokumentów PDF. Projekty przetwarzające kody kreskowe osadzone w fakturach, listach przewozowych, zamówieniach zakupu lub skanach archiwalnych muszą nabyć oddzielną bibliotekę renderowania plików PDF na obrazy, zintegrować ją z potokiem, zarządzać jej licencją oddzielnie oraz przekazywać renderowane strony doOnBarcodeReader SDK pojedynczo. Powoduje to powstanie rozwiązania opartego na dwóch zależnościach, podczas gdy w innym przypadku wystarczyłoby rozwiązanie oparte na jednej zależności.
API szczegolowosc: GeneratorOnBarcodewymaga utworzenia obiektu Barcode, przypisania mu wielu wlasciwosci - w tym takich z rozsadnymi wartosciami domyslnymi jak Resolution, BarWidth, i BarHeight - a nastepnie wywolania metody generacji. Ten sam wynik można uzyskać przy użyciu znacznie mniejszej ilości kodu, korzystając ze statycznego interfejsu API fabryki. W połączeniu z generowaniem partii wzorzec przypisywania właściwości generuje duże ilości powtarzalnego kodu, który wymaga przeglądu i konserwacji.
Podstawowy problem
Konfiguracja z podwójną licencją jest najbardziej bezpośrednim punktem tarcia dla każdego projektu, który wymaga zarówno generowania, jak i odczytu.OnBarcodewymaga dwóch oddzielnych wywołań do dwóch oddzielnych przestrzeni nazw licencji podczas uruchamiania:
// OnBarcode: two products, two DLL references, no runtime key
//OnBarcodeuses pre-licensed DLLs — the purchased DLL is already activated.
// There is no runtime SetLicense() call; the license is baked into the downloaded assembly.
using OnBarcode.Barcode;
using OnBarcode.Barcode;
// OnBarcode: two products, two DLL references, no runtime key
//OnBarcodeuses pre-licensed DLLs — the purchased DLL is already activated.
// There is no runtime SetLicense() call; the license is baked into the downloaded assembly.
using OnBarcode.Barcode;
using OnBarcode.Barcode;
Imports OnBarcode.Barcode
Imports OnBarcode.Barcode
IronBarcode sprowadza to do jednego przypisania właściwości, które obejmuje wszystkie możliwości — generowanie, odczyt, obsługę plików PDF i operacje wsadowe — w ramach jednego klucza:
// IronBarcode: one package, one key, one line
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// IronBarcode: one package, one key, one line
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Każda operacja związana z kodami kreskowymi w aplikacji — niezależnie od tego, czy generuje, odczytuje czy przetwarza pliki PDF — działa w ramach tej jednej konfiguracji.
IronBarcode a OnBarcode: porównanie funkcji
| Funkcja | OnBarcode | IronBarcode |
|---|---|---|
| Generowanie BarCode'ów | Tak | Tak |
| Odczytywanie BarCode | Oddzielny produkt, oddzielny zakup | W zestawie |
| Odczytywanie BarCodes z plików PDF | Nieobsługiwane natywnie | Natywne — nie wymaga zewnętrznej biblioteki |
| Automatyczne wykrywanie formatu podczas odczytu | Nie — wymagana jawna BarcodeType[] |
Tak |
| Metadane wyniku (format, pozycja, strona) | Niedostepne — tylko surowa string[] |
Tak — BarcodeResults z pelnymi metadanymi |
| QR Kod z nałożonym logo | Wymagany ręczny kod GDI+ | Wbudowane |
| Opublikowane ceny | Tak — strony dotyczące poszczególnych produktów (poziomy Generatora + osobno Reader) | Tak — jedna strona obejmuje wszystkie możliwości |
| Pojedynczy klucz licencyjny na wszystkie funkcje | Nie — osobne klucze dla każdego produktu | Tak |
| Dystrybucja NuGet | Dostępne, w parze z dziedzicznymi pobraniami DLL | Dostępne od momentu premiery |
| Dostęp do kodu źródłowego | Tylko plan nieograniczony | Niedostępne |
| Obsługa .NET 8 / 9 | Tak | Tak |
| Konfiguracja licencji Docker / chmura | Podręcznik | Obsługa zmiennych środowiskowych |
Szybki start: Migracja zOnBarcodedo IronBarcode
Krok 1: Usuń odniesienia do pakietu OnBarcode
Jeśli w projekcie używane są pakiety NuGet, usuń oba:
dotnet remove package OnBarcode.Barcode.Generator
dotnet remove package OnBarcode.Barcode.Reader
dotnet remove package OnBarcode.Barcode.Generator
dotnet remove package OnBarcode.Barcode.Reader
Jesli projekt uzywa starszej dystrybucji opartej na bibliotece DLL, nalezy rowniez usunac reczny blok odniesienia z .csproj:
<ItemGroup>
<Reference Include="OnBarcode.Barcode">
<HintPath>lib\OnBarcode.Barcode.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Reference Include="OnBarcode.Barcode">
<HintPath>lib\OnBarcode.Barcode.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
Usun pliki DLL z katalogu lib/ lub miejsca, w ktorym sa przechowywane. Pozostawienie starych zestawów obok nowego pakietu NuGet spowoduje konflikty przestrzeni nazw w czasie kompilacji.
Krok 2: Dodaj IronBarcode
Jeden pakiet obejmuje generowanie, odczyt i obsługę plików PDF:
dotnet add package IronBarcode
dotnet add package IronBarcode
Do czytania nie jest wymagany żaden dodatkowy pakiet. Do obsługi plików PDF nie jest wymagany żaden dodatkowy pakiet.
Krok 3: Zaktualizuj przestrzenie nazw i zastąp konfigurację podwójnej licencji
Zastąp obie dyrektywyOnBarcodepojedynczym importem IronBarcode:
// Remove
using OnBarcode.Barcode;
using OnBarcode.Barcode;
// Add
using IronBarCode;
// Remove
using OnBarcode.Barcode;
using OnBarcode.Barcode;
// Add
using IronBarCode;
Imports IronBarCode
Zamień podwójne referencje DLL na pojedyncze przypisanie klucza. Umieść to raz, na początku uruchamiania aplikacji, przed wykonaniem jakiejkolwiek operacji związanej z BARCODE:
// Remove theOnBarcodeDLL references and using directives
// Add
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove theOnBarcodeDLL references and using directives
// Add
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove the OnBarcodeDLL references and Imports statements
' Add
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Przykłady migracji kodu
Generowanie barcode'ów Code 128
Podstawowy przypadek Code 128 ilustruje wzorzec przypisania właściwości w porównaniu ze wzorcem fabryki statycznej.
Podejście OnBarcode:
using OnBarcode.Barcode;
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = "SHIP-2024-001";
barcode.Resolution = 96;
barcode.X = 1;
barcode.BarcodeHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode("shipping-label.png");
using OnBarcode.Barcode;
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = "SHIP-2024-001";
barcode.Resolution = 96;
barcode.X = 1;
barcode.BarcodeHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode("shipping-label.png");
Imports OnBarcode.Barcode
Dim barcode As New Linear()
barcode.Type = BarcodeType.CODE128
barcode.Data = "SHIP-2024-001"
barcode.Resolution = 96
barcode.X = 1
barcode.BarcodeHeight = 80
barcode.ShowText = True
barcode.drawBarcode("shipping-label.png")
Podejście IronBarcode:
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
Typ danych i kodowania sa przekazywane jako argumenty do CreateBarcode. Właściwości takie jak rozdzielczość i wysokość słupków nie są wymagane do uzyskania skanowalnego wyniku; Ustawienia domyślne są odpowiednie dla większości zastosowań. Kiedy potrzebne sa niestandardowe wymiary, mozna je dodac jako lancuchowe wywolania miedzy CreateBarcode i SaveAsPng bez wprowadzenia stanu zmienialnego obiektu.
Generowanie kodów QR z logo
QR kody z logo wymagaja, abyOnBarcodeuzylo System.Drawing do kroku nakladania obrazu.IronBarcode zapewnia to jako wbudowana operacje.
Podejście OnBarcode:
using OnBarcode.Barcode;
using System.Drawing;
QRCode qr = new QRCode();
qr.Data = "https://example.com/product/4891";
qr.QRCodeDataMode = QRCodeDataMode.Auto;
qr.QRCodeECL = QRCodeECL.H; // H-level error correction required for logo overlay
Image qrImage = qr.drawBarcode();
using (Graphics g = Graphics.FromImage(qrImage))
{
Image logo = Image.FromFile("brand-logo.png");
int logoSize = qrImage.Width / 5;
int x = (qrImage.Width - logoSize) / 2;
int y = (qrImage.Height - logoSize) / 2;
g.DrawImage(logo, x, y, logoSize, logoSize);
}
qrImage.Save("product-qr.png");
using OnBarcode.Barcode;
using System.Drawing;
QRCode qr = new QRCode();
qr.Data = "https://example.com/product/4891";
qr.QRCodeDataMode = QRCodeDataMode.Auto;
qr.QRCodeECL = QRCodeECL.H; // H-level error correction required for logo overlay
Image qrImage = qr.drawBarcode();
using (Graphics g = Graphics.FromImage(qrImage))
{
Image logo = Image.FromFile("brand-logo.png");
int logoSize = qrImage.Width / 5;
int x = (qrImage.Width - logoSize) / 2;
int y = (qrImage.Height - logoSize) / 2;
g.DrawImage(logo, x, y, logoSize, logoSize);
}
qrImage.Save("product-qr.png");
Imports OnBarcode.Barcode
Imports System.Drawing
Dim qr As New QRCode()
qr.Data = "https://example.com/product/4891"
qr.QRCodeDataMode = QRCodeDataMode.Auto
qr.QRCodeECL = QRCodeECL.H ' H-level error correction required for logo overlay
Dim qrImage As Image = qr.drawBarcode()
Using g As Graphics = Graphics.FromImage(qrImage)
Dim logo As Image = Image.FromFile("brand-logo.png")
Dim logoSize As Integer = qrImage.Width \ 5
Dim x As Integer = (qrImage.Width - logoSize) \ 2
Dim y As Integer = (qrImage.Height - logoSize) \ 2
g.DrawImage(logo, x, y, logoSize, logoSize)
End Using
qrImage.Save("product-qr.png")
Podejście IronBarcode:
using IronBarCode;
var qr = QRCodeWriter.CreateQrCodeWithLogo("https://example.com/product/4891", "brand-logo.png", 500);
qr.SaveAsPng("product-qr.png");
using IronBarCode;
var qr = QRCodeWriter.CreateQrCodeWithLogo("https://example.com/product/4891", "brand-logo.png", 500);
qr.SaveAsPng("product-qr.png");
Imports IronBarCode
Dim qr = QRCodeWriter.CreateQrCodeWithLogo("https://example.com/product/4891", "brand-logo.png", 500)
qr.SaveAsPng("product-qr.png")
Poziom korekty błędów, obliczenia rozmiaru logo i kompozycja obrazu są obsługiwane wewnętrznie. Nie jest wymagane zaleznie System.Drawing.
Odczytywanie BarCodes z obrazu
Odczytanie z pliku graficznego najlepiej ilustruje konsolidację produktów. W przypadkuOnBarcodedo odczytu wymagany jest oddzielny pakiet Reader SDK, osobne wywołanie licencji oraz wyraźna specyfikacja formatu. W przypadku IronBarcode jest to pojedyncze wywołanie statyczne przy użyciu tego samego pakietu i klucza, które już istnieją.
Podejście OnBarcode:
using OnBarcode.Barcode;
//OnBarcodereader is distributed as a pre-licensed DLL — no runtime SetLicense() call.
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
string[] results = scanner.Scan("received-label.png");
foreach (string value in results)
Console.WriteLine(value);
using OnBarcode.Barcode;
//OnBarcodereader is distributed as a pre-licensed DLL — no runtime SetLicense() call.
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
string[] results = scanner.Scan("received-label.png");
foreach (string value in results)
Console.WriteLine(value);
Imports OnBarcode.Barcode
' OnBarcodereader is distributed as a pre-licensed DLL — no runtime SetLicense() call.
Dim scanner As New BarcodeScanner()
scanner.BarcodeTypes = New BarcodeType() {BarcodeType.Code128, BarcodeType.QRCode}
Dim results As String() = scanner.Scan("received-label.png")
For Each value As String In results
Console.WriteLine(value)
Next
Podejście IronBarcode:
using IronBarCode;
var results = BarcodeReader.Read("received-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
using IronBarCode;
var results = BarcodeReader.Read("received-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode
Dim results = BarcodeReader.Read("received-label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
Bez tworzenia instancji, bez tablicy formatów, bez oddzielnej konfiguracji licencji. Format jest wykrywany automatycznie. Każdy wynik zawiera zdekodowaną wartość i wykryty format. Szczegółowe informacje na temat opcji odczytu i obsługiwanych typów obrazów można znaleźć w przewodniku dotyczącym odczytu BARCODE-ów z obrazów.
Odczytywanie BarCodes z pliku PDF
Ten przykład migracji dotyczy zespołów, które renderowały strony PDF do obrazów przy użyciu biblioteki innej firmy, a następnie przekazywały te obrazy doOnBarcodeReader SDK.
Podejście OnBarcode:
//OnBarcodehas no native PDF support.
// A separate PDF rendering library was required — for example PdfiumViewer or Aspose.PDF.
var pageImages = RenderPdfPagesToImages("invoices.pdf"); // external library call
using OnBarcode.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
foreach (var pageImage in pageImages)
{
string[] results = scanner.Scan(pageImage);
foreach (string value in results)
Console.WriteLine(value);
}
//OnBarcodehas no native PDF support.
// A separate PDF rendering library was required — for example PdfiumViewer or Aspose.PDF.
var pageImages = RenderPdfPagesToImages("invoices.pdf"); // external library call
using OnBarcode.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
foreach (var pageImage in pageImages)
{
string[] results = scanner.Scan(pageImage);
foreach (string value in results)
Console.WriteLine(value);
}
Imports OnBarcode.Barcode
' OnBarcode has no native PDF support.
' A separate PDF rendering library was required — for example PdfiumViewer or Aspose.PDF.
Dim pageImages = RenderPdfPagesToImages("invoices.pdf") ' external library call
Dim scanner As New BarcodeScanner()
scanner.BarcodeTypes = New BarcodeType() {BarcodeType.Code128, BarcodeType.QRCode}
For Each pageImage In pageImages
Dim results As String() = scanner.Scan(pageImage)
For Each value As String In results
Console.WriteLine(value)
Next
Next
Podejście IronBarcode:
using IronBarCode;
var results = BarcodeReader.Read("invoices.pdf");
foreach (var result in results)
Console.WriteLine($"Page {result.PageNumber}: {result.Format} — {result.Value}");
using IronBarCode;
var results = BarcodeReader.Read("invoices.pdf");
foreach (var result in results)
Console.WriteLine($"Page {result.PageNumber}: {result.Format} — {result.Value}");
Imports IronBarCode
Dim results = BarcodeReader.Read("invoices.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Format} — {result.Value}")
Next
Bez etapu renderowania, bez zewnętrznej biblioteki PDF, bez tablicy formatów. Funkcja odczytu BarCodes w plikach PDF przetwarza wszystkie strony automatycznie i dołącza numer strony do każdego wyniku.
Generowanie partii
Generowanie BARCODE-ów dla zbioru elementów przebiega według tego samego schematu, co w przypadku pojedynczego generowania.
Podejście OnBarcode:
using OnBarcode.Barcode;
foreach (var item in inventoryItems)
{
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = item.Sku;
barcode.Resolution = 96;
barcode.BarWidth = 1;
barcode.BarHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode($"labels/{item.Id}.png");
}
using OnBarcode.Barcode;
foreach (var item in inventoryItems)
{
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = item.Sku;
barcode.Resolution = 96;
barcode.BarWidth = 1;
barcode.BarHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode($"labels/{item.Id}.png");
}
Imports OnBarcode.Barcode
For Each item In inventoryItems
Dim barcode As New Linear()
barcode.Type = BarcodeType.CODE128
barcode.Data = item.Sku
barcode.Resolution = 96
barcode.BarWidth = 1
barcode.BarHeight = 80
barcode.ShowText = True
barcode.drawBarcode($"labels/{item.Id}.png")
Next
Podejście IronBarcode:
using IronBarCode;
foreach (var item in inventoryItems)
{
BarcodeWriter.CreateBarcode(item.Sku, BarcodeEncoding.Code128)
.SaveAsPng($"labels/{item.Id}.png");
}
using IronBarCode;
foreach (var item in inventoryItems)
{
BarcodeWriter.CreateBarcode(item.Sku, BarcodeEncoding.Code128)
.SaveAsPng($"labels/{item.Id}.png");
}
Imports IronBarCode
For Each item In inventoryItems
BarcodeWriter.CreateBarcode(item.Sku, BarcodeEncoding.Code128) _
.SaveAsPng($"labels/{item.Id}.png")
Next
Odnośnik do dokumentacji APIOnBarcodedo IronBarcode
| OnBarcode | IronBarcode | Uwagi |
|---|---|---|
| Z DLL licencjonowanym wcześniej (bez wywołania klucza w czasie wykonywania) | IronBarCode.License.LicenseKey = "key" |
Przypisanie właściwości; wywołane raz przy starcie |
| Dwie referencje DLL (generator + reader) | Pojedynczy pakiet NuGet | Jeden pakiet obejmuje wszystkie możliwości |
new Linear() |
BarcodeWriter.CreateBarcode(data, encoding) |
Fabryka statyczna; żaden obiekt nie jest wymagany |
barcode.BarcodeType = BarcodeType.CODE128 |
BarcodeEncoding.Code128 jako parametr |
Przekazany jako drugi argument do CreateBarcode |
barcode.Data = "..." |
Pierwszy parametr CreateBarcode |
Dane są pierwszym argumentem |
barcode.drawBarcode("file.png") |
.SaveAsPng("file.png") |
Metoda o nazwie format |
barcode.drawBarcode("file.jpg") |
.SaveAsJpeg("file.jpg") |
Metoda o nazwie format |
barcode.drawBarcode("file.pdf") |
.SaveAsPdf("file.pdf") |
Wyjście w formacie PDF |
BarcodeType.CODE128 |
BarcodeEncoding.Code128 |
Stała zmieniona nazwa |
BarcodeType.QRCode |
BarcodeEncoding.QRCode |
Bezpośrednie odwzorowanie |
BarcodeType.EAN13 |
BarcodeEncoding.EAN13 |
Bezpośrednie odwzorowanie |
BarcodeType.DataMatrix |
BarcodeEncoding.DataMatrix |
Bezpośrednie odwzorowanie |
BarcodeType.PDF417 |
BarcodeEncoding.PDF417 |
Bezpośrednie odwzorowanie |
new BarcodeScanner() { BarcodeTypes = [...] } |
BarcodeReader.Read(path) — statyczne |
Brak instancji, brak specyfikacji formatu |
scanner.Scan("file.png") → string[] |
BarcodeReader.Read("file.png") → BarcodeResults |
Bogatszy typ zwracanej wartości |
results[0] (surowy ciag) |
result.Value |
Wartość odkodowanego ciągu znaków |
| Nie dotyczy | result.Format |
Wykryty format — niedostępny wOnBarcode |
| Nie dotyczy | result.PageNumber |
Źródło strony dla pliku PDF brzmi |
| Nie dotyczy | BarcodeReader.Read("document.pdf") |
Natywne odczytywanie plików PDF; brak odpowiednikaOnBarcode |
| Ręczne nakładanie GDI+ na logo QR | QRCodeWriter.CreateQrCodeWithLogo() |
Wbudowana obsługa logo |
Konfiguracja BarcodeType[] |
Nie jest wymagane | Automatyczne wykrywanie jest ustawieniem domyślnym |
Typowe problemy związane z migracją i ich rozwiązania
Problem 1: Konflikty odwołań do bibliotek DLL
OnBarcode: Projekty na legacy DLL dystrybucji maja elementy <Reference> w .csproj wskazujace na lib\OnBarcode.Barcode.dll lub podobne sciezki. Jeśli stara biblioteka DLL pozostanie na dysku po dodaniu IronBarcode, kompilator wykryje dwa zestawy zapewniające te same prefiksy przestrzeni nazw i wygeneruje niejednoznaczne błędy odwołań.
Rozwiazanie: Usun blok odniesienia <ItemGroup> z .csproj przed uruchomieniem dotnet add package IronBarcode. Usuń pliki DLL z dysku. Sprawdź za pomocą czystej kompilacji, czy nie pozostały żadne nieaktualne odwołania do zestawów.
# Search for lingeringOnBarcodeDLL references in project files
grep -r "OnBarcode" --include="*.csproj" .
grep -r "OnBarcode" --include="*.props" .
# Search for lingeringOnBarcodeDLL references in project files
grep -r "OnBarcode" --include="*.csproj" .
grep -r "OnBarcode" --include="*.props" .
Problem 2: Konflikty nazw typów podczas migracji fazowej
OnBarcode: Przestrzen nazw czytnika eksportuje klase o nazwie BarcodeScanner.IronBarcode ma klase statyczna o nazwie BarcodeReader. Te nazwy nie koliduja bezposrednio, ale kazdy plik importujacy jednoczesnie OnBarcode.Barcode.Reader i IronBarCode moze widziec niejednoznacznosc enum BarcodeType —OnBarcodedefiniuje BarcodeType do wyboru formatu, a IronBarcode uzywa BarcodeEncoding. Utrzymywanie obu przestrzeni nazw aktywnych podczas migracji spowoduje bledy kompilacji dla kazdego odniesienia BarcodeType.
Rozwiazanie: Ukoncz migracje kazdego pliku atomowo — usun dyrektywe using OnBarcode.Barcode.Reader i dodaj using IronBarCode podczas tej samej edycji. Nie należy pozostawiać obu dyrektyw using w żadnym pliku. Jeśli konieczne jest podejście etapowe, należy tymczasowo używać nazw w pełni kwalifikowanych:
// Temporary disambiguation during phased migration
var results = IronBarCode.BarcodeReader.Read("file.png");
// Temporary disambiguation during phased migration
var results = IronBarCode.BarcodeReader.Read("file.png");
' Temporary disambiguation during phased migration
Dim results = IronBarCode.BarcodeReader.Read("file.png")
Problem 3: Usunięcie tablicy BarcodeType
OnBarcode: Czytnik wymaga reader.BarcodeTypes = new BarcodeType[] { ... } aby działało. Programiści migrujący kod czytnika mają czasem zwyczaj jawnego określania formatów i szukają odpowiedniej konfiguracji w IronBarcode.
Rozwiązanie: Całkowicie usunąć specyfikację formatu. BarcodeReader.Read wykonuje automatyczne wykrywanie we wszystkich obslugiwanych formatach. Nie jest wymagana konfiguracja, a odpowiednik BarcodeType[] nie istnieje w IronBarcode, poniewaz nie jest potrzebny.
// No format configuration required
var results = BarcodeReader.Read("label.png");
// No format configuration required
var results = BarcodeReader.Read("label.png");
Dim results = BarcodeReader.Read("label.png")
Lista kontrolna migracji OnBarcode
Zadania przed migracją
Przed wprowadzeniem zmian należy przeprowadzić audyt kodu źródłowego w celu zlokalizowania wszystkich miejsc użycia OnBarcode:
# Find allOnBarcodenamespace imports
grep -rn "using OnBarcode" --include="*.cs" .
# Find all license configuration calls
grep -rn "SetLicense" --include="*.cs" .
# Find all generator usage
grep -rn "new Linear\|new QRCode\|drawBarcode\|BarcodeType\." --include="*.cs" .
# Find all reader usage
grep -rn "BarcodeScanner\|\.Scan(\|BarcodeType\[\]" --include="*.cs" .
# Find DLL references in project files
grep -rn "OnBarcode" --include="*.csproj" .
grep -rn "OnBarcode" --include="*.sln" .
# Find allOnBarcodenamespace imports
grep -rn "using OnBarcode" --include="*.cs" .
# Find all license configuration calls
grep -rn "SetLicense" --include="*.cs" .
# Find all generator usage
grep -rn "new Linear\|new QRCode\|drawBarcode\|BarcodeType\." --include="*.cs" .
# Find all reader usage
grep -rn "BarcodeScanner\|\.Scan(\|BarcodeType\[\]" --include="*.cs" .
# Find DLL references in project files
grep -rn "OnBarcode" --include="*.csproj" .
grep -rn "OnBarcode" --include="*.sln" .
Należy określić, które pliki służą wyłącznie do generowania, które do odczytu, a które do obu tych celów. Zanotuj wszelkie pliki, ktore zawieraja reczny blok DLL <Reference> zamiast odniesienia do pakietu NuGet.
Zadania związane z aktualizacją kodu
- Usun pakiet NuGet
OnBarcode.Barcode.Generator - Usun pakiet NuGet
OnBarcode.Barcode.Reader - Usun wszelkie reczne wpisy DLL
<Reference>z plikow.csproj - Usuń pliki DLLOnBarcodez repozytorium
- Uruchom
dotnet add package IronBarcode - Zastap
using OnBarcode.Barcodeusing IronBarCodew kazdym pliku - Zastap
using OnBarcode.Barcode.Readerusing IronBarCodew kazdym pliku - Usun oba wpisy DLLOnBarcode
<Reference>(generator i czytnik) — brak wywolan licencji runtime do zastapienia - Dodaj
IronBarCode.License.LicenseKey = "YOUR-KEY"raz podczas uruchamiania aplikacji - Konwertuj kazdy
new Linear()lubnew QRCode()+ blok przypisania wlasciwosci doBarcodeWriter.CreateBarcode(data, encoding) - Zastap
barcode.drawBarcode("file.png").SaveAsPng("file.png")(lub odpowiednia metoda formatu) - Zastap
new BarcodeScanner() { BarcodeTypes = [...] }+.Scan(path)BarcodeReader.Read(path) - Zaktualizuj obsluge wynikow z
string[]indeksowanie naresult.Valueiresult.FormatnaBarcodeResults - Usuń wszelki kod renderujący pliki PDF na obrazy, używany w celu obejścia ograniczeńOnBarcodedotyczących plików PDF
- Zastap wieloetapowa petle renderowania i skanowania PDF jednym wywolaniem
BarcodeReader.Read("file.pdf")
Testy po migracji
- Sprawdź, czy każdy typ BarCoda używany w projekcie (Code 128, QR, EAN, Data Matrix, PDF417) generuje wynik nadający się do skanowania
- Zeskanuj wygenerowane BarCodes za pomocą skanera fizycznego lub urządzenia mobilnego, aby potwierdzić ich czytelność
- Sprawdź, czy odczyt BarCode zwraca prawidłowe wartości dla znanych obrazów testowych
- Sprawdź, czy odczyt plików PDF zwraca prawidłowe wartości i prawidłowe numery stron dla wielostronicowych dokumentów testowych
- Uruchom aplikację w dowolnym środowisku CI, aby sprawdzić, czy konfiguracja klucza licencyjnego działa poprawnie w potoku
- Sprawdz, czy zadne ciagi
OnBarcodenie pozostaly w.cs,.csprojlub plikach konfiguracyjnych po zakonczeniu migracji
Kluczowe korzyści wynikające z migracji do IronBarcode
Pakiet konsolidacyjny i licencja: Po migracji wszystkie operacje związane z BarCode obejmuje jeden pakiet NuGet i jeden klucz licencyjny. Nie ma oddzielnych produktów do zakupu, nie trzeba śledzić niezależnych harmonogramów wydawania wersji ani utrzymywać konfiguracji podwójnej licencji podczas uruchamiania. Złożoność rozwiązania opartego na dwóch produktach została zastąpiona pojedynczą zależnością.
Przejrzyste zamówienia:IronBarcode publikuje poziomy licencji wieczystych wraz z cenami na stronie produktu. Organizacja może określić całkowity koszt, złożyć zamówienie i sfinalizować zakup bez rozmowy z działem sprzedaży. Strona licencyjna IronBarcode zawiera cennik dla wszystkich poziomów oraz szczegóły dotyczące kluczowej konfiguracji dla środowisk Docker i chmury.
Natywna obsługa plików PDF: Projekty, które wcześniej wymagały oddzielnej biblioteki renderującej pliki PDF do przetwarzania plików PDF z osadzonymi kodami kreskowymi, mogą całkowicie wyeliminować tę zależność. Pojedyncze wywolanie BarcodeReader.Read przetwarza wszystkie strony dokumentu PDF bez zadnego kroku renderowania, a kazdy wynik zawiera numer strony, z ktorej zostal wydobyty.
Bardziej bogate wyniki czytania: Typ zwracany BarcodeResults dostarcza zdekodowana wartosc, wykryty format kodu kreskowego, wspolrzedne ramki ograniczajacej w zrodlowym obrazie i numer strony dla odczytow PDF. Aplikacje, ktore wczesniej dzialaly z plaskim string[], teraz moga pokazywac informacje o formacie, wspierac przeplywy pracy z anotacjami, lub implementowac filtrowanie na podstawie pewnosci bez dodatkowego przetwarzania.
Zredukowana powierzchnia API: Wzorzec statycznej fabryki zastępuje model przypisywania właściwości. Typowe operacje generowania wymagają mniejszego nakładu kodu, a operacje odczytu nie wymagają tworzenia instancji ani wstępnej konfiguracji formatu. Operacje wsadowe zyskują dzięki mniejszej ilości kodu na element, co ułatwia przeglądanie i utrzymanie w miarę upływu czasu.
Często Zadawane Pytania
Dlaczego warto przejść z OnBarcode 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 OnBarcode 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 OnBarcode 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 OnBarcode, 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 OnBarcode?
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 kodów kreskowych po migracji z OnBarcode?
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 OnBarcode 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ń.

