Migrating fromSyncfusionBarCode to IronBarcode
Ten przewodnik zapewnia pełną ścieżkę migracji z kontrolki kodu kreskowegoSyncfusion— SfBarcode dla WinForms i WPF, SfBarcodeGenerator dla Blazor i MAUI — do IronBarcode. Obejmuje on strukturalne powody, dla których zespoły dokonują tej zmiany, szybki przewodnik krok po kroku dotyczący wymiany pakietów NuGet i konfiguracji licencji, pełne przykłady kodu "przed i po" dla każdego typowego scenariusza oraz listę kontrolną migracji do audytu istniejącej bazy kodu. Jeśli w projekcie wykorzystywane są również inne komponentySyncfusion(tabele, wykresy, harmonogramy), pakiety te i ich rejestracje pozostają bez zmian — zmiany dotyczą wyłącznie kodu związanego z kodami kreskowymi BarCode.
Dlaczego warto przejść zSyncfusionBarCode
Luka w odczycie: SfBarcode i SfBarcodeGenerator to kontrolki generujące bez możliwości odczytu. Nie ma metody .Read() ani .Scan() w żadnej z klas. Gdy projekt wymaga odczytu kodów kreskowych z przesłanych obrazów, zeskanowanych dokumentów lub plików PDF, kontrolka kodów kreskowychSyncfusionnie oferuje żadnego rozwiązania. DokumentacjaSyncfusionwskazuje zespołom rozwiązanie Barcode Reader OPX, które jest oddzielnym produktem komercyjnym, który należy nabyć, licencjonować i utrzymywać niezależnie.
OPX jako płatna nakładka na darmowe oprogramowanie: czytnik BarCode OPX wykorzystuje wewnętrznie ZXing.Net — bibliotekę open source do odczytu kodów kreskowych opublikowaną na licencji Apache 2.0. Apache 2.0 jest licencją liberalną; każdy programista .NET może zainstalować ZXing.Net bezpośrednio za pomocą dotnet add package ZXing.Net i używać go w aplikacjach komercyjnych bez opłat. Pełen przepływ pracySyncfusiondo odczytu i generowania wymaga dwóch oddzielnych produktów Syncfusion, dwóch umów licencyjnych oraz dwóch interfejsów API — podczas gdy możliwość odczytu mogłaby być zaczerpnięta bezpośrednio z bezpłatnej biblioteki, którą opx opakowuje.
Warunki licencji społecznościowej: Licencja społecznościowa firmySyncfusionwymaga spełnienia czterech warunków jednocześnie i w sposób ciągły: roczny przychód brutto poniżej 1 000 000 USD, maksymalnie pięciu programistów, maksymalnie dziesięciu pracowników ogółem oraz łączny pozyskany kapitał zewnętrzny poniżej 3 000 000 USD. Organizacje rządowe nie kwalifikują się do uzyskania licencji niezależnie od wielkości. Naruszenie któregokolwiek z tych warunków powoduje natychmiastowy obowiązek uzyskania licencji komercyjnej. Runda finansowania serii A zazwyczaj powoduje, że w dniu jej zamknięcia zebrany kapitał przekracza 3 000 000 USD, co powoduje naliczenie opłaty licencyjnej niezależnie od wielkości zespołu lub przychodów. Przejście komercyjne przechodzi z $0 do rocznej subskrypcji Essential Studio na każdego dewelopera — a ta subskrypcja obejmuje cały zestaw narzędzi, a nie tylko komponent kodów kreskowych. Opublikowana ścieżkaSyncfusionto niestandardowa oferta od działu sprzedaży.
Rotacja kluczy zależna od wersji: Klucze licencyjneSyncfusionsą powiązane z konkretnymi zakresami wersji Essential Studio. Aktualizacja z wersji 24.x do 25.x wymaga uzyskania nowego klucza z portalu konta, zaktualizowania tego klucza w magazynie sekretów każdego środowiska wdrożeniowego oraz ponownego wdrożenia, aby zapobiec pojawianiu się znaków wodnych wersji próbnej w wynikach produkcyjnych. Dla zespołów o częstym cyklu wydawniczym lub wielu celach wdrożeniowych ta rotacja staje się powtarzającym się obciążeniem operacyjnym, które jest nieproporcjonalne do podstawowego wymogu generowania obrazu BARCODE.
Podstawowy problem
Architektura kontrolkiSyncfusionsprawia, że programowe generowanie plików odbywa się w sposób pośredni. Utworzenie pliku kodu kreskowego za pomocą SfBarcode wymaga wcześniejszego przydzielenia Bitmap, wywoływania DrawToBitmap, a następnie zapisania bitmapy — wzorzec renderowania WinForms, który jest uzależniony od środowiska uruchomieniowego Windows Forms:
//SyncfusionSfBarcode: indirect file output through DrawToBitmap
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "SHIP-2024-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("shipping-label.png", ImageFormat.Png);
// Reading: not possible — requires separate OPX purchase
IronBarcode generuje pliki bezpośrednio i odczytuje je za pomocą tego samego pakietu:
// IronBarcode: direct generation and reading in one package
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPng("shipping-label.png");
// Read — same package, no additional product required
var results = BarcodeReader.Read("shipping-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");Imports IronBarCode
' IronBarcode: direct generation and reading in one package
License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.SaveAsPng("shipping-label.png")
' Read — same package, no additional product required
Dim results = BarcodeReader.Read("shipping-label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next##IronBarcode aSyncfusionBarCode: porównanie funkcji
| Funkcja | SyncfusionBarCode | IronBarcode |
|---|---|---|
| Generowanie BarCode'ów | Tak — kontrolki interfejsu użytkownika (WinForms, WPF, Blazor, MAUI) | Tak — statyczne API, wszystkie środowiska |
| Odczytywanie BarCode | Nie — wymagany jest oddzielny czytnik BarCode OPX | Tak — ten sam pakiet |
| Produkt do odczytu plików OPX wykorzystuje bibliotekę ZXing.Net (Apache 2.0) | Tak | Nie dotyczy |
| Wyjście w formacie PDF z kodem kreskowym BarCode | Nie — wymaga dodatkowo Syncfusion.PDF | Tak — SaveAsPdf() wbudowany |
| Odczytywanie BarCodes z plików PDF | Nie | Tak — native |
| Generowanie po stronie serwera / bezinterfejsowe | Wymaga środowiska uruchomieniowego WinForms (DrawToBitmap) | Natywny — bez zależności od interfejsu użytkownika |
| Wdrożenie w środowisku Docker / Linux | Ograniczone | Pełne wsparcie |
| Minimalny interfejs API .NET Core | Nieobsługiwane bezpośrednio | Pełne wsparcie |
| Kod QR z osadzonym logo | Nie | Tak — .AddBrandLogo() |
| Automatyczne wykrywanie formatu podczas odczytu | Nie dotyczy | Tak |
| Społeczność / poziom darmowy | Licencja społecznościowa (cztery warunki równoczesne) | 30-dniowy okres próbny (tylko znak wodny) |
| Model licencji komercyjnej | Roczna subskrypcja (Essential Studio) | Wieczysta (jednorazowa, zobacz ironsoftware.com/csharp/barcode/licensing) |
| Zakres klucza licencyjnego | Specyficzne dla wersji, aktualizowane wraz z głównymi aktualizacjami NuGet | Wersja stabilna w ramach głównej wersji |
| Kroki rejestracji platformy | 3–4 kroki (RegisterLicense + AddSyncfusionBlazor + ConfigureSyncfusionCore + importy Razor) | Jedna linia, wszystkie platformy |
| Zakres formatów 1D | Code 128, Code 39, EAN, UPC, Codabar i inne | Wszystkie formatySyncfusionPlus PDF417, Aztec, MaxiCode, GS1, USPS IMb i ponad 50 innych |
| Zakres formatów 2D | Kod QR, DataMatrix | QR Code, DataMatrix, PDF417, Micro PDF417, Aztec, MaxiCode |
Szybki start
Krok 1: Zastąp pakiety NuGet
Usuń pakiet kodów kreskowychSyncfusiondla używanej platformy. Jeśli projekt jest przeznaczony dla wielu platform, uruchom usuwanie dla każdej z nich:
# Blazor
dotnet remove package Syncfusion.Blazor.BarcodeGenerator
# WinForms
dotnet remove package Syncfusion.SfBarcode.Windows
# WPF
dotnet remove package Syncfusion.SfBarcode.WPF
# MAUI
dotnet remove package Syncfusion.Maui.Barcode
Jeśli po usunięciu pakietu BarCode w projekcie nie pozostały żadne inne pakiety Syncfusion, usuń również pakiet licencyjny:
dotnet remove package Syncfusion.Licensing
Zainstaluj IronBarcode— jeden pakiet dla wszystkich platform:
dotnet add package IronBarcode
Krok 2: Aktualizacja przestrzeni nazw
Usuń przestrzenie nazwSyncfusionBarCode i dodaj przestrzeń nazw IronBarcode:
// Remove these (barcode-specific; leave others if non-barcodeSyncfusioncontrols remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator (in _Imports.razor)
// Add this
using IronBarCode;
Krok 3: Inicjalizacja licencji
Usuń rejestrację licencjiSyncfusioni konfigurację platformy z sekcji uruchamiania aplikacji. Następnie dodaj pojedynczy wiersz licencji IronBarcode w tym samym miejscu:
// Remove from Program.cs / App.xaml.cs / MauiProgram.cs:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
builder.Services.AddSyncfusionBlazor(); // Blazor only — remove if no otherSyncfusioncontrols
builder.ConfigureSyncfusionCore(); // MAUI only — remove if no otherSyncfusioncontrols
// Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
W przypadku potoków CI/CD i kontenerów Docker należy zapisać klucz w zmiennej środowiskowej:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")Przykłady migracji kodu
WinForms SfBarcode do BarcodeWriter
Migracja WinForms eliminuje DrawToBitmap i zastępuje ją bezpośrednim łańcuchem wyjściowym pliku. WzórSyncfusionwymaga wcześniejszego przydziału Bitmap o znanych wymiarach;IronBarcode oblicza wymiary w ramach wywołania generującego.
Podejście firmy Syncfusion:
using Syncfusion.Windows.Forms.Barcode;
using System.Drawing;
using System.Drawing.Imaging;
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "ORD-20240315-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.BarHeight = 100;
barcode.NarrowBarWidth = 1;
barcode.ShowText = true;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("order-label.png", ImageFormat.Png);Imports Syncfusion.Windows.Forms.Barcode
Imports System.Drawing
Imports System.Drawing.Imaging
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
Dim barcode As New SfBarcode()
barcode.Text = "ORD-20240315-001"
barcode.Symbology = BarcodeSymbolType.Code128A
barcode.BarHeight = 100
barcode.NarrowBarWidth = 1
barcode.ShowText = True
barcode.Width = 400
barcode.Height = 150
Using bitmap As New Bitmap(barcode.Width, barcode.Height)
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle)
bitmap.Save("order-label.png", ImageFormat.Png)
End UsingPodejście IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.AddBarcodeText()
.SaveAsPng("order-label.png");Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.AddBarcodeText() _
.SaveAsPng("order-label.png")BarcodeSymbolType.Code128A mapuje się do BarcodeEncoding.Code128. Sekwencja DrawToBitmap + Bitmap.Save redukuje się do .SaveAsPng(). Jeśli kod kreskowy musi być wyświetlony wewnątrz komponentu WinForms PictureBox zamiast być zapisany na dysku, użyj .ToPngBinaryData() do załadowania obrazu do kontrolki. Pełen zakres formatów kodów kreskowych 1D w IronBarcode znacznie wykracza poza listę obsługiwanych formatów przez kontrolkę Syncfusion.
Blazor SfBarcodeGenerator do minimalnego punktu końcowego API
Migracja do Blazora to raczej zmiana strukturalna niż zamiana linii po linii. SfBarcodeGenerator to komponent Razor, który renderuje się w przeglądarce przez warstwę JavaScript Syncfusion.IronBarcode nie posiada komponentu Razor; Jest to biblioteka po stronie serwera. Wzorzec zastępczy to minimalny punkt końcowy API na serwerze, który zwraca bajty kodu kreskowego, odwołujące się w stronie Razor jako źródło obrazu.
Podejście firmy Syncfusion:
@page "/fulfillment"
@using Syncfusion.Blazor.BarcodeGenerator
<SfBarcodeGenerator
Width="300px"
Height="150px"
Type="BarcodeType.Code128"
Value="@orderNumber">
<BarcodeGeneratorDisplayText Visibility="true"></BarcodeGeneratorDisplayText>
</SfBarcodeGenerator>
@code {
private string orderNumber = "ORD-20240315-001";
}
Podejście IronBarcode:
Dodaj punkt końcowy generowania w Program.cs:
using IronBarCode;
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.AddBarcodeText()
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});Imports IronBarCode
app.MapGet("/barcode/{value}", Function(value As String)
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(300, 150) _
.AddBarcodeText() _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)Odwołaj się do punktu końcowego w komponencie Razor:
@page "/fulfillment"
<img src="/barcode/@orderNumber" alt="Order barcode: @orderNumber" />
@code {
private string orderNumber = "ORD-20240315-001";
}
Ten punkt końcowy można testować niezależnie, można go ponownie wykorzystać z dowolnego klienta HTTP i jest on zgodny z Blazor Server, Blazor WebAssembly z hostowanym backendem API oraz dowolnym innym frontendem internetowym.
Generowanie kodów QR
KomponentSyncfusionQR jest również renderowany przez przeglądarkę bez ścieżki wyjściowej po stronie serwera.IronBarcode generuje kody QR po stronie serwera z bezpośrednim wypisem do pliku.
Podejście firmy Syncfusion:
@using Syncfusion.Blazor.BarcodeGenerator
<SfQRCodeGenerator
Width="300px"
Height="300px"
Value="https://example.com/product/ABC-123">
<QRCodeGeneratorDisplayText Visibility="false">
</QRCodeGeneratorDisplayText>
</SfQRCodeGenerator>
Podejście IronBarcode:
using IronBarCode;
// Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300,
QRCodeWriter.QrErrorCorrectionLevel.High)
.SaveAsPng("product-qr.png");
// QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("product-qr-branded.png");Imports IronBarCode
' Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300, QRCodeWriter.QrErrorCorrectionLevel.High) _
.SaveAsPng("product-qr.png")
' QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("product-qr-branded.png")Zastąpienie czytania OPX
Jeśli w projekcie używano czytnika kodów kreskowych BarCode OPX — lub odłożono wymóg odczytu do przyszłego zakupu OPX —IronBarcode zastępuje tę zależność pakietem, który jest już zainstalowany. Brak produktu dodatkowego, brak drugiej licencji.
PodejścieSyncfusion(BarCode Reader OPX):
// Requires separateSyncfusionBarCode Reader OPX purchase
// OPX wraps ZXing.Net internally (Apache 2.0 — free to use directly)
using Syncfusion.BarcodeReader;
var reader = new BarcodeReader();
var results = reader.ReadBarcodes("warehouse-scan.png");
foreach (var result in results)
Console.WriteLine($"Value: {result.Value}");
Podejście IronBarcode:
using IronBarCode;
// Included in the same NuGet package as generation — no second product required
var results = BarcodeReader.Read("warehouse-scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Confidence: {result.Confidence}%");
}Imports IronBarCode
' Included in the same NuGet package as generation — no second product required
Dim results = BarcodeReader.Read("warehouse-scan.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Confidence: {result.Confidence}%")
NextDokumentacja dotycząca odczytu kodów kreskowych obejmuje odczyt z tablic bajtów dla procedur obsługi przesyłania, dostosowanie szybkości w stosunku do dokładności oraz wykrywanie wielu kodów kreskowych.
Generowanie BarCode'ów w formacie PDF
Kontrolki BarCodeSyncfusionnie mają ścieżki wyjściowej PDF.IronBarcode traktuje PDF jako format wyjściowy pierwszej klasy.
Podejście firmy Syncfusion:
// Nie direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: LoadSyncfusionPDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
Podejście IronBarcode:
using IronBarCode;
// Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPdf("pallet-label.pdf");
// Read barcodes from an existing PDF
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");Imports IronBarCode
' Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.SaveAsPdf("pallet-label.pdf")
' Read barcodes from an existing PDF
Dim pdfResults = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
NextPrzewodnik po generowaniu plików PDF z kodami kreskowymi obejmuje wielostronicowe pliki PDF oraz osadzanie kodów kreskowych obok innych treści dokumentu.
##SyncfusionBarCode API do IronBarcode Mapping Reference
| Syncfusion | IronBarcode |
|---|---|
SyncfusionLicenseProvider.RegisterLicense("KEY") | IronBarCode.License.LicenseKey = "key" |
builder.Services.AddSyncfusionBlazor() | Nie jest wymagane |
builder.ConfigureSyncfusionCore() | Nie jest wymagane |
new SfBarcode() | BarcodeWriter.CreateBarcode() (statyczny) |
barcode.Text = "value" | Pierwszy parametr CreateBarcode() |
barcode.Symbology = BarcodeSymbolType.Code128A | BarcodeEncoding.Code128 |
barcode.Symbology = BarcodeSymbolType.QRBarcode | QRCodeWriter.CreateQrCode() |
barcode.BarHeight = 100 | .ResizeTo(width, 100) |
barcode.ShowText = true | .AddBarcodeText() |
barcode.DrawToBitmap(bitmap, rect) | .SaveAsPng(path) |
Ręczne Bitmap → MemoryStream | .ToPngBinaryData() |
<SfBarcodeGenerator Type="BarcodeType.Code128" Value="..."> | BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) w punkcie końcowym API |
<SfQRCodeGenerator Value="..."> | QRCodeWriter.CreateQrCode(value, size) w punkcie końcowym API |
BarcodeType.Code128 (enum Blazor) | BarcodeEncoding.Code128 |
| Czytnik kodów kreskowych OPX (oddzielny produkt, wykorzystujący bibliotekę ZXing.Net) | BarcodeReader.Read(path) — natywnie, ten sam pakiet |
| Brak odczytu API w kontroli | BarcodeReader.Read(path) |
| Brak możliwości generowania plików PDF | .SaveAsPdf(path) |
| Brak możliwości odczytu plików PDF | BarcodeReader.Read("document.pdf") |
Typowe problemy związane z migracją i ich rozwiązania
Problem 1: Znak wodny wersji próbnej po aktualizacji NuGet
Syncfusion: Aktualizacja z Essential Studio 24.x do 25.x powoduje unieważnienie istniejącego klucza licencyjnego. Wszelkie dane wyjściowe wygenerowane przed aktualizacją magazynu kluczy będą zawierały znak wodny wersji próbnej. Jest to cicha awaria — aplikacja nadal działa, ale generuje wyniki niezgodne z wymaganiami.
Rozwiązanie: Po aktualizacji pakietu IronBarcode NuGet klucz licencyjny nie zmienia się w ramach tej samej wersji głównej. W przypadku wydania wersji z drobnymi zmianami lub poprawkami nie jest wymagana aktualizacja ani ponowne wdrożenie. Podczas aktualizacji do nowej głównej wersji należy zaktualizować klucz raz w punkcie wejścia aplikacji:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Problem 2: Funkcja DrawToBitmap nie działa w środowiskach bezinterfejsowych
Syncfusion: SfBarcode.DrawToBitmap zależy od potoku renderowania Windows Forms. W procesie ASP.NET Core, Azure Function lub kontenerze Docker na Linuxie, wywołanie DrawToBitmap spowoduje rzucenie InvalidOperationException lub wygenerowanie pustej bitmapy, ponieważ nie ma pętli komunikatów Windows Forms.
Rozwiązanie: Zastąp BarcodeWriter.CreateBarcode().IronBarcode generuje kody w kodzie zarządzanym bez żadnych zależności od środowiska uruchomieniowego interfejsu użytkownika:
// Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.ToPngBinaryData();' Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.ToPngBinaryData()Problem 3: SfBarcodeGenerator nie ma wyjścia po stronie serwera
Syncfusion: SfBarcodeGenerator to komponent Razor bez powierzchni API po stronie serwera. Próby użycia go w akcji kontrolera lub usłudze działającej w tle nie znajdą żadnej odpowiedniej metody do generowania bajtów kodu kreskowego BarCode.
Rozwiązanie: Utwórz minimalny punkt końcowy API, który generuje kod kreskowy po stronie serwera i zwraca go jako odpowiedź HTTP. Odniesienie do punktu końcowego z komponentu Razor za pomocą tagu <img src="...">:
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
app.MapGet("/barcode/{value}", Function(value As String)
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(300, 150) _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)Problem 4: Brak możliwości odczytu (nie zakupiono OPX)
Syncfusion: Projekty, w których odłożono odczyt kodów BARCODE, ponieważ nie zakupiono jeszcze OPX, nie mają kodu do odczytu, który należałoby przenieść. Dodanie możliwości odczytu od podstaw wymaga zakupu OPX, integracji oraz nowej Umowy licencyjnej.
Rozwiązanie: Odczyt kodów kreskowych IronBarcode jest zawarty w tym samym pakiecie. Nie jest wymagane żadne zamówienie ani dodatkowa licencja. Dodaj BarcodeReader.Read(path) zawsze, gdy potrzebny jest odczyt:
var results = BarcodeReader.Read("incoming-scan.png");Dim results = BarcodeReader.Read("incoming-scan.png")Problem 5: Wygaśnięcie licencji społecznościowej podczas migracji
Syncfusion: Zespół korzystający z licencji Community, który przekroczy dowolny próg kwalifikacyjny w okresie migracji — w tym zamknie rundę finansowania — może zauważyć, że kontrolkiSyncfusionprzestaną generować prawidłowe wyniki przed zakończeniem migracji.
Rozwiązanie: 30-dniowy okres próbny IronBarcode umożliwia pełną ocenę bez żadnych warunków dotyczących przychodów, liczby pracowników czy kapitału. Na wygenerowanym wyniku pojawia się znak wodny wersji próbnej; Aktywacja zakupionego klucza licencyjnego powoduje jego usunięcie. W modelu licencyjnym IronBarcode nie ma ograniczeń dotyczących wielkości organizacji.
Lista kontrolna migracji BarCode Syncfusion
Zadania przed migracją
Przeprowadź audyt kodu źródłowego, aby zlokalizować każdy plik odwołujący się do BarCODE-a Syncfusion:
grep -r "SyncfusionLicenseProvider.RegisterLicense\|AddSyncfusionBlazor\|ConfigureSyncfusionCore" --include="*.cs" .
grep -r "new SfBarcode\(\)\|SfBarcodeGenerator\|SfQRCodeGenerator" --include="*.cs" --include="*.razor" .
grep -r "BarcodeSymbolType\.\|BarcodeType\." --include="*.cs" --include="*.razor" .
grep -r "DrawToBitmap\|barcode\.Text\s*=" --include="*.cs" .
grep -r "Syncfusion\.Barcode\|Syncfusion\.Blazor\.BarcodeGenerator" --include="*.csproj" .
Przed napisaniem jakiegokolwiek kodu migracyjnego należy udokumentować następujące kwestie:
- Wypisz każdy plik, który wywołuje
SyncfusionLicenseProvider.RegisterLicense - Wypisz każde utworzenie
SfBarcodei przypisywanie jego właściwości - Wypisz każde użycie komponentu Razor
<SfBarcodeGenerator>i<SfQRCodeGenerator> - Wypisz każde wywołanie
DrawToBitmapi ścieżkę zapisu lub wyświetlania w dół strumienia - Sprawdź, czy zainstalowany jest program BarCode Reader OPX; jeśli tak, wymień wszystkie wezwania do odczytu
Zadania związane z aktualizacją kodu
- Usuń pakiety NuGet z kodami BARCODESyncfusiondla każdej platformy w projekcie
- Usuń pakiet NuGet
Syncfusion.Licensing, jeśli nie pozostają żadne inne kontrolki Syncfusion - Zainstaluj pakiet NuGet
IronBarcode - Zastąp
SyncfusionLicenseProvider.RegisterLicense("KEY")za pomocąIronBarCode.License.LicenseKey = "KEY"w punkcie wejścia aplikacji - Usuń
builder.Services.AddSyncfusionBlazor(), jeśli nie pozostają żadne inne kontrolki Syncfusion - Usuń
builder.ConfigureSyncfusionCore(), jeśli nie pozostają żadne inne kontrolki Syncfusion - Usuń
@using Syncfusion.Blazori@using Syncfusion.Blazor.BarcodeGeneratorz_Imports.razor, jeśli dotyczy - Zastąp
using Syncfusion.Windows.Forms.Barcodeiusing Syncfusion.Licensingza pomocąusing IronBarCode - Zastąp każdy blok
new SfBarcode()+ przypisania właściwości +DrawToBitmapza pomocąBarcodeWriter.CreateBarcode(value, BarcodeEncoding.X).ResizeTo(w, h).SaveAsPng(path) - Zastąp
BarcodeSymbolType.Code128A(i odpowiedniki) za pomocąBarcodeEncoding.Code128 - Zastąp
BarcodeType.Code128(enum Blazor) za pomocąBarcodeEncoding.Code128 - Zastąp każdy komponent Razor
<SfBarcodeGenerator>komponentem API minimalnym i odniesieniem<img src="...">w komponencie - Zastąp każdy komponent Razor
<SfQRCodeGenerator>komponentem APIQRCodeWriter.CreateQrCode()i odniesieniem<img src="..."> - Zastąp wszystkie wywołania odczytu Barcode Reader OPX za pomocą
BarcodeReader.Read(path) - Dodaj
BarcodeReader.Read(path)zawsze, gdy wcześniej brakowało możliwości odczytu z powodu braku zakupu OPX
Testy po migracji
- Sprawdź, czy wygenerowane obrazy BarCode nadają się do skanowania, używając skanera sprzętowego lub aplikacji do odczytu.
- Sprawdź, czy po aktywacji klucza licencyjnego na wygenerowanym pliku nie pojawiają się żadne znaki wodne wersji próbnej
- Potwierdź, że
BarcodeReader.Read()zwraca oczekiwaną wartość i format dla każdego używanego typu kodu kreskowego - Przetestuj wyjście PDF za pomocą
.SaveAsPdf(), aby potwierdzić, że wymiary strony i kodu kreskowego odpowiadają wymaganiom projektowym - Przetestuj bezpośrednio minimalny punkt końcowy API Blazor (przez przeglądarkę lub klienta HTTP) przed testowaniem w komponencie Razor
- Sprawdź, czy wdrożenie w środowisku Docker i Linux daje identyczne wyniki jak na komputerach programistycznych z systemem Windows
- Przeprowadź ostateczny audyt
grep, aby potwierdzić brak pozostałych odniesień doSfBarcode,SfBarcodeGenerator,DrawToBitmap,BarcodeSymbolType, lubSyncfusionLicenseProvider
Kluczowe korzyści wynikające z migracji do IronBarcode
Ujednolicone generowanie i odczyt: Po migracji zarówno generowanie, jak i odczyt działają za pośrednictwem jednego pakietu NuGet na jednej licencji. Nie ma potrzeby zakupu dodatkowego produktu, nauki obsługi kolejnego interfejsu API ani korzystania z opakowania ZXing.Net, które pochłania budżet licencyjny, który można by przeznaczyć na bezpośrednią bibliotekę open source.
Eliminacja rotacji kluczy specyficznej dla wersji: Klucze licencyjne IronBarcode zachowują ważność w przypadku aktualizacji pomniejszych i poprawek w ramach głównej wersji. Całkowicie eliminuje się nakłady operacyjne związane z uzyskiwaniem nowego klucza, aktualizowaniem sekretów w każdym środowisku wdrożeniowym oraz ponownym wdrażaniem w celu usunięcia znaków wodnych wersji próbnej przy każdej większej Aktualizacji wersji NuGet.
Wdrożenie niezależne od platformy: Ten sam pakiet IronBarcode i ten sam interfejs API generowania działają w aplikacjach desktopowych WinForms, usługach ASP.NET Core, Azure Functions, aplikacjach konsolowych oraz kontenerach Docker na systemie Linux. Zależność środowiska uruchomieniowego Windows Forms wprowadzonego przez DrawToBitmap jest usunięta, a wdrożenia Blazor przenoszą się z przeglądarek komponentów na API po stronie serwera, które jest niezależnie testowalne i agnostyczne dla klienta.
Natywna obsługa plików PDF: Generowanie i odczyt plików PDF odbywa się w sposób natywny. Tworzenie pliku PDF z kodem kreskowym nie wymaga już koordynacji dwóch produktów Syncfusion; Odczytywanie BarCodes z manifestów PDF i dokumentów wysyłkowych nie wymaga już oddzielnego etapu ekstrakcji plików PDF.
Przewidywalna ekonomika licencji: Model licencji wieczystej IronBarcode nie nakłada żadnych limitów dotyczących przychodów, liczby pracowników ani kapitału. Zespoły, które przekroczyły warunki kwalifikacyjne licencjiSyncfusionCommunity License — lub które przewidują, że tak się stanie — przechodzą na model licencyjny, w którym rozwój organizacji nie powoduje konieczności dostosowania się do nowych warunków.

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ęczników.