MESCIUSComponentOne C1BarCodevs IronBarcode
Kontrola kodów kreskowych MESCIUS ComponentOne (dawniej GrapeCity, przemianowana w 2023) generuje kody kreskowe w aplikacjach Windows Forms, WPF, WinUI, Blazor i ASP.NET Core MVC. Radzi sobie z tym dobrze — API jest przejrzyste, jakość wyników jest solidna, a integracja z projektantem WinForms przebiega naturalnie. Jednak zakres jego działania jest wąski. Nie potrafi odczytywać barcode'ów. Edycje WinForms i WPF działają na docelowym frameworku tylko dla Windows. I nie jest to samodzielny produkt — jest dostarczany jako część ComponentOne Studio Enterprise, subskrypcji 1 299 USD/deweloper/rok, która obejmuje ponad 100 kontrolek UI. Jeśli rozważasz opcje BARCODE dla projektu .NET i znalazłeś ComponentOne na liście porównawczej, ten artykuł wyjaśnia, co ten zakres oznacza w praktyce.
Zrozumienie C1BarCode
C1BarCode to wizualna kontrola. Przepływ pracy generowania tworzy instancję, ustawia właściwości i wywołuje GetImage(), aby pobrać System.Drawing.Image:
// ComponentOne C1BarCode
using C1.Win.Barcode;
using C1.BarCode;
using System.Drawing;
// License must be set before first use
C1.C1License.Key = "YOUR-COMPONENTONE-KEY";
var barcode = new C1BarCode();
barcode.CodeType = CodeType.Code128;
barcode.Text = "ITEM-12345";
barcode.BarHeight = 100;
barcode.ModuleSize = 2;
barcode.ShowText = true;
barcode.CaptionPosition = CaptionPosition.Below;
using var image = barcode.GetImage();
image.Save("barcode.png", System.Drawing.Imaging.ImageFormat.Png);Imports C1.Win.Barcode
Imports C1.BarCode
Imports System.Drawing
Imports System.Drawing.Imaging
' License must be set before first use
C1.C1License.Key = "YOUR-COMPONENTONE-KEY"
Dim barcode As New C1BarCode()
barcode.CodeType = CodeType.Code128
barcode.Text = "ITEM-12345"
barcode.BarHeight = 100
barcode.ModuleSize = 2
barcode.ShowText = True
barcode.CaptionPosition = CaptionPosition.Below
Using image As Image = barcode.GetImage()
image.Save("barcode.png", ImageFormat.Png)
End UsingInterfejs API ustawiający właściwości jest znany programistom WinForms — odpowiada on bezpośrednio powierzchni projektanta. CodeType, BarHeight, ModuleSize, ShowText oraz CaptionPosition to wszystkie właściwości widoczne dla projektanta, które działają identycznie w kodzie.
C1BarCode obsługuje 38 symbologii obejmujących mainstreamowe formaty 1D i 2D: Code 39, Code 128, EAN-8, EAN-13, UPC-A, UPC-E, ITF, QR Code, PDF417 i DataMatrix między innymi. Do generacji kodów kreskowych obejmuje typowe przypadki użycia.
Brak API do odczytu
Nie jest to luka, którą wypełnia opcja konfiguracyjna. Nie istnieje klasa C1BarCodeReader. Nie ma metody Decode() na C1BarCode. Kontrolka BarCode ComponentOne jest z założenia przeznaczona wyłącznie do generowania.
Jeśli Twoja aplikacja musi skanować kody kreskowe z przesłanych obrazów, weryfikować wydrukowane etykiety, przetwarzać dokumenty z osadzonymi kodami lub wyodrębniać dane z kodów QR w interfejsie API — nic z tego nie jest możliwe przy użyciu C1BarCode. Potrzebna byłaby osobna biblioteka do odczytu, co rodzi pytanie, dlaczego miałbyś płacić za komponent służący wyłącznie do generowania kodów kreskowych w ramach Suite dla przedsiębiorstw zawierającej ponad 100 elementów sterujących, skoro samodzielne biblioteki kodów kreskowych obsługują obie operacje.
Brak API odczytu nie jest niczym niezwykłym w przypadku kontrolek BarCode WinForms przeznaczonych do wydruku. Decydującym czynnikiem jest rozszerzenie wymagań — a wymagania dotyczące BarCode prawie zawsze się rozszerzają.
Ograniczenie dotyczące wyłącznie systemu Windows
Edycje C1BarCode WinForms i WPF wymagają konfiguracji docelowego frameworku specyficznej dla Windows:
<!-- ComponentOne WinForms edition target -->
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
net8.0-windows oraz UseWindowsForms nie są opcjonalnymi preferencjami. C1.Win.BarCode zależy od rodzajów System.Windows.Forms — UserControl, PaintEventArgs, Graphics — które istnieją tylko na Windows. Usunięcie net8.0-windows powoduje błąd budowania. ComponentOne dostarcza edycje Blazor i ASP.NET Core MVC kontroli kodów kreskowych, które celują w TFM-y cross-platformowe, ale pakiety WinForms i WPF są związane z Windows.
W przeciwieństwie do tego,IronBarcode celuje w net8.0 (lub w jakikolwiek obsługiwany TFM) bez ograniczeń platformowych:
<!--IronBarcode— standard cross-platform target -->
<TargetFramework>net8.0</TargetFramework>
<!-- Nie UseWindowsForms required -->
<!-- Runs on Linux, macOS, Docker, Azure Functions -->
Ma to znaczenie w kilku praktycznych scenariuszach:
- Azure App Service na systemie Linux: domyślny plan dla nowych wdrożeń usługi App Service.
net8.0-windowsnie może na niego celować. - Kontenery Docker: standardem są kontenery Linux. Kontejner Windows jest większy, kosztuje więcej i nie jest dostępny w wielu warstwach chmury.
- ASP.NET Core Web API: Punkt końcowy do generowania kodów kreskowych, który można wdrożyć wyłącznie w systemie Windows, stanowi ograniczenie wdrożeniowe, które zespół będzie musiał ostatecznie usunąć.
- Azure Functions: Plan konsumpcyjny działa w systemie Linux. Funkcja generująca kody kreskowe z celem
net8.0-windowsnie może być wdrożona w planie konsumpcyjnym. - Rozwój w macOS: Deweloperzy na macOS nie mogą uruchomić projektu
net8.0-windowslokalnie, nawet do testowania logiki generowania.
Ograniczenia platformy nie stanowią problemu, jeśli aplikacja jest narzędziem desktopowym typu WinForms, które będzie działać wyłącznie w systemie Windows. Problem pojawia się w momencie, gdy wymagania dotyczące wdrożenia obejmują środowisko Linux lub chmurę.
Suite oprogramowania
Kontrola C1BarCode jest sprzedawana jako część ComponentOne Studio Enterprise, które obejmuje pełną suite kontrolera ComponentOne dla WinForms, WPF, Blazor i ASP.NET. Cena za ComponentOne Studio Enterprise to 1 299 USD na dewelopera na rok (subskrypcja); Pojedyncze edycje platformowe (WinForms lub WPF) kosztują 799 USD na dewelopera na rok.
Suite ta zawiera ponad 100 komponentów: siatki, wykresy, harmonogramy, kontrolki wprowadzania danych, projektanty raportów, kontrolki map, wskaźniki i wiele innych. Jeśli budujesz aplikację z dużą ilością danych i potrzebujesz wielu z tych kontrolek, ceniony zestaw może mieć sens. Jeśli potrzebujesz generacji kodów kreskowych i dotarłeś do ComponentOne, ponieważ pojawił się w wyszukiwaniu, kupujesz enterprise UI suite głównie dla jednej kontroli.
Pakiet NuGet jest C1.Win.BarCode dla WinForms (z C1.WPF.BarCode, C1.WinUI.BarCode, i C1.Blazor.BarCode dla innych platform) i jest licencjonowany poprzez subskrypcję ComponentOne Studio. Dla deweloperów, którzy chcą funkcjonalności kodów kreskowych bez pełnego zestawu, brakuje oddzielnej licencji tylko na kody kreskowe.
Struktura cenowa IronBarcode jest inna: to samodzielna biblioteka kodów kreskowych z licencjonowaniem wieczystym zaczynającym się od 749 USD dla pojedynczego dewelopera (Lite), 1 499 USD dla trzech (Plus), 2 999 USD dla dziesięciu (Professional), i 5 999 USD dla nieograniczonej liczby deweloperów. Nie ma kontrolki siatki, biblioteki wykresów ani projektanta raportów — tylko funkcja BARCODE, której szukasz.
Dostosowywanie kodów QR
Obie biblioteki obsługują generowanie kodów QR z opcjami dostosowywania. Styl API znacznie się różni.
Podejście ComponentOne oparte na ustawnikach właściwości:
// ComponentOne — QR code with error correction and color
using C1.Win.Barcode;
using C1.BarCode;
using System.Drawing;
C1.C1License.Key = "YOUR-COMPONENTONE-KEY";
var barcode = new C1BarCode();
barcode.CodeType = CodeType.QRCode;
barcode.Text = "https://example.com/product/4821";
barcode.QRCodeVersion = QRCodeVersion.Version5;
barcode.QRCodeErrorCorrectionLevel = QRCodeErrorCorrectionLevel.High;
barcode.QRCodeModel = QRCodeModel.Model2;
barcode.ForeColor = Color.DarkBlue;
barcode.BackColor = Color.White;
barcode.ModuleSize = 4;
using var image = barcode.GetImage();
image.Save("product-qr.png", System.Drawing.Imaging.ImageFormat.Png);Imports C1.Win.Barcode
Imports C1.BarCode
Imports System.Drawing
Imports System.Drawing.Imaging
C1.C1License.Key = "YOUR-COMPONENTONE-KEY"
Dim barcode As New C1BarCode()
barcode.CodeType = CodeType.QRCode
barcode.Text = "https://example.com/product/4821"
barcode.QRCodeVersion = QRCodeVersion.Version5
barcode.QRCodeErrorCorrectionLevel = QRCodeErrorCorrectionLevel.High
barcode.QRCodeModel = QRCodeModel.Model2
barcode.ForeColor = Color.DarkBlue
barcode.BackColor = Color.White
barcode.ModuleSize = 4
Using image As Image = barcode.GetImage()
image.Save("product-qr.png", ImageFormat.Png)
End UsingŁańcuch płynny IronBarcode:
//IronBarcode— QR code with error correction and color
// NuGet: dotnet add package IronBarcode
using IronBarCode;
using System.Drawing;
QRCodeWriter.CreateQrCode(
"https://example.com/product/4821",
300,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.ChangeBarCodeColor(Color.DarkBlue)
.SaveAsPng("product-qr.png");Imports IronBarCode
Imports System.Drawing
QRCodeWriter.CreateQrCode( _
"https://example.com/product/4821", _
300, _
QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.ChangeBarCodeColor(Color.DarkBlue) _
.SaveAsPng("product-qr.png")Podejście ComponentOne wymaga zainicjowania obiektu C1BarCode i ustawienia wielu właściwości przed wywołaniem GetImage(). QRCodeWriter w IronBarcode używa płynnego łańcucha — każda operacja zwraca obiekt kodu kreskowego, a na końcu wywołujesz .SaveAsPng(). Nie ma żadnego instancji do zarządzania.
IronBarcode obsługuje również osadzanie logo w kodach QR, czego nie robi C1BarCode:
// QR code with embedded brand logo
QRCodeWriter.CreateQrCode("https://example.com/track/8821", 500)
.AddBrandLogo("company-logo.png")
.ChangeBarCodeColor(Color.DarkBlue)
.SaveAsPng("branded-qr.png");' QR code with embedded brand logo
QRCodeWriter.CreateQrCode("https://example.com/track/8821", 500) _
.AddBrandLogo("company-logo.png") _
.ChangeBarCodeColor(Color.DarkBlue) _
.SaveAsPng("branded-qr.png")Zrozumienie IronBarcode
Biblioteka IronBarcode to samodzielna biblioteka kodów kreskowych .NET, obsługująca zarówno generowanie, jak i odczyt. Instaluje się z NuGet (dotnet add package IronBarcode), celuje w jakikolwiek obsługiwany .NET TFM bez ograniczeń platformowych i działa na Windows, Linux, macOS, Docker, Azure oraz AWS Lambda.
Strona do czytania obsługuje natywnie dokumenty PDF:
// Read barcodes from a PDF — no image extraction needed
using IronBarCode;
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");
}Imports IronBarCode
' Read barcodes from a PDF — no image extraction needed
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}")
NextDla scenariuszy o wysokiej przepustowości, BarcodeReaderOptions kontroluje kompromis między szybkością i dokładnością a wykrywaniem wielu kodów kreskowych:
// Multi-barcode read with performance options
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("warehouse-manifest.jpg", options);Imports IronBarCode
' Multi-barcode read with performance options
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode
}
Dim results = BarcodeReader.Read("warehouse-manifest.jpg", options)Generation obsługuje standardowe formaty za pomocą spójnego statycznego API:
// Code 128 generation to file
BarcodeWriter.CreateBarcode("SHIP-20240312-7834", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// Generowanie kodów QR to byte array (for HTTP response)
byte[] qrBytes = QRCodeWriter.CreateQrCode("https://example.com/order/7734", 400)
.ToPngBinaryData();' Code 128 generation to file
BarcodeWriter.CreateBarcode("SHIP-20240312-7834", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
' Generowanie kodów QR to byte array (for HTTP response)
Dim qrBytes As Byte() = QRCodeWriter.CreateQrCode("https://example.com/order/7734", 400) _
.ToPngBinaryData()Obsługiwane platformy: Windows, Linux, macOS, Docker, Azure (App Service i Functions), AWS Lambda. Obsługiwane wersje .NET: .NET Framework 4.6.2+, .NET Core 3.1+ i .NET 5/6/7/8.
Porównanie funkcji
| Funkcja | MESCIUSComponentOne C1BarCode | IronBarcode |
|---|---|---|
| Generowanie BarCode'ów | Tak | Tak |
| Odczytywanie BarCode | Nie | Tak |
| Generowanie kodów QR | Tak | Tak |
| Osadzanie logo QR | Nie | Tak |
| Plik PDF do odczytu | Nie dotyczy (brak tekstu do przeczytania) | Tak (język ojczysty) |
| .NET platform target (edycje WinForms/WPF) | net8.0-windows | Każdy TFM (net8.0, itd.) |
| Wymagane UseWindowsForms (edycja WinForms) | Tak | Nie |
| Wdrożenie w systemie Linux / Docker | Tylko edycje Blazor/ASP.NET MVC | Tak |
| Wdrożenie na systemie macOS | Tylko edycje Blazor/ASP.NET MVC | Tak |
| Azure Functions (Linux) | Tylko edycje Blazor/ASP.NET MVC | Tak |
| ASP.NET Core po stronie serwera | edycja ASP.NET Core MVC | Tak |
| Samodzielny pakiet NuGet | Paczki licencjonowane w ramach suite | Tak |
| Ceny produktów samodzielnych | Nie dotyczy | Od 749 USD – licencja wieczysta (Lite) |
| Ceny Suite | 1 299 USD/dev/yr Enterprise; 799 USD/dev/yr edycje jednoplatfromowe | Nie dotyczy |
| API generowania płynnego | Nie (ustawianie właściwości) | Tak |
BarcodeReader.Read() | Nie | Tak |
BarcodeWriter.CreateBarcode() | Nie | Tak |
QRCodeWriter.CreateQrCode() | Nie | Tak |
| Obsługiwane wersje .NET | .NET 6+ (Windows for WinForms/WPF) | .NET Framework 4.6.2+, .NET Core 3.1+, .NET 5–8 |
| Opcja licencji wieczystej | Nie (subskrypcja) | Tak |
Przewodnik po mapowaniu API
W przypadku zespołów przechodzących z C1BarCode na IronBarcode obowiązują następujące bezpośrednie odpowiedniki:
| ComponentOne C1BarCode | IronBarcode |
|---|---|
C1.C1License.Key = "..." | IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" |
new C1BarCode() | Statyczne — nie wymaga instancji |
barcode.CodeType = CodeType.Code128 | BarcodeEncoding.Code128 (przekazany jako parametr) |
barcode.Text = "data" | Pierwszy argument BarcodeWriter.CreateBarcode() |
barcode.BarHeight = 100 | .ResizeTo(width, 100) na pisarzu kodów kreskowych |
barcode.ModuleSize = 2 | .ResizeTo() kontroluje rozmiar w pikselach |
barcode.ForeColor = Color.DarkBlue | .ChangeBarCodeColor(Color.DarkBlue) |
barcode.BackColor = Color.White | .ChangeBackgroundColor(Color.White) |
barcode.GetImage() | .SaveAsPng() / .ToPngBinaryData() |
barcode.QRCodeErrorCorrectionLevel | QRCodeWriter.QrErrorCorrectionLevel enum |
barcode.QRCodeVersion | Automatyczne (lub parametr wersji) |
| Brak API do odczytu | BarcodeReader.Read(path) |
net8.0-windows wymagany | net8.0 (lub jakikolwiek TFM) |
UseWindowsForms = true wymagany | Nie jest wymagane |
Kiedy zespoły się zmieniają
Pojawia się potrzeba czytania. Jest to najczęstszy czynnik wyzwalający. Zespół tworzy generowanie etykiet z kodami BarCode za pomocą C1BarCode, a następnie otrzymuje wymaganie weryfikacji skanów, przetwarzania dokumentów przychodzących przesyłek lub dekodowania kodów QR z przesłanych obrazów. C1BarCode nie może w tym pomóc. Do wyboru są: dodanie drugiej biblioteki BARCODE do odczytu lub zastąpienie C1BarCode biblioteką, która obsługuje obie funkcje.
Wdrożenie w systemie Linux lub Docker. Aplikacja desktopowa WinForms przeznaczona na komputery z systemem Windows nie podlega tym ograniczeniom. API .NET Core generująca obrazy kodów kreskowych to robi — zwłaszcza jeśli musi działać w kontenerze Linux lub być wdrożone w usłudze Azure App Service na systemie Linux. net8.0-windows cel framework od razu blokuje te opcje wdrażania.
Architektura mikrousługowa lub bezserwerowa. Azure Functions, AWS Lambda i mikrousługi w kontenerach są zorientowane na system Linux. Usługa generowania kodów kreskowych, której nie można wdrożyć w systemie Linux, nie jest realną mikrousługą.
Koszt subskrypcji Suite a zakres wymagań. Zespoły, które płacą za ComponentOne Studio Enterprise i już korzystają z jego tabel, wykresów i innych elementów sterujących, uzasadniły już tę subskrypcję. Zespoły, które wykupiły subskrypcję głównie lub wyłącznie w celu generowania BARCODE-ów, płacą za ponad 100 elementów sterujących, z których nie korzystają. Koszt subskrypcji na programistę rośnie wraz z wielkością zespołu.
Preferowana jest Licencja wieczysta. ComponentOne Studio jest dostępne wyłącznie w ramach subskrypcji. Nie ma opcji licencji wieczystej. Dla zespołów, które wolą posiadać oprogramowanie, które wysyłają — szczególnie ze względu na zgodność lub długoterminową utrzymanie — wieczyste licencje IronBarcode(zaczynające się od 749 USD Lite) są strukturalnie inne.
Wnioski
C1BarCode generuje BarCodes w sposób przejrzysty w środowisku WinForms. To właśnie robi naprawdę dobrze, a dla aplikacji desktopowej WinForms, która wymaga jedynie generowania etykiet w systemie Windows, jest to funkcjonalny wybór w ramach Suite ComponentOne.
Na tym kończy się zakres zlecenia. Brak możliwości odczytu, wdrożenie wyłącznie w systemie Windows, brak pakietu samodzielnego, licencjonowanie w formie subskrypcji. Gdy wymagania projektu wykraczają poza generowanie WinForms w systemie Windows — wymagania dotyczące odczytu, wdrożenie w systemie Linux, interfejs API sieci Web, kontener Docker, funkcja w chmurze — C1BarCode nie jest w stanie ich spełnić.IronBarcode obsługuje generowanie i odczyt kodów kreskowych, działa na każdej platformie obsługiwanej przez .NET i jest dostępny jako samodzielny pakiet bez konieczności subskrypcji Suite Enterprise zawierającej 100 elementów sterujących.

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.