Altbilgi içeriğine atla
DIğER BILEşENLERLE KARşıLAşTıRıN

Infragistics Barkod vs IronBarcode: C# Barkod Kütüphanesi Karşılaştırması

Infragistics Barkod ve IronBarcode: YalnızcaWPFOkuyucu ve Platform-Agnostik API

Infragistics barkod okuma, WPF'de çalışır. Oraya ulaşmak için bir BarcodeReader örneği, bir DecodeComplete olay işleyicisi, geri çağrıyı asenkron koda köprülemek için bir TaskCompletionSource<string>, bir URI'den yükleme için bir BitmapImage ve desteklemek istediğiniz her Symbology ailesinin bit düzeyinde bir OR'si gerekir — Decode()'a ikinci argüman olarak geçilir. Bir aileyi dışarıda bırakın — örneğin, bayraklardan Symbology.QRCode çıkarın — ve görüntülerinizdeki herhangi bir QR barkodu sessizce hiç bir şey döndürmez. Hiçbir istisna yok. Hiçbir uyarı yok. Sadece boş bir sonuç.

Bu,WPFtarafıdır.WinFormstarafında, Infragistics.Win.UltraWinBarcode paketi oluşturma kontrolleri içerir ancak hiç okuma sınıfı yoktur.WinFormsprojenizde barkodları okumanız gerekiyorsa, Infragistics barkod paketinde çağrılacak bir şey yoktur. Aynı durum herhangi birASP.NET Coredenetleyicisi, konsol aracı, Azure Fonksiyonu, Blazor Sunucu bileşeni veya Docker konteyneri için de geçerlidir. Infragistics barkod desteği UI çerçeve sınırlarında mevcuttur:WPFüretim ve olay yollu okuma alır;WinFormssadece üretim alır; geri kalan hiçbir şey almaz.

Bu karşılaştırma, bu ayrımın uygulamada ne anlama geldiğini inceler, ardından IronBarcode'un her proje türünde aynı şekilde davranan tek bir statik API ile aynı işi nasıl ele aldığını inceler.

Infragistics Barkod Desteğini Anlamak

Infragistics, en köklü .NET UI bileşen satıcılarından biridir. Barkod işlevini kapsayan abonelik olan Infragistics Ultimate suite, WinForms, WPF, ASP.NET, Blazor ve mobil için yüzlerce kontrol içerir. Infragistics'in ağlarını, grafiklerini veya zamanlayıcılarını zaten kullanan ekipler için barkod kontrolleri mantıklı bir eklentidir: zaten abonelik için ödeme yapmaktadırlar.

Ancak barkod desteği birleşik bir kütüphane değildir. Sadece kısmen üst üste binen ayrı yeteneklere sahip iki ayrı derlemeyle sağlanır.

WinForms: UltraWinBarcode

Infragistics.Win.UltraWinBarcode paketi, UltraWinBarcode sınıfı aracılığıylaWinFormsuygulamalarında barkod oluşturma sağlar. API basittir:

// InfragisticsWinFormsgeneration
using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
// InfragisticsWinFormsgeneration
using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
Imports Infragistics.Win.UltraWinBarcode

Dim barcode As New UltraWinBarcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.SaveTo(outputPath)
$vbLabelText   $csharpLabel

Bir semiyoloji ayarlayın, verileri atayın, SaveTo() çağırın. WinForms'daki sadece üretim senaryoları için bu işe yarar. Symbology enum'u, Code128, Code39, QR, EAN13 ve diğerleri gibi yaygın formatları kapsar.

Bu derlemede mevcut olmayan şey bir okuyucudur. UltraBarcodeReader sınıfı yok. Scan() yöntemi yok. Sadece Infragistics.Win.UltraWinBarcode paketini kullanarak birWinFormsuygulamasında bir barkod görüntüsünü okumaya çalışırsanız, çağrılacak bir şey yoktur.

WPF: XamBarcode ve BarcodeReader

WPF tarafı, hem bir oluşturma kontrolünü (XamBarcode) hem de ayrı bir okuma sınıfını (BarcodeReader içinden, Infragistics.WPF.BarcodeReader derlemesinden Infragistics.Controls.Barcodes içinde) içerir. Okuyucu,WPFiş parçacığı ve görüntüleme modelini temel alarak olay yönelimlidir.

WPF'de bir barkod okumak için DecodeComplete olayını bağlamak, görüntüleri dosya yolundan ziyade BitmapSource nesneleri olarak yüklemek ve kodunuz asenkron ise geri çağrı modelini beklenir bir şeye dönüştürmek gerekir.

ASP.NET Core, Konsol, Docker: Hiçbir Şey

net8.0 hedefleyen ancakWPFveyaWinFormsUI derlemeleri olmayan bir Infragistics barkod paketi yok.ASP.NET Coreprojeleri, konsol araçları, Azure Fonksiyonları, Blazor Sunucusu ve Linux Docker konteynerleri için hiçbir Infragistics barkod seçeneği yoktur. Kütüphane UI çerçevesine bağlıdır.

WPFOkuma Düzeni

Infragistics ile WPF'de bir barkod okumanın gerçekte neye benzediği işte bu şekildedir:

// InfragisticsWPFreading: event-driven, requiresWPFassemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;

private BarcodeReader _reader;
private TaskCompletionSource<string> _result;

public InfragisticsBarcodeService()
{
    _reader = new BarcodeReader();
    _reader.DecodeComplete += OnDecodeComplete;
}

public async Task<string> ReadBarcodeAsync(string imagePath)
{
    _result = new TaskCompletionSource<string>();

    // Load asWPFBitmapSource — not a file path
    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    // Build the Symbology flags. The enum is [Flags];
    // EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
    // and Code 39 is exposed as Code39Ext. Use Symbology.All
    // to search every supported family.
    var symbologies = Symbology.Code128 |
                      Symbology.Code39Ext |
                      Symbology.QRCode |
                      Symbology.EanUpc |
                      Symbology.Interleaved2Of5;

    // Symbology is the second argument to Decode/DecodeAsync,
    // not a property on the reader. Result comes via callback.
    _reader.DecodeAsync(bitmap, symbologies);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbolFound ? e.Value : "No barcode found");
}

public void Dispose()
{
    if (_reader != null)
    {
        _reader.DecodeComplete -= OnDecodeComplete;
        _reader = null;
    }
}
// InfragisticsWPFreading: event-driven, requiresWPFassemblies
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;

private BarcodeReader _reader;
private TaskCompletionSource<string> _result;

public InfragisticsBarcodeService()
{
    _reader = new BarcodeReader();
    _reader.DecodeComplete += OnDecodeComplete;
}

public async Task<string> ReadBarcodeAsync(string imagePath)
{
    _result = new TaskCompletionSource<string>();

    // Load asWPFBitmapSource — not a file path
    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    // Build the Symbology flags. The enum is [Flags];
    // EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
    // and Code 39 is exposed as Code39Ext. Use Symbology.All
    // to search every supported family.
    var symbologies = Symbology.Code128 |
                      Symbology.Code39Ext |
                      Symbology.QRCode |
                      Symbology.EanUpc |
                      Symbology.Interleaved2Of5;

    // Symbology is the second argument to Decode/DecodeAsync,
    // not a property on the reader. Result comes via callback.
    _reader.DecodeAsync(bitmap, symbologies);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbolFound ? e.Value : "No barcode found");
}

public void Dispose()
{
    if (_reader != null)
    {
        _reader.DecodeComplete -= OnDecodeComplete;
        _reader = null;
    }
}
Imports Infragistics.Controls.Barcodes
Imports System.Windows.Media.Imaging
Imports System.Threading.Tasks

Private _reader As BarcodeReader
Private _result As TaskCompletionSource(Of String)

Public Sub New()
    _reader = New BarcodeReader()
    AddHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
End Sub

Public Async Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
    _result = New TaskCompletionSource(Of String)()

    ' Load as WPF BitmapSource — not a file path
    Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))

    ' Build the Symbology flags. The enum is [Flags];
    ' EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
    ' and Code 39 is exposed as Code39Ext. Use Symbology.All
    ' to search every supported family.
    Dim symbologies = Symbology.Code128 Or
                      Symbology.Code39Ext Or
                      Symbology.QRCode Or
                      Symbology.EanUpc Or
                      Symbology.Interleaved2Of5

    ' Symbology is the second argument to Decode/DecodeAsync,
    ' not a property on the reader. Result comes via callback.
    _reader.DecodeAsync(bitmap, symbologies)

    Return Await _result.Task
End Function

Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
    _result?.TrySetResult(If(e.SymbolFound, e.Value, "No barcode found"))
End Sub

Public Sub Dispose()
    If _reader IsNot Nothing Then
        RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
        _reader = Nothing
    End If
End Sub
$vbLabelText   $csharpLabel

Bu, bir barkod okumak için yaklaşık 35 satırlık bir altyapıdır. Aslında neler oluyor, sayalım:

  1. Bir BarcodeReader örneği oluşturulur ve alan olarak canlı tutulur.
  2. Kurucuya bir olay işleyici bağlanır.
  3. ReadBarcodeAsync'a her çağrı, paylaşılan bir alana atanan yeni bir TaskCompletionSource<string> oluşturur — bu, bu hizmetin yazıldığı haliyle iş parçacığı güvenli olmadığı anlamına gelir. Eşzamanlı çağrılar _result'u üzerine yazar.
  4. Görüntü bir BitmapImage olarak bir Uri'den yüklenmelidir — bir dosya yolu dizesi, bir bayt dizisi veya bir akış değil.
  5. DecodeAsync(), olayı asenkron olarak tetikler. TaskCompletionSource, geri çağrı dünyası ile asenkron/bekleme dünyası arasındaki yapıştırıcıdır.
  6. Geri çağrı, e.SymbolFound doğru olduğunda e.Value çıkarır.
  7. Dispose() yöntemi, bellek sızıntılarını önlemek için olay işleyicisini çıkarmalıdır.

Bu mantığın hiçbir kısmı barkodlarla ilgili değil. Olay yönelimli tasarımı çevrelemek için gerekli altyapıdır. Üretim kodunda, _result.Task asla tamamlanmazsa durumu da ele almanız gerekir — bir zaman aşımı, bir iptal belirteci veya olayın asla tetiklenmemesine karşı bir koruma.

WinFormsBoşluğu

WinForms boşluğu, ilk başta göründüğünden daha keskin bir kopuştur.WinFormsuygulamaları inşa eden ekipler, genellikle bileşenindeki kodu kullanmak için bakarlar. Buldukları, Infragistics.Win.UltraWinBarcode tamamen okuma kabiliyeti sağlamaz.

Bu dökümantasyon ihmali değildir.WinFormsbarkod birimi, bir üretim kontrolü olarak tasarlandı. Eğer birWinFormsuygulamasında — örneğin, bir kullanıcı tarafından yüklenen bir görüntü dosyasından bir barkod okuma veya bir kamera akışından bir barkod çözme gibi — barkod taramanız gerekiyorsa, Infragistics barkod araçları ile bunu yapamazsınız. Tamamen ayrı bir kütüphane getirmeniz gerekir, bu noktada üretim için Infragistics kullanmanın mantıki temeli zayıflar.

Asimetri, karma çerçeve projelerini yürüten ekipler için bir kapsama boşluğu oluşturur. HemWPFmasaüstü istemcisine hem deWinFormsmasaüstü istemcisine sahip bir ekip,WinFormsprojesinde barkod okumak için Infragistics'i kullanamaz, her ne kadar başka her yerde Infragistics kullanıyor olsalar da.

Semoloji Belirlemesi: Sessiz Bir Hata Modu

WPF okuyucusunda Decode()'a Symbology bayrak argümanı, kendi bölümünü hak ediyor çünkü başarısızlık modu sessiz: eksik bir bayrak hatasız boş bir sonuç döndürür.

Okuyucuya çağrı yaptığınızda, aramak istediğiniz her barkod ailesini birlikte OR operatörü ile birleştirirsiniz. Desteklenen aileler QR, EAN/UPC (EanUpc), Kod 39 (Code39Ext), Kod 128, MaxiCode ve Interleaved 2 of 5'dır — DataMatrix enum içinde hiç yer almaz, dolayısıylaWPFokuyucu bunu çözemiyor. Symbology.All enum'daki her şeyi kapsar:

// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
                  Symbology.Code39Ext |
                  Symbology.QRCode |
                  Symbology.EanUpc |
                  Symbology.Interleaved2Of5;

_reader.DecodeAsync(bitmap, symbologies);
// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
                  Symbology.Code39Ext |
                  Symbology.QRCode |
                  Symbology.EanUpc |
                  Symbology.Interleaved2Of5;

_reader.DecodeAsync(bitmap, symbologies);
' Build flags explicitly, or use Symbology.All to search every family
Dim symbologies = Symbology.Code128 Or
                  Symbology.Code39Ext Or
                  Symbology.QRCode Or
                  Symbology.EanUpc Or
                  Symbology.Interleaved2Of5

_reader.DecodeAsync(bitmap, symbologies)
$vbLabelText   $csharpLabel

Bir barkod görüntüsü bir QR kodu içeriyorsa ve Symbology.QRCode bayraklar arasında yoksa, e.SymbolFound false döner ve e.Value boştur. Kod çözüm olayı hala tetiklenir. Hiçbir istisna atılmaz. Arayan "Barkod bulunamadı" yanıtını alır ve resmin okunamaz mı yoksa sadece yapılandırılmadığını mı gösterecek bir işaret yoktur.

Uygulamada bu şu anlama gelir:

  • İlk kurulum, geliştiricinin test ettiği formatlar için sorunsuz bir şekilde çalışır.
  • Sistem yeni bir barkod formatı girer (bir tedarikçi etiket türünü değiştirir, yeni bir ürün serisi farklı bir semboloji kullanır).
  • Okuyucu bu aile için tüm resimlerde sessizce başarısız olur.
  • Arıza, "görselde barkod yoksa" gibi görünür, "format yapılandırılmamış" gibi değil.

Bunu hata ayıklayan ekipler, ailelerinin asla bayraklar listesinde olmadığını fark etmeden önce resim kalitesini incelemeye zaman harcar. DataMatrix daha belirgin bir durumdur: eklenecek bir bayrak yoktur, çünküWPFokuyucu bunu hiç desteklemiyor.

IronBarcode, format argümanı gerektirmez. Her okuyuşta desteklenen her formatı otomatik olarak algılar. Unutulacak bir bayrak yoktur.

PlatformMatrisi

Platformlar arası yetenek boşluğu, mimari kısıtı anlamanın en net yoludur:

Platform Infragistics Üretim Infragistics Okuma IronBarcode Üretim IronBarcode Okuma
WPF XamBarcode kontrolü BarcodeReader (olay yönelimli) Evet Evet
WinForms UltraWinBarcode MEVCUT DEĞİL Evet Evet
ASP.NET Core MEVCUT DEĞİL MEVCUT DEĞİL Evet Evet
Konsol MEVCUT DEĞİL MEVCUT DEĞİL Evet Evet
Blazor Sunucusu MEVCUT DEĞİL MEVCUT DEĞİL Evet Evet
Docker / Linux MEVCUT DEĞİL MEVCUT DEĞİL Evet Evet
Azure Functions MEVCUT DEĞİL MEVCUT DEĞİL Evet Evet

Bu tablo, saltWPFmasaüstü uygulamalarının ötesinde çalışan ekiplerin, Infragistics barkod desteğinin yetersiz olduğunu görmelerinin nedenini açıkça gösteriyor. Bir projeWinFormsve ASP.NET Core'un veyaWPFve bir arka plan işçi hizmetinin kapsamını açtığı an — Infragistics barkod kütüphanesi yalnızca kod tabanının bir bölümünü kapsıyor.

IronBarcode Anlama

IronBarcode, WinForms,WPFveya herhangi bir UI çerçevesine bağımlılığı olmayan, .NET için özel bir barkod kütüphanesidir. Aynı NuGet paketi, aynı ad alanı ve aynı API, herhangi bir .NET projesinde çalışır: WinForms, WPF, ASP.NET Core, konsol, Blazor Sunucusu, Docker, Azure Fonksiyonları, AWS Lambda.

// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package BarCode
using IronBarCode;

// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package BarCode
using IronBarCode;

// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
Imports IronBarCode

' Read — 2 lines, any platform
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
$vbLabelText   $csharpLabel

BarcodeReader.Read() statik bir yöntemdir. Yönetilecek bir örnek yok, bağlanacak bir olay yok, geri çağrı modellerini köprüleyecek bir TaskCompletionSource yok. Bir dosya yolu dizesi, bir bayt dizisi, bir Stream veya toplu işleme için bunların herhangi birinin bir dizisini kabul eder.

Oluşturma için, BarcodeWriter.CreateBarcode() kaydedebileceğiniz veya ikili veri olarak alabileceğiniz bir barkod nesnesi döndürür:

using IronBarCode;

// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .SaveAsPng("qr.png");
using IronBarCode;

// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .SaveAsPng("qr.png");
Imports IronBarCode

' Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
             .ResizeTo(400, 100) _
             .SaveAsPng("barcode.png")

' Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

Lisans başlatması uygulama başlangıcında, bir kez yapılır:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Yan Yana: Toplu İşleme

Toplu işleme, InfragisticsWPFokuyucusundaki başka bir yapısal sınırlamayı ortaya çıkarır. Okuyucu paylaşılan bir olay işleyicisi kullanıyor ve her çağrıda _result alanı üzerine yazılıyor, bu nedenle yukarıda gösterilen servis sınıfı birden fazla görüntüyü eşzamanlı işlemeyi güvenli bir şekilde yapamaz. Çağrıları sıralamanız gerekir:

// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// field mean concurrent calls would overwrite _result before the previous decode completes
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    // Each call must await before starting the next
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// field mean concurrent calls would overwrite _result before the previous decode completes
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    // Each call must await before starting the next
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}
Imports System.Collections.Generic
Imports System.Threading.Tasks

' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' field mean concurrent calls would overwrite _result before the previous decode completes
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()

For Each file In imageFiles
    ' Each call must await before starting the next
    Dim value As String = Await service.ReadBarcodeAsync(file)
    results.Add(value)
Next
$vbLabelText   $csharpLabel

Bunu eşzamanlı yapmak, önceki bir çözümleme hala devam ederken _result'un üzerine yazılmamasını sağlamak için bir kilit, bir kuyruk veya bir semafor gibi önemli ek altyapı gerektirir. Bu, basit bir I/O operasyonu için önemli bir eşzamanlılık sorunudur.

IronBarcode'un statik BarcodeReader.Read() iş parçacığı güvenlidir. Ek bir senkronizasyon yapmadan aynı anda birden fazla iş parçacığından çağrılabilir. Toplu işler için, doğrudan Parallel.ForEach kullanabilirsiniz:

using IronBarCode;

// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var barcodeResults = BarcodeReader.Read(file);
    foreach (var result in barcodeResults)
    {
        results.Add(result.Value);
    }
});
using IronBarCode;

// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var barcodeResults = BarcodeReader.Read(file);
    foreach (var result in barcodeResults)
    {
        results.Add(result.Value);
    }
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

' IronBarcode: parallel batch with thread-safe static API
Dim results As New ConcurrentBag(Of String)()

Parallel.ForEach(imageFiles, Sub(file)
    Dim barcodeResults = BarcodeReader.Read(file)
    For Each result In barcodeResults
        results.Add(result.Value)
    Next
End Sub)
$vbLabelText   $csharpLabel

BarcodeReaderOptions üzerinden paralellik yapılandırabilir ve tek bir çağrıda birden fazla dosya geçirebilirsiniz:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read(imageFiles, options)
For Each result In results
    Console.WriteLine($"{result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

Özellik Karşılaştırması

Özellik Infragistics Barkod IronBarcode
WinForms barkod okuma Mevcut değil Evet
WPF barkod okuma Evet (olay yönelimli) Evet (senkron)
ASP.NET Çekirdek desteği Mevcut değil Evet
Konsol / İşçi Hizmeti Mevcut değil Evet
Docker / Linux Mevcut değil Evet
Azure Functions Mevcut değil Evet
Blazor Sunucusu Mevcut değil Evet
Otomatik format algılama Hayır — Decode() fonksiyonuna Symbology bayrakları gönderilmeli Evet — formatlar otomatik tespit edilir
PDF barkod okuma Mevcut değil Evet — kendi içinde, ekstra paket gerektirmez
İş Parçacığı güvenli okuma Hayır (paylaşılan etkinlik işleyicisi) Evet (statik API)
Etkinlik odaklı API gereklidir Evet (WPF) Hayır
Açık görüntü yükleme (BitmapSource) Evet Hayır — dosya yolu, bayt, akış kabul eder
Senkron okuma Hayır (TaskCompletionSource üzerinden köprü oluşturulmalı) Evet
Toplu işlem Sadece sıralı (eşzamanlı güvenli değil) Yerleşik paralelleştirme
Görünmez format hataları Evet (Symbology ailesi hariç bırakılmış) Hayır
Suite bağımlılığı gereklidir Evet — Infragistics Ultimate aboneliği Hayır — bağımsız paket
Süresiz lisans seçeneği Hayır — yıllık abonelik Evet
Yaklaşık lisans maliyeti Yıllık abonelik (Infragistics Ultimate) $749'dan başlayan süresiz (Lite)

API Eşleme Başvurusu

WinForms(UltraWinBarcode) dan IronBarcode'ye

InfragisticsWinForms— UltraWinBarcode IronBarcode
new UltraWinBarcode() BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128 BarcodeEncoding.Code128 (CreateBarcode için parametre)
barcode.Data = "ITEM-12345" CreateBarcode()'nün ilk argümanı
barcode.SaveTo(outputPath) .SaveAsPng(outputPath)
Okuma API'si mevcut değil BarcodeReader.Read(imagePath)

WPF(BarcodeReader) dan IronBarcode'ye

InfragisticsWPF— BarcodeReader IronBarcode
new BarcodeReader() Statik sınıf — örnek gerekmez
_reader.DecodeComplete += OnDecodeComplete Gerekli değil
_reader.DecodeAsync(bitmap, Symbology.X |Symbology.Y) Otomatik algılama — yapılandırma gerekmez
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap, ...) BarcodeReader.Read(path)
e.Value (ReaderDecodeArgs içinde) result.Value
e.Symbology (ReaderDecodeArgs içinde) result.Format
TaskCompletionSource<string> asenkron sarmalayıcı Senkron — sarmalayıcı gerekmez
Dispose() — olay işleyicisini ayır Gerekli değil — örnek veya etkinlik yok
SadeceWPFprojesi Herhangi bir .NET proje türü

Takımlar Geçiş Yaptığında

Belirli birkaç durum sürekli olarak ekipleri Infragistics barkod desteğinden uzaklaştırıyor.

WinForms'da okuma gerekli. Bu, en yaygın senaryodur. UltraWinBarcode ile barkodları güzelce oluşturan birWinFormsuygulaması, ardından yeni bir gereksinim gelir: bir yüklenmiş görüntüden bir barkod taramak veya baskıdan önce bir etiketi doğrulamak.WinFormsiçin herhangi bir Infragistics okuma API'si yok. Ekip ya ikinci bir kütüphane getiriyor ya da oluşturma kodunu her ikisini de yapan bir şeyle değiştiriyor.

YeniASP.NET Coreuç noktası. Infragistics barkod üretimi olan bir masaüstü uygulamasına bir web API arkadaşı ekleniyor. Uç nokta, görüntü yüklemeleri kabul etmeli ve barkod değerlerini döndürmeli ya da talep üzerine barkod görüntüleri üretmelidir. Infragistics barkod paketleri ile birASP.NET Coreprojesinde bunların hiçbiri mümkün değil. IronBarcode, dotnet add package BarCode ile yüklenir ve bir denetleyici eyleminde aynı şekilde çalışır, bir konsol yönteminde çalıştığı gibi.

