Przejdź do treści stopki
FILMY

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
$vbLabelText   $csharpLabel

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"
$vbLabelText   $csharpLabel

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
SHELL

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>
XML

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
SHELL

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
$vbLabelText   $csharpLabel

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"
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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.

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")
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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" .
SHELL

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")
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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" .
SHELL

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

  1. Usun pakiet NuGet OnBarcode.Barcode.Generator
  2. Usun pakiet NuGet OnBarcode.Barcode.Reader
  3. Usun wszelkie reczne wpisy DLL <Reference> z plikow .csproj
  4. Usuń pliki DLLOnBarcodez repozytorium
  5. Uruchom dotnet add package IronBarcode
  6. Zastap using OnBarcode.Barcode using IronBarCode w kazdym pliku
  7. Zastap using OnBarcode.Barcode.Reader using IronBarCode w kazdym pliku
  8. Usun oba wpisy DLLOnBarcode<Reference> (generator i czytnik) — brak wywolan licencji runtime do zastapienia
  9. Dodaj IronBarCode.License.LicenseKey = "YOUR-KEY" raz podczas uruchamiania aplikacji
  10. Konwertuj kazdy new Linear() lub new QRCode() + blok przypisania wlasciwosci do BarcodeWriter.CreateBarcode(data, encoding)
  11. Zastap barcode.drawBarcode("file.png") .SaveAsPng("file.png") (lub odpowiednia metoda formatu)
  12. Zastap new BarcodeScanner() { BarcodeTypes = [...] } + .Scan(path) BarcodeReader.Read(path)
  13. Zaktualizuj obsluge wynikow z string[] indeksowanie na result.Value i result.Format na BarcodeResults
  14. Usuń wszelki kod renderujący pliki PDF na obrazy, używany w celu obejścia ograniczeńOnBarcodedotyczących plików PDF
  15. 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 OnBarcode nie pozostaly w .cs, .csproj lub 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.

Zwróć uwagęAspose,OnBarcodei PDFium są zarejestrowanymi znakami towarowymi ich właścicieli. Ta strona nie jest powiązana z, popierana przez, ani sponsorowana przez Aspose Pty Ltd, Chromium Project, Google ani OnBarcode. 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 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ń.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie