
DevExpress BarCode vs IronBarcode: UI Control vs Samodzielna Biblioteka
DevExpress to ceniony zestaw narzędzi UI dla platformy .NET. Siatka, harmonogram, wykres i kontrolki tabeli przestawnej są szeroko używane przez zespoły Enterprise. Obsługa BARCODE to jednak zupełnie inna historia. DevExpress dostarcza BarCodeControl - kontrolkę WinForms i znacznik Blazor DxBarCode - który pozwala na renderowanie kodu kreskowego na formularzu. Wsparcie DevExpress potwierdziło, że brak modlu odczytu i nie ma planów jego dodania. Jeśli BarCodes znajdują się w zadaniu w tle, interfejsie API sieci Web, dokumencie PDF lub dowolnym środowisku bez formularza interfejsu użytkownika, to ograniczenie nie ma zastosowania.
To ograniczenie zawęża ofertę kodów kreskowych DevExpress do konkretnej niszy: wizualnego renderowania kodów kreskowych w interfejsie użytkownika DevExpress WinForms lub Blazor. W tej niszy działa to dobrze. Do wszystkiego innego - generowania po stronie serwera, odczytu z obrazów lub plików PDF, przetwarzania bezinterfejsowego w Azure Functions lub kontenerach Docker - potrzebne jest inne narzędzie.
Zrozumienie kontrolek BarCode DevExpress
DevExpress BarCodeControl znajduje się w DevExpress.XtraEditors, z klasami generatora symboliki w DevExpress.XtraPrinting.BarCode. Nie jest to biblioteka samodzielna. Jest ono związane z pakietem DXperience, który zaczyna się od 1 699,99 USD rocznie (subskrypcje Universal to 2 299,99 USD). Nie ma osobnego pakietu NuGet zawierającego wyłącznie kody kreskowe, który można by zainstalować.
BarCodeControl to kontrolka WinForms. Konfiguruje się to za pomocą obiektu symbologii, ustawia właściwości, a następnie wyświetla się na ekranie. Zapisanie tego renderingu do pliku wymaga wywołania DrawToBitmap, które oczekuje wstępnie przypisanego Bitmap odpowiedniego rozmiaru:
// DevExpress WinForms: UI control, not a library
using DevExpress.XtraEditors; // BarCodeControl
using DevExpress.XtraPrinting.BarCode; // Code128Generator, etc.
using System.Drawing;
using System.Drawing.Imaging;
var barCode = new BarCodeControl();
var symbology = new Code128Generator();
symbology.CharacterSet = Code128CharacterSet.CharsetAuto;
barCode.Symbology = symbology;
barCode.Text = "ITEM-12345";
barCode.Module = 0.02f; // document units, not pixels
barCode.ShowText = true;
// File output requires DrawToBitmap — you must size the Bitmap manually
barCode.Width = 400;
barCode.Height = 100;
var bitmap = new Bitmap(barCode.Width, barCode.Height);
barCode.DrawToBitmap(bitmap, new Rectangle(0, 0, barCode.Width, barCode.Height));
bitmap.Save("barcode.png", ImageFormat.Png);
bitmap.Dispose();Imports DevExpress.XtraEditors
Imports DevExpress.XtraPrinting.BarCode
Imports System.Drawing
Imports System.Drawing.Imaging
Dim barCode As New BarCodeControl()
Dim symbology As New Code128Generator()
symbology.CharacterSet = Code128CharacterSet.CharsetAuto
barCode.Symbology = symbology
barCode.Text = "ITEM-12345"
barCode.Module = 0.02F ' document units, not pixels
barCode.ShowText = True
' File output requires DrawToBitmap — you must size the Bitmap manually
barCode.Width = 400
barCode.Height = 100
Dim bitmap As New Bitmap(barCode.Width, barCode.Height)
barCode.DrawToBitmap(bitmap, New Rectangle(0, 0, barCode.Width, barCode.Height))
bitmap.Save("barcode.png", ImageFormat.Png)
bitmap.Dispose()Imports DevExpress.XtraEditors
Imports DevExpress.XtraPrinting.BarCode
Imports System.Drawing
Imports System.Drawing.Imaging
Dim barCode As New BarCodeControl()
Dim symbology As New Code128Generator()
symbology.CharacterSet = Code128CharacterSet.CharsetAuto
barCode.Symbology = symbology
barCode.Text = "ITEM-12345"
barCode.Module = 0.02F ' document units, not pixels
barCode.ShowText = True
' File output requires DrawToBitmap — you must size the Bitmap manually
barCode.Width = 400
barCode.Height = 100
Dim bitmap As New Bitmap(barCode.Width, barCode.Height)
barCode.DrawToBitmap(bitmap, New Rectangle(0, 0, barCode.Width, barCode.Height))
bitmap.Save("barcode.png", ImageFormat.Png)
bitmap.Dispose()Zwróć uwagę na kilka punktów spornych w tym tekście. Po pierwsze, barCode.Module jest w jednostkach dokumentu, a nie w pikselach, co powoduje niezgodność, jeśli myślisz w kategoriach wymiarów pikseli. Po drugie, musisz znać ostateczny rozmiar w pikselach przed przypisaniem Bitmap. Po trzecie, kontrolka wymaga załadowania zestawów WinForms - co oznacza, że minimalny interfejs API .NET Core lub konsolowa usługa działająca w tle musi załadować infrastrukturę Windows Forms tylko po to, aby wygenerować obraz BARCODE.
Znacznik Blazor DxBarCode jest koncepcyjnie podobny, ale jest składnikiem Razor do renderowania UI, a nie API do generowania po stronie serwera.
Brak możliwości czytania
Oficjalne stanowisko firmy DevExpress jest takie, że nie zapewnia ona funkcji rozpoznawania BarCode ani skanowania. Centrum wsparcia DevExpress informuje: "Kontrolka DevExpress BarCode jest przeznaczona wyłącznie do generacji kodów kreskowych. Nie dostarczamy funkcjonalności rozpoznawania/skanowania kodów kreskowych." Obecnie nie ma planów dodania tej funkcji.
W przypadku zespołów, które zaczynają od aplikacji DevExpress WinForms, a później otrzymują wymaganie skanowania BARCODE'a z przesłanego obrazu lub odczytu kodu QR z załącznika PDF, zestaw narzędzi DevExpress nie może pomóc. Konieczne będzie wprowadzenie oddzielnej biblioteki do obsługi odczytu, co natychmiast rodzi pytanie, czy strona generująca również powinna przejść do tej biblioteki w celu zachowania spójności API.
IronBarcode obsługuje oba kierunki:
//IronBarcode reading — works on images, PDFs, and byte arrays
// NuGet: dotnet add package IronBarcode
using IronBarCode;
var results = BarcodeReader.Read("scanned-label.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}//IronBarcode reading — works on images, PDFs, and byte arrays
// NuGet: dotnet add package IronBarcode
using IronBarCode;
var results = BarcodeReader.Read("scanned-label.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}Imports IronBarCode
Dim results = BarcodeReader.Read("scanned-label.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
NextImports IronBarCode
Dim results = BarcodeReader.Read("scanned-label.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
NextOdczytywanie z pliku PDF nie wymaga żadnych dodatkowych bibliotek:
// Reading barcodes from a PDF — no PdfiumViewer or similar required
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page barcode: {result.Value}");
}// Reading barcodes from a PDF — no PdfiumViewer or similar required
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page barcode: {result.Value}");
}Imports System
' Reading barcodes from a PDF — no PdfiumViewer or similar required
Dim pdfResults = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In pdfResults
Console.WriteLine($"Page barcode: {result.Value}")
NextImports System
' Reading barcodes from a PDF — no PdfiumViewer or similar required
Dim pdfResults = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In pdfResults
Console.WriteLine($"Page barcode: {result.Value}")
NextProblem z pakietami Suite
Komponenty BarCode DevExpress nie są sprzedawane jako samodzielny produkt. Aby używać BarCodeControl w dowolnym projekcie, Twoja ekipa potrzebuje subskrypcji DevExpress - poziom ASP.NET & Blazor zaczyna się od 1 099,99 USD rocznie, DXperience (WinForms + WPF) to 1 699,99 USD rocznie, a Universal kosztuje 2 299,99 USD rocznie. Suite zawiera kontrolki siatki, wykresów, harmonogramu, tabeli przestawnej i wiele innych - co jest uzasadnione, jeśli tworzysz pełną aplikację DevExpress WinForms lub Blazor. Jeśli potrzebujesz tylko generowania kodów kreskowych dla usługi backendowej, płacisz za cały zestaw narzędzi UI, z którego ta usługa nigdy nie skorzysta.
IronBarcode to samodzielny pakiet:
dotnet add package IronBarcode
Cena Licencji wieczystej Lite zaczyna się od 749 USD dla jednego programisty. W pakiecie nie ma zestawu narzędzi UI. Otrzymujesz generowanie i odczyt BARCODE-ów, obsługę wielu platform i nic więcej, o co nie prosiłeś.
Ograniczenia dotyczące korzystania z trybu bezinterfejsu
Podstawowym problemem z BarCodeControl w scenariuszach po stronie serwera jest to, że jest to kontrolka WinForms. W projekcie minimalnego API .NET 6+ ASP.NET Core zestawy WinForms nie są domyślnie odwołane. Aby wystartować BarCodeControl, Twój projekt API musi albo wyraźnie celować w Windows i załadować środowisko uruchomieniowe Windows Forms, albo dodać odniesienia obejściowe, które wciągają infrastrukturę UI, którą Twoje API nigdy nie wyrenderuje.
W planie konsumpcyjnym funkcji Azure nie ma w ogóle warstwy interfejsu użytkownika. W kontenerze Docker z obrazem bazowym Linux zależności Windows Forms GDI+ mogą w ogóle nie występować. DevExpress nie wspiera oficjalnie użycia BarCodeControl w tych bezgłowych środowiskach.
IronBarcode wykorzystuje w pełni programowe, statyczne API:
// IronBarcode: works in WinForms, ASP.NET Core, Azure Function, console — same code
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");// IronBarcode: works in WinForms, ASP.NET Core, Azure Function, console — same code
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");Imports IronBarCode
' IronBarcode: works in WinForms, ASP.NET Core, Azure Function, console — same code
' NuGet: dotnet add package IronBarcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")Imports IronBarCode
' IronBarcode: works in WinForms, ASP.NET Core, Azure Function, console — same code
' NuGet: dotnet add package IronBarcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")To konkretne wywołanie działa w aplikacji konsolowej, kontrolerze .NET Core, funkcji Azure Function uruchamianej przez komunikat Service Bus lub kontenerze Docker działającym w systemie Linux. API nie zmienia się w zależności od środowiska. Nie ma zależności od zestawu UI.
Punkt końcowy ASP.NET Core, który zwraca BARCODE jako plik PNG, wygląda następująco:
app.MapGet("/barcode/{sku}", (string sku) =>
{
var bytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});app.MapGet("/barcode/{sku}", (string sku) =>
{
var bytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
app.MapGet("/barcode/{sku}", Function(sku As String)
Dim bytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
app.MapGet("/barcode/{sku}", Function(sku As String)
Dim bytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)Nie ma równoważnego wzorca z BarCodeControl bez znaczących obejść.
Zrozumienie IronBarcode
IronBarcode to samodzielna biblioteka .NET służąca do generowania i odczytywania kodów kreskowych. API jest w pełni statyczne - nie ma instancji do zarządzania, nie ma cyklu życia kontrolki, nie ma zależności od interfejsu użytkownika. Generowanie i odczyt działają w tym samym wywołaniu:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Generate Code 128
BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128)
.ResizeTo(450, 120)
.SaveAsPng("order-label.png");
// Generate and get bytes (for HTTP responses, blob storage, etc.)
byte[] pngBytes = BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128)
.ResizeTo(450, 120)
.ToPngBinaryData();
// Read from an image file
var results = BarcodeReader.Read("order-label.png");
Console.WriteLine(results.First().Value); // ORDER-9921// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Generate Code 128
BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128)
.ResizeTo(450, 120)
.SaveAsPng("order-label.png");
// Generate and get bytes (for HTTP responses, blob storage, etc.)
byte[] pngBytes = BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128)
.ResizeTo(450, 120)
.ToPngBinaryData();
// Read from an image file
var results = BarcodeReader.Read("order-label.png");
Console.WriteLine(results.First().Value); // ORDER-9921Imports IronBarCode
' Generate Code 128
BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128) _
.ResizeTo(450, 120) _
.SaveAsPng("order-label.png")
' Generate and get bytes (for HTTP responses, blob storage, etc.)
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128) _
.ResizeTo(450, 120) _
.ToPngBinaryData()
' Read from an image file
Dim results = BarcodeReader.Read("order-label.png")
Console.WriteLine(results.First().Value) ' ORDER-9921Imports IronBarCode
' Generate Code 128
BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128) _
.ResizeTo(450, 120) _
.SaveAsPng("order-label.png")
' Generate and get bytes (for HTTP responses, blob storage, etc.)
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("ORDER-9921", BarcodeEncoding.Code128) _
.ResizeTo(450, 120) _
.ToPngBinaryData()
' Read from an image file
Dim results = BarcodeReader.Read("order-label.png")
Console.WriteLine(results.First().Value) ' ORDER-9921Aktywacja licencji to pojedynczy wiersz podczas uruchamiania:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Brak połączenia sieciowego. Bez standardowych fraz dotyczących obsługi błędów. Walidacja lokalna.
Kod QR obok
Kody QR ilustrują lukę API między kontrolką interfejsu użytkownika a biblioteką programistyczną.
QR DevExpress - kontrolka WinForms:
// DevExpress: QR via BarCodeControl + QRCodeGenerator symbology
using DevExpress.XtraEditors; // BarCodeControl
using DevExpress.XtraPrinting.BarCode; // QRCodeGenerator + QRCodeErrorCorrectionLevel
var barCode = new BarCodeControl();
var symbology = new QRCodeGenerator();
symbology.ErrorCorrectionLevel = QRCodeErrorCorrectionLevel.H;
symbology.CompactionMode = QRCodeCompactionMode.AlphaNumeric;
barCode.Symbology = symbology;
barCode.Text = "https://example.com";
barCode.Width = 500;
barCode.Height = 500;
var bitmap = new Bitmap(barCode.Width, barCode.Height);
barCode.DrawToBitmap(bitmap, new Rectangle(0, 0, barCode.Width, barCode.Height));
bitmap.Save("qr.png", ImageFormat.Png);
bitmap.Dispose();// DevExpress: QR via BarCodeControl + QRCodeGenerator symbology
using DevExpress.XtraEditors; // BarCodeControl
using DevExpress.XtraPrinting.BarCode; // QRCodeGenerator + QRCodeErrorCorrectionLevel
var barCode = new BarCodeControl();
var symbology = new QRCodeGenerator();
symbology.ErrorCorrectionLevel = QRCodeErrorCorrectionLevel.H;
symbology.CompactionMode = QRCodeCompactionMode.AlphaNumeric;
barCode.Symbology = symbology;
barCode.Text = "https://example.com";
barCode.Width = 500;
barCode.Height = 500;
var bitmap = new Bitmap(barCode.Width, barCode.Height);
barCode.DrawToBitmap(bitmap, new Rectangle(0, 0, barCode.Width, barCode.Height));
bitmap.Save("qr.png", ImageFormat.Png);
bitmap.Dispose();Imports DevExpress.XtraEditors ' BarCodeControl
Imports DevExpress.XtraPrinting.BarCode ' QRCodeGenerator + QRCodeErrorCorrectionLevel
Imports System.Drawing
Imports System.Drawing.Imaging
Dim barCode As New BarCodeControl()
Dim symbology As New QRCodeGenerator()
symbology.ErrorCorrectionLevel = QRCodeErrorCorrectionLevel.H
symbology.CompactionMode = QRCodeCompactionMode.AlphaNumeric
barCode.Symbology = symbology
barCode.Text = "https://example.com"
barCode.Width = 500
barCode.Height = 500
Dim bitmap As New Bitmap(barCode.Width, barCode.Height)
barCode.DrawToBitmap(bitmap, New Rectangle(0, 0, barCode.Width, barCode.Height))
bitmap.Save("qr.png", ImageFormat.Png)
bitmap.Dispose()Imports DevExpress.XtraEditors ' BarCodeControl
Imports DevExpress.XtraPrinting.BarCode ' QRCodeGenerator + QRCodeErrorCorrectionLevel
Imports System.Drawing
Imports System.Drawing.Imaging
Dim barCode As New BarCodeControl()
Dim symbology As New QRCodeGenerator()
symbology.ErrorCorrectionLevel = QRCodeErrorCorrectionLevel.H
symbology.CompactionMode = QRCodeCompactionMode.AlphaNumeric
barCode.Symbology = symbology
barCode.Text = "https://example.com"
barCode.Width = 500
barCode.Height = 500
Dim bitmap As New Bitmap(barCode.Width, barCode.Height)
barCode.DrawToBitmap(bitmap, New Rectangle(0, 0, barCode.Width, barCode.Height))
bitmap.Save("qr.png", ImageFormat.Png)
bitmap.Dispose()Kod QR IronBarcode - ten sam wynik, bez konieczności montażu interfejsu użytkownika:
// IronBarcode: QR in one method chain
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");// IronBarcode: QR in one method chain
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng("qr.png");netnetDodanie logo marki na środku kodu QR:
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("qr-branded.png");QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("qr-branded.png");QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("qr-branded.png")QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("qr-branded.png")DevExpress nie posiada odpowiedników dla wbudowanych logo. Kontrolka wyświetla standardowy kod QR i nic więcej.
Porównanie funkcji
| Funkcja | DevExpress BarCode | IronBarcode |
|---|---|---|
| Generowanie BarCode | Tak (kontrolka WinForms, tag Blazor) | Tak (programowe API, wszystkie środowiska) |
| Odczytywanie/skanowanie BarCode | Nie - oficjalnie potwierdzone | Tak - obrazy, pliki PDF, tablice bajtów |
| Odczytywanie BarCodes z plików PDF | Nie | Tak - natywne, bez dodatkowej biblioteki |
| Samodzielny pakiet NuGet | Nie - Suite DXperience nie jest wymagana | Tak - tylko IronBarcode |
| Koszt Suite | Od 1 099,99 USD/rok (ASP.NET & Blazor) do 2 299,99 USD/rok (Universal) | N/A - samodzielny |
| Koszt licencji | Tylko w ramach subskrypcji | Licencja wieczysta od 749 USD |
| ASP.NET Core / minimalne API | Wymaga obejść dla WinForms | Wsparcie native |
| Azure Functions | Nieobsługiwane w trybie bezinterfejsowym | Pełne wsparcie |
| Docker / Linux | Problemy z GDI+ na obrazach bazowych systemu Linux | Pełne wsparcie |
| Aplikacje konsolowe | Wymaga ładowania zestawu WinForms | Wsparcie native |
| Generowanie kodów QR | Tak (za pomocą symboliki QRCodeGenerator) | Tak (QRCodeWriter) |
| QR z wbudowanym logo | Nie | Tak - .AddBrandLogo() |
| Poziomy korekcji błędów QR | H, Q, M, L | Najwyższy, Wysoki, Średni, Niski |
| Kod 128 | Tak | Tak |
| Data Matrix | Tak | Tak |
| PDF417 | Tak | Tak |
| Aztec | Tak | Tak |
| Plik wyjściowy | DrawToBitmap - ręczne przydzielanie bitmapy | .SaveAsPng(), .SaveAsGif(), .SaveAsSvg() |
| Wynik binarny (odpowiedź HTTP) | Ręczne Bitmap → MemoryStream | .ToPngBinaryData() |
| Czytanie wielowątkowe | N/A - brak tekstu do przeczytania | MaxParallelThreads = 4 |
| Odczyt wielu BarCodes | N/A - brak tekstu do przeczytania | ExpectMultipleBarcodes = true |
| Platformy | Windows (WinForms / Blazor) | Windows, Linux, macOS, Docker, Azure, AWS Lambda |
| Obsługa wersji .NET | .NET Framework + nowoczesny .NET (Windows) | .NET Framework 4.6.2 do aktualnych .NET |
Przewodnik po mapowaniu API
Zespoły zaznajomione z wzorcem DevExpress BarCodeControl uznają te równoważności za przydatne:
| DevExpress BarCode | IronBarcode |
|---|---|
new BarCodeControl() | Statyczne - nie wymaga instancji |
new Code128Generator() + barCode.Symbology = symbology | BarcodeEncoding.Code128 podany jako parametr |
new QRCodeGenerator() + QRCodeErrorCorrectionLevel.H | QRCodeWriter.CreateQrCode("data", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) |
new DataMatrixGenerator() + DataMatrixSize.Matrix26x26 | BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix) |
new PDF417Generator() | BarcodeWriter.CreateBarcode("data", BarcodeEncoding.PDF417) |
new AztecGenerator() | BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Aztec) |
barCode.Module = 0.02f (jednostki dokumentu) | .ResizeTo(width, height) (piksele) |
barCode.ShowText = true | .AddBarcodeText() |
DrawToBitmap(bitmap, rect) - ręczne przydzielanie bitmapy | .SaveAsPng(path) - automatycznie obsługuje rozmiarowanie |
Ręczne Bitmap → MemoryStream dla odpowiedzi HTTP | .ToPngBinaryData() |
| Brak API do odczytu | BarcodeReader.Read(imagePath) |
| Brak wynikowego typu odczytu | .Value (string), .Format (BarcodeEncoding) |
| W każdym projekcie wymagany jest montaż interfejsu użytkownika | Działa w każdym typie projektu .NET |
| Tylko Suite (od 1 099,99 USD/rok) | Wersja samodzielna (od 749 USD – licencja wieczysta) |
Kiedy zespoły się zmieniają
Kilka konkretnych scenariuszy często powoduje przejście z kontrolek BARCODE DevExpress na IronBarcode.
Pojawia się zapotrzebowanie na czytanie. Najczęstszym scenariuszem jest aplikacja WinForms, która od lat generuje BARCODES, a teraz pojawia się prośba o nową funkcję: aplikacja musi teraz skanować lub weryfikować BARCODES z przesłanych obrazów lub zdjęć zrobionych aparatem. DevExpress nie posiada API do odczytu. Zespół i tak potrzebuje nowej biblioteki, więc sensowne jest skonsolidowanie generowania w tej samej bibliotece.
Potrzeba punktu końcowego API sieciowego. Zespół tworzy mikrousługę, która generuje etykiety z kodami BarCode na żądanie - wywoływane z interfejsu użytkownika, aplikacji mobilnej lub innej usługi. Projekt ASP.NET Core nie ma zależności od WinForms, a zespół nie chce jej dodawać. Statyczne API IronBarcode integruje się z punktem końcowym HTTP bez zbędnego obciążenia związanego z interfejsem użytkownika.
Wdrożenie funkcji Azure lub Lambda. Wdrożenia bezserwerowe często wykorzystują obrazy bazowe systemu Linux i minimalne środowiska uruchomieniowe. BarCodeControl nie jest zaprojektowany dla tego środowiska.IronBarcode działa na systemie Linux, w kontenerach Docker, w Azure Functions oraz w AWS Lambda bez konieczności wprowadzania zmian w konfiguracji.
Koszt odnowienia Suite dla jednej funkcji. Gdy nadchodzi czas odnowienia i zespół analizuje, co faktycznie używają z pakietu DXperience, odkrycie, że jedynym komponentem DevExpress w konkretnym serwisie jest BarCodeControl prowadzi do rozmowy o kosztach. Opłacenie pełnej subskrypcji DXperience (1 699,99 USD/rok nowa, 849,99 USD/rok przy odnowieniu) za generację kodów kreskowych, gdy samodzielna biblioteka kosztuje 749 USD na zawsze, to trudny argument.
Odczytywanie wielu kodów kreskowych z plików PDF. Procesy przetwarzania dokumentów - odczytywanie kodów kreskowych z plików PDF zawierających faktury, listy przewozowe lub zeskanowane formularze - wymagają zarówno obsługi formatu PDF, jak i możliwości odczytu.IronBarcode odczytuje dane bezpośrednio z plików PDF bez konieczności korzystania z dodatkowych bibliotek. DevExpress nie zapewnia żadnej z tych funkcji.
Wnioski
Oferta DevExpress w zakresie BarCode najlepiej rozumiana jest jako funkcja renderowania interfejsu użytkownika zawarta w zestawie narzędzi UI. Jeśli Twoja aplikacja to aplikacja WinForms lub Blazor, która już używa DevExpress do swoich kontrolek siatki i wykresu, a Twoja jedyna potrzeba kodu kreskowego to wizualne wyświetlenie kodu kreskowego na formularzu, BarCodeControl jest rozsądnym wyborem - już masz licencję.
W momencie, gdy potrzebujesz któregokolwiek z następujących, BarCodeControl przestaje być odpowiednim narzędziem: odczytywania kodów kreskowych, generowania kodów kreskowych w kontekście po stronie serwera, działania w bezgłowym środowisku, pracy na Linuxie, lub działa bez odniesienia do zestawów WinForms. Dział pomocy technicznej DevExpress potwierdził, że nie ma funkcji czytania i nie planuje jej dodawać. Ograniczenie dotyczące trybu bezinterfejsu ma charakter architektoniczny, a nie konfiguracyjny. Element interfejsu użytkownika to element interfejsu użytkownika.
IronBarcode jest stworzony do programowej obsługi kodów kreskowych - generowania i odczytu za pomocą statycznego API, w dowolnym środowisku i na dowolnej platformie. Te dwa narzędzia rozwiązują różne problemy. BarCode DevExpress służy do renderowania wewnątrz formularza.IronBarcodesłuży do przetwarzania kodów kreskowych w kodzie.
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.
Powiązane artykuły