Docker dağıtımı. BirWPFuygulaması konteyner haline getiriliyor veya barkod mantığı bir mikro servise çıkarılıyor.WPFmontajları, Linux Docker konteynerlerinde çalışmaz. InfragisticsWPFBarcodeReader onlarlaydı. IronBarcode, Linux x64'ü yerel olarak hedefler.

Toplu işleme performansı. Bir iş akışı yüzlerce veya binlerce barkod görüntüsünü işler. Etkinlik odaklı Infragistics okuyucu, bunları sıralı olarak işler. IronBarcode'un statik okuyucusu iş parçacığı güvenlidir ve herhangi bir eşzamanlılık altyapısı olmadan Parallel.ForEach veya kendi yerleşik MaxParallelThreads seçeneğini destekler.

Üretim sırasında sessiz format hataları. Bir ekip, belirli bir ailenin barkodlarının haftalarca sessizce başarısız olduğunu, çünkü Symbology bayraklarının Decode()'ya iletilen bayraklarında o ailenin olmadığını keşfeder. Otomatik algılamaya geçmek, bu hata modunu tamamen ortadan kaldırır.

Infragistics abonelik kapsamını azaltma. Bazı ekipler, barkod kontrollerinin bir parçası olduğu için özellikle Infragistics Ultimate abonelik fiyatını ödüyorlar. Barkod gereksinimi abonelik için tek neden olduğunda, maliyetin bir kısmına ayrılmış bir barkod kütüphanesi değerlendirmeye değerdir.

Sonuç

Infragistics barkod desteğiyle ilgili merkezi sorun, yetenekle değil, mimariyle ilgilidir.WPFBarcodeReader barkodları okur.WinFormsUltraWinBarcode onları oluşturur. Her bileşenin tasarlandığı dar bağlam içinde, işlev görürler. Sorun şu ki, bu iki bağlam, çoğu .NET ekibinin gerçekten ihtiyaç duyduğu şeyi kapsamaz.

Modern bir .NET uygulamasındaki bir barkod özelliği, nadiren tek bir UI framework'ünde bulunur. BirWinFormsistemcisi ve bir web API'sinde görünür. Bir Docker konteynerinde ve bir masaüstü ortamında çalışır. Bir ASP.NET uç noktasına yüklenen görüntüleri taraması ve bir konsol aracından etiketleri yazdırması gerekir. Bunların hiçbiri Infragistics barkod paketleri ile çalışmaz veWPFokuyucusunun gerekli semboloji bayrakları ile etkinlik odaklı deseni, çalıştığı tek bağlamda bile önemli ölçüde karmaşıklık ekler.

IronBarcode, aynı problemi çözer - barkodları okuma ve üretme - her .NET proje türünde aynı şekilde derlenen ve çalışan bir statik API ile.WPFbir servis sınıfında yazdığınız BarcodeReader.Read() çağrısı, birASP.NET Coredenetleyicisinde yazdığınız ve bir Linux Docker konteynerinde yazdığınız aynı çağrıdır. Olaylar yok, bayraklar yok, TaskCompletionSource yok. Barkod mantığı 35 satır yerine iki satırdır ve bu iki satır her yerde çalışır.

Sıkça Sorulan Sorular

Infragistics Barcode nedir?

Infragistics Barcode, C# uygulamalarında barkod oluşturma ve okuma için bir .NET barkod kütüphanesidir. .NET projeleri için bir barkod çözümü seçerken geliştiricilerin değerlendirdiği birkaç alternatiften biridir.

Infragistics Barcode ve IronBarcode arasındaki temel farklar nelerdir?

IronBarcode, örnek yönetimi gerektirmeyen statik, durumsuz bir API kullanırken, Infragistics Barcode genellikle kullanım öncesi örnek oluşturma ve yapılandırma gerektirir. IronBarcode ayrıca yerel PDF desteği, otomatik format tanıma ve tüm ortamlarda tek anahtarlı lisanslama sunar.

IronBarcode, Infragistics Barcode'den daha mı kolay lisanslanır?

IronBarcode hem geliştirme hem de üretim dağıtımlarını kapsayan tek bir lisans anahtarı kullanır. Bu, SDK anahtarlarını çalışma zamanı anahtarlarından ayıran lisanslama sistemlerine kıyasla CI/CD hatlarını ve Docker yapılandırmalarını basitleştirir.

IronBarcode, Infragistics Barcode'un desteklediği tüm barkod formatlarını destekliyor mu?

IronBarcode, QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztek, EAN-13, UPC-A, GS1 ve daha birçokları dahil olmak üzere 30'dan fazla barkod sembolojisini destekler. Format otomatik algılama, açıkça format sayımını gerektirmez.

IronBarcode doğal PDF barkod okuma desteği sunuyor mu?

Evet. IronBarcode, ayrı bir PDF render kütüphanesi gerektirmeden, BarcodeReader.Read('document.pdf') kullanarak PDF dosyalarından doğrudan barkod okur. Sayfa bazında sonuçlar sayfa numarası, barkod formatı, değeri ve güven puanını içerir.

IronBarcode, toplu işlem konusunda Infragistics Barcode'a kıyasla nasıl bir performans sergiliyor?

IronBarcode'un statik yöntemleri durum terkibesizdir ve doğal olarak thread-safe'dir, bu da thread başına örnek yönetimi olmadan Parallel.ForEach'in doğrudan kullanımına olanak tanır. Herhangi bir fiyatlandırma seviyesinde bir throughput tavanı yoktur.

IronBarcode hangi .NET sürümlerini destekliyor?

IronBarcode, .NET Framework 4.6.2+, .NET Core 3.1 ve .NET 5, 6, 7, 8 ve 9'u tek bir NuGet paketinde destekler. Platform hedefleri arasında Windows x64/x86, Linux x64 ve macOS x64/ARM bulunur.

Bir .NET projesine IronBarcode'u nasıl kurarım?

IronBarcode'u NuGet üzerinden kurun: Paket Yöneticisi Konsolunda 'Install-Package IronBarCode' komutunu veya CLI'da 'dotnet add package IronBarCode' komutunu çalıştırın. Ek bir SDK yükleyicisi veya çalışma zamanı dosyası gerekmez.

Infragistics'in aksine IronBarcode'u satın almadan önce değerlendirebilir miyim?

Evet. IronBarcode'un deneme modu, yalnızca oluşturulan çıktı görüntülerine bir filigran ekleyerek, barkod değerlerini tam olarak döndürür. Satın almadan önce, kendi belgelerinizde okuma doğruluğunu kıyaslayabilirsiniz.

Infragistics Barcode ile IronBarcode arasındaki fiyat farkı nedir?

IronBarcode, geliştirme ve üretimi kapsayan, sürekli bir tek geliştirici lisansı için $749'dan başlar. Fiyat detayları ve hacim seçenekleri IronBarcode lisanslama sayfasında mevcuttur. Ayrı bir çalışma zamanı lisansı gerekliliği yoktur.

Infragistics Barcode'dan IronBarcode'a geçiş kolay mı?

Infragistics Barcode'dan IronBarcode'a geçiş, esas olarak örnek tabanlı API çağrılarını IronBarcode'un statik metotları ile değiştirmeyi, lisanslama şablonunu kaldırmayı ve sonuç özelliği adlarını güncellemeyi içerir. Çoğu geçiş, kod eklemek yerine kodu azaltmayı içerir.

IronBarcode, logolu QR kodları üretebiliyor mu?

Evet. QRCodeWriter.CreateQrCode().AddBrandLogo('logo.png'), konfigüre edilebilir hata düzeltme ile QR koduna yerel olarak bir marka görüntüsü yerleştirir. Renkli QR kodları, ChangeBarCodeColor() ile de desteklenir.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara