.NET MAUI Kullanarak C#'ta Barkod Nasıl Okunur & Taranır
InfragisticsBarkod'dan IronBarcode'a Geçiş
ÇoğuInfragisticsbarkod geçişi, ekip yalnızca barkod üretimi sağlanan bir projede barkod okuma gereksinimi olduğu için olur — WinForms,ASP.NET Coreveya WPF dışındaki herhangi bir projede — ya da olay güdümlü WPF okuyucu API'si üretim kullanımı için çok kırılgan olduğunu kanıtladığından dolayı. TaskCompletionSource köprü deseni, eşzamanlı çağrıları güvensiz hale getiren ortak _result alanı ve eksik SymbologyType bayraklarından kaynaklanan sessiz hatalar, ekiplerin alternatif aramasının yaygın nedenleridir.
Bu kılavuz,Infragisticsbarkod paketlerini kaldırma, hem WinForms hem WPF bağlamlarındaki üretim ve okuma kodunu değiştirme ve Infragistics'in hiç destek sağlamadığı proje türlerine barkod işlevselliği ekleme konularında tüm geçiş sürecini anlatır.
Hızlı Başlangıç
1. Adım:InfragisticsBarkod Paketlerini Kaldırma
ProjenizdenInfragisticsbarkod NuGet paketlerini kaldırın. Hangi hedefleri kullandığınıza bağlı olarak,
# WinForms generation package
dotnet remove package Infragistics.WinForms.Barcode
# WPF reading package
dotnet remove package Infragistics.WPF.BarcodeReader
# WinForms generation package
dotnet remove package Infragistics.WinForms.Barcode
# WPF reading package
dotnet remove package Infragistics.WPF.BarcodeReader
Eğer proje dosyanız her iki referansı da içeriyorsa, ikisini de kaldırın. Eğer başkaInfragisticsbileşenleri kullanıyorsanız, barkod spesifik paketlerin kaldırılması,InfragisticsUltimate lisansını etkilemez.
2. Adım: IronBarcode'u Kurun
dotnet add package IronBarcode
dotnet add package IronBarcode
IronBarcode, WinForms, WPF, ASP.NET Core, konsol, Blazor Sunucu, Docker, Azure İşlevleri ve AWS Lambda genelinde çalışan tek bir pakettir. Çerçevenin başına ayrı paketler gerekmemektedir.
3. Adım: Namespace'leri Güncelleme
Infragistics barkod ad alanlarını IronBarCode (büyük B, büyük C) ile değiştirin:
// Remove these:
// using Infragistics.Win.UltraWinBarcode;
// using Infragistics.Controls.Barcodes;
// using System.Windows.Media.Imaging; // if only used for barcode BitmapImage loading
// Add this:
using IronBarCode;
// Remove these:
// using Infragistics.Win.UltraWinBarcode;
// using Infragistics.Controls.Barcodes;
// using System.Windows.Media.Imaging; // if only used for barcode BitmapImage loading
// Add this:
using IronBarCode;
Imports IronBarCode
4. Adım: Lisansı Başlatma
Lisans başlatma işlemini uygulama başlangıcında bir kez ekleyin — Program.cs, App.xaml.cs veya DI kompozisyon kökünüz:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Kod Göç Örnekleri
WinForms Üretim: UltraWinBarcode'dan BarcodeWriter'a
WinForms oluşturma deseni, IronBarcode'un BarcodeWriter ile temiz bir şekilde eşlenir:
Önce (Infragistics WinForms):
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
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)
Sonrası (IronBarcode):
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.SaveAsPng(outputPath)
Infragistics Symbology numaralandırma değeri, bir özellik atamasından ziyade CreateBarcode() için bir parametre olan BarcodeEncoding numaralandırmasına taşınır. Veriler ilk argüman olur. SaveTo(), çıktı formatınıza bağlı olarak .SaveAsPng(), .SaveAsJpeg(), .SaveAsSvg() veya .SaveAsPdf() olarak değişir.
Barkodu kaydetmeden önce yeniden boyutlandırmanız gerekiyorsa:
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(outputPath)
WPF Olay Güdümlü Okuma: Hizmet Sınıfından İki Satıra
Bu geçişteki en önemli azaltma budur.InfragisticsWPF okuma modeli tam bir hizmet sınıfı gerektirir:
Önce (Infragistics WPF — ~35 satır):
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>();
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
_reader.SymbologyTypes = Symbology.Code128 |
Symbology.Code39 |
Symbology.QRCode |
Symbology.EAN8 |
Symbology.EAN13 |
Symbology.UpcA |
Symbology.Interleaved2Of5;
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.Value ?? "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}
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>();
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
_reader.SymbologyTypes = Symbology.Code128 |
Symbology.Code39 |
Symbology.QRCode |
Symbology.EAN8 |
Symbology.EAN13 |
Symbology.UpcA |
Symbology.Interleaved2Of5;
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(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)()
Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))
_reader.SymbologyTypes = Symbology.Code128 Or
Symbology.Code39 Or
Symbology.QRCode Or
Symbology.EAN8 Or
Symbology.EAN13 Or
Symbology.UpcA Or
Symbology.Interleaved2Of5
_reader.Decode(bitmap)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(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
Sonra (IronBarcode — 2 satır):
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
Tüm servis sınıfı — nesne yönetimi, olay bağlantısı, TaskCompletionSource, BitmapImage yükleme, Dispose() — tamamen kaldırıldı. BarcodeReader.Read() eşzamanlıdır, statiktir ve bir dosya yolu dizgesini doğrudan kabul eder.
Eğer semboloji türünü de döndürüyorsanız:
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
var first = results.FirstOrDefault();
if (first != null)
{
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}");
}
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
var first = results.FirstOrDefault();
if (first != null)
{
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}");
}
Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Dim first = results.FirstOrDefault()
If first IsNot Nothing Then
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}")
End If
result.Value, e.Value ile değiştirilir. result.Format, e.Symbology ile değiştirilir.
WinForms Okuma Eklemek (Önceden İmkânsız)
Sadece üretimi olan bir WinForms projesindeyseniz, okuma şimdi aynı paketle kullanılabilir.
using IronBarCode;
// In a WinForms button handler or service method — same API as WPF or ASP.NET Core
var results = BarcodeReader.Read(imagePath);
foreach (var result in results)
{
MessageBox.Show($"Found: {result.Value} ({result.Format})");
}
using IronBarCode;
// In a WinForms button handler or service method — same API as WPF or ASP.NET Core
var results = BarcodeReader.Read(imagePath);
foreach (var result in results)
{
MessageBox.Show($"Found: {result.Value} ({result.Format})");
}
Imports IronBarCode
' In a WinForms button handler or service method — same API as WPF or ASP.NET Core
Dim results = BarcodeReader.Read(imagePath)
For Each result In results
MessageBox.Show($"Found: {result.Value} ({result.Format})")
Next
Ekstra paket yok, framework-spesifik kurulum yok. Aynı BarcodeReader.Read() çağrısı, WinForms'ta olduğu gibi WPF'de çalışır.
ASP.NET Çekirdek Uç Nokta (Önceden İmkânsız)
Infragistics paketleri ile birASP.NET Coredenetleyicisi içinde barkod üretimi ve okuma mümkün değildi.IronBarcode ile:
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
[HttpPost("read")]
public IActionResult ReadBarcode(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var results = BarcodeReader.Read(stream);
var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
return Ok(values);
}
[HttpGet("generate")]
public IActionResult GenerateBarcode([FromQuery] string data)
{
var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return File(bytes, "image/png");
}
}
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
[HttpPost("read")]
public IActionResult ReadBarcode(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var results = BarcodeReader.Read(stream);
var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
return Ok(values);
}
[HttpGet("generate")]
public IActionResult GenerateBarcode([FromQuery] string data)
{
var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return File(bytes, "image/png");
}
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/barcode")>
Public Class BarcodeController
Inherits ControllerBase
<HttpPost("read")>
Public Function ReadBarcode(imageFile As IFormFile) As IActionResult
Using stream = imageFile.OpenReadStream()
Dim results = BarcodeReader.Read(stream)
Dim values = results.Select(Function(r) New With {Key .Value = r.Value, Key .Format = r.Format.ToString()})
Return Ok(values)
End Using
End Function
<HttpGet("generate")>
Public Function GenerateBarcode(<FromQuery> data As String) As IActionResult
Dim bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return File(bytes, "image/png")
End Function
End Class
BarcodeReader.Read() bir Stream doğrudan kabul eder — yükleme işlemini önce diske kaydetmeye gerek yok.
PDF Barkod Okuma
IronBarcode, PDF belgelerinden barkod okur — ayrı bir paket gerektirmez.
using IronBarCode;
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("document.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
using IronBarCode;
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("document.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
Imports IronBarCode
' Read all barcodes from every page of a PDF
Dim results = BarcodeReader.Read("document.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
Next
Infragistics'in bir karşılığı yoktu — PDF barkod okuma, PDF sayfalarını dışarıda taramadan önce görsellere dönüştürmeyi gerektiriyordu.
Toplu İşleme: Sıralıdan Paralel'e
Önce (Infragistics — sıralı, paralelleştirmeye uygun değil):
// Must process one at a time — shared _result field is not thread-safe
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
service.Dispose();
// Must process one at a time — shared _result field is not thread-safe
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
service.Dispose();
Imports System.Collections.Generic
' Must process one at a time — shared _result field is not thread-safe
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()
For Each file In imageFiles
Dim value As String = Await service.ReadBarcodeAsync(file)
results.Add(value)
Next
service.Dispose()
Sonra (IronBarcode — paralel, iş parçacığı güvenli):
using IronBarCode;
// Option 1: pass an array directly —IronBarcode handles parallelization internally
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles.ToArray(), options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}
using IronBarCode;
// Option 1: pass an array directly —IronBarcode handles parallelization internally
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles.ToArray(), options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}
Imports IronBarCode
' Option 1: pass an array directly —IronBarcode handles parallelization internally
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read(imageFiles.ToArray(), options)
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next
using IronBarCode;
using System.Collections.Concurrent;
// Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
var allValues = new ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var results = BarcodeReader.Read(file);
foreach (var r in results)
allValues.Add(r.Value);
});
using IronBarCode;
using System.Collections.Concurrent;
// Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
var allValues = new ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var results = BarcodeReader.Read(file);
foreach (var r in results)
allValues.Add(r.Value);
});
Imports IronBarCode
Imports System.Collections.Concurrent
' Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
Dim allValues As New ConcurrentBag(Of String)()
Parallel.ForEach(imageFiles, Sub(file)
Dim results = BarcodeReader.Read(file)
For Each r In results
allValues.Add(r.Value)
Next
End Sub)
Dispose Desenini Kaldırma
KodunuzdaInfragisticsBarcodeReader etrafında IDisposable uygulamalarınız varsa, bunlar tamamen kaldırılabilir. IronBarcode'un BarcodeReader statik bir sınıftır. Oluşturulacak bir örnek yok, ayrılacak bir olay işleyici yok ve çağrılacak bir Dispose() yok.
// Before: service registered as IDisposable in DI container
services.AddScoped<InfragisticsBarcodeService>(); // implements IDisposable
// After: no registration needed — use static method directly, or wrap in thin service if preferred
// services.AddScoped<IBarcodeService, IronBarcodeService>();
// Before: service registered as IDisposable in DI container
services.AddScoped<InfragisticsBarcodeService>(); // implements IDisposable
// After: no registration needed — use static method directly, or wrap in thin service if preferred
// services.AddScoped<IBarcodeService, IronBarcodeService>();
' Before: service registered as IDisposable in DI container
services.AddScoped(Of InfragisticsBarcodeService)() ' implements IDisposable
' After: no registration needed — use static method directly, or wrap in thin service if preferred
' services.AddScoped(Of IBarcodeService, IronBarcodeService)()
DI amaçlı ince bir kaplama hizmeti basittir.
using IronBarCode;
public class BarcodeService
{
public IEnumerable<string> Read(string path)
=> BarcodeReader.Read(path).Select(r => r.Value);
public byte[] Generate(string data, BarcodeEncoding encoding)
=> BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData();
}
using IronBarCode;
public class BarcodeService
{
public IEnumerable<string> Read(string path)
=> BarcodeReader.Read(path).Select(r => r.Value);
public byte[] Generate(string data, BarcodeEncoding encoding)
=> BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData();
}
Imports IronBarCode
Public Class BarcodeService
Public Function Read(path As String) As IEnumerable(Of String)
Return BarcodeReader.Read(path).Select(Function(r) r.Value)
End Function
Public Function Generate(data As String, encoding As BarcodeEncoding) As Byte()
Return BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData()
End Function
End Class
Konstruktor enjeksiyonu yok, Dispose() yok, olay yönetimi yok.
Yaygın Geçiş Sorunları
SymbologyType Bayrakları Kaldırıldı
Infragistics WPF okuyucusundaki SymbologyTypes özelliği, desteklemek istediğiniz her barkod formatını listelemenizi gerektiriyordu. IronBarcode'un bir karşılığı yok — her okumada tüm 50+ formatı otomatik olarak algılar.
Bu önemli bir yan etkiye sahiptir: Eğer belirli bir barkod formatı listede SymbologyType bayrağı eksik olduğu için sessizce başarısız oluyorsa,IronBarcodeşimdi onu bulacaktır. Üretimde sessizce yutulmuş barkod değerleri görebilirsiniz. Bu doğru davranış — bu barkodlar zaten oradaydı.
Hangi formatların döndüğünü sınırlamanız gerekiyorsa (performans veya belirsizlik nedenleriyle), BarcodeReaderOptions bunu destekler:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false
};
var results = BarcodeReader.Read(imagePath, options);
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false
};
var results = BarcodeReader.Read(imagePath, options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read(imagePath, options)
BitmapImage Yüklemeye Gerek Yok
Infragistics WPF okuyucusu, görüntülerin new BitmapImage(new Uri(path, UriKind.Absolute)) aracılığıyla BitmapSource nesneleri olarak yüklenmesini gerektiriyordu. IronBarcode, dosya yolu dizelerini, bayt dizilerini ve akışları doğrudan kabul eder.
// All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png");
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"));
BarcodeReader.Read(File.OpenRead("path/to/image.png"));
// All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png");
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"));
BarcodeReader.Read(File.OpenRead("path/to/image.png"));
' All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png")
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"))
BarcodeReader.Read(File.OpenRead("path/to/image.png"))
Barkodla ilgili görüntü yüklemeleri için yalnızca var olan using System.Windows.Media.Imaging; bildirimlerini kaldırabilirsiniz.
TaskCompletionSource Deseni Kaldırıldı
Olay güdümlü DecodeComplete geri çağırmayı asenkron koda köprüleyen TaskCompletionSource<string> alanı tamamen kaldırıldı. BarcodeReader.Read() eşzamanlıdır ve sonuçlarını doğrudan döndürür.
Çağıran kodunuz await service.ReadBarcodeAsync(path) idiyse, şu şekilde basitleştirebilirsiniz:
// Before
var value = await service.ReadBarcodeAsync(imagePath);
// After
var value = BarcodeReader.Read(imagePath).FirstOrDefault()?.Value ?? "No barcode found";
// Before
var value = await service.ReadBarcodeAsync(imagePath);
// After
var value = BarcodeReader.Read(imagePath).FirstOrDefault()?.Value ?? "No barcode found";
Şayet çağıranlar için senkronize olmayan bir arayüzü korumak isterseniz, bir iş parçacığını tıkamadan:
public Task<string> ReadBarcodeAsync(string imagePath)
{
return Task.Run(() =>
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
});
}
public Task<string> ReadBarcodeAsync(string imagePath)
{
return Task.Run(() =>
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
});
}
Option Strict On
Public Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
Return Task.Run(Function()
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
End Function)
End Function
Özellik Adı Değişiklikleri
| Infragistics | IronBarcode |
|---|---|
e.Value (içinde ReaderDecodeArgs) |
result.Value |
e.Symbology (içinde ReaderDecodeArgs) |
result.Format |
barcode.Data |
BarcodeWriter.CreateBarcode() ilk parametre |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.Code128 (parametre) |
barcode.SaveTo(path) |
.SaveAsPng(path) / .SaveAsJpeg(path) / .SaveAsSvg(path) |
Geçiş Kontrol Listesi
Kod tabanınızdaki tümInfragisticsbarkod kullanımlarını bulmak için bu grep kalıplarını kullanın:
# Namespace references
grep -r "Infragistics.WinForms.Barcode\|Infragistics.Win.UltraWinBarcode" --include="*.cs" .
grep -r "Infragistics.Controls.Barcodes" --include="*.cs" .
grep -r "Infragistics.WPF.BarcodeReader" --include="*.csproj" .
# WinForms generation types
grep -r "UltraWinBarcode" --include="*.cs" .
grep -r "Symbology\.Code" --include="*.cs" .
grep -r "barcode\.SaveTo(" --include="*.cs" .
# WPF reading types and patterns
grep -r "new BarcodeReader()" --include="*.cs" .
grep -r "DecodeComplete" --include="*.cs" .
grep -r "ReaderDecodeArgs" --include="*.cs" .
grep -r "SymbologyType\." --include="*.cs" .
grep -r "e\.Value\|ReaderDecodeArgs" --include="*.cs" .
grep -r "BitmapImage" --include="*.cs" .
# TaskCompletionSource usage (likely barcode-related if near above patterns)
grep -r "TaskCompletionSource" --include="*.cs" .
# Namespace references
grep -r "Infragistics.WinForms.Barcode\|Infragistics.Win.UltraWinBarcode" --include="*.cs" .
grep -r "Infragistics.Controls.Barcodes" --include="*.cs" .
grep -r "Infragistics.WPF.BarcodeReader" --include="*.csproj" .
# WinForms generation types
grep -r "UltraWinBarcode" --include="*.cs" .
grep -r "Symbology\.Code" --include="*.cs" .
grep -r "barcode\.SaveTo(" --include="*.cs" .
# WPF reading types and patterns
grep -r "new BarcodeReader()" --include="*.cs" .
grep -r "DecodeComplete" --include="*.cs" .
grep -r "ReaderDecodeArgs" --include="*.cs" .
grep -r "SymbologyType\." --include="*.cs" .
grep -r "e\.Value\|ReaderDecodeArgs" --include="*.cs" .
grep -r "BitmapImage" --include="*.cs" .
# TaskCompletionSource usage (likely barcode-related if near above patterns)
grep -r "TaskCompletionSource" --include="*.cs" .
Her bir eşleşme üzerinde çalışın:
UltraWinBarcodekullanımları:BarcodeWriter.CreateBarcode()ile değiştirinnew BarcodeReader()+DecodeCompleteblokları:BarcodeReader.Read()ile değiştirinSymbologyTypebayrak listeleri: tamamen silin- Barkod girdisi için kullanılan
BitmapImageyüklemeleri: doğrudan yol/akış/bayt ile değiştirin ReaderDecodeArgs egeri çağırma gövdeleri:e.Valueçıkart →result.Value,e.Symbologyçıkart →result.Format- Barkod servis sınıflarındaki
IDisposable: tek kullanımlık kaynak yalnızca_readerise kaldırın
Özellik Karşılaştırması
| Özellik | Infragistics Barkod | IronBarcode |
|---|---|---|
| WinForms barkod üretimi | Evet (UltraWinBarcode) | Evet |
| WinForms barkod okuma | Mevcut değil | Evet |
| WPF barkod üretimi | Evet (XamBarcode) | Evet |
| WPF barkod okuma | Evet (olay yönelimli) | Evet (senkron) |
| ASP.NET Core | 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 — SymbologyType bayrakları gerekti | Evet |
| PDF barkod okuma | Mevcut değil | Evet (yerel) |
| Eşzamanlı iş parçacığı güvenli okumalar | Hayır | Evet |
| Toplu okuma (yerleşik) | Hayır | Evet |
| QR hata düzeltme kontrolü | Mevcut değil | Evet |
| Statik API (örnek yok) | Hayır | Evet |
| Suite aboneliği gerekti | Evet (Infragistics Ultimate, 2.399+ USD/yıl) | Hayır |
| Süresiz lisans | Hayır | Evet — 749 $ 'dan başlayan |
Geçiş Setelahı Temel Faydalar
WinForms'ta barkod okuma. Eğer geçiş WinForms okuma gereksinimi tarafından yönlendirildiyse, bu birincil sonuçtur: BarcodeReader.Read(imagePath) WinForms'ta derlenir ve çalışır, ek bir kurulum gerekmez.
ASP.NET Core ve konsol desteği. Web API'leri, arka plan hizmetleri ve konsol araçları artık aynı paketle hem barkod üretebilir hem de okuyabilir. Eğer bu proje türleri için ayrı araç zincirleri veya dolaşma yolları bakımı yapıyorsanız, şimdi yoktur.
Olay işleyici şablonu yok. DecodeComplete işleyici, TaskCompletionSource köprüsü, BitmapImage yükleme ve Dispose() temizleme hepsi kaldırıldı. Barkod mantığı kalır.
Semboloji spesifikasyonu yok. Eksik SymbologyType bayrakları nedeniyle sessizce başarısız olan formatlar şimdi doğru algılanacak. Otomatik algılama, yapılandırma olmadan tüm 50+ formatı kapsar.
Tüm proje türlerinde aynı servis sınıfı. WinForms, WPF,ASP.NET Coreve çözümdeki herhangi bir projede kullanılmak üzere tek bir BarcodeService sarmalayıcı, BarcodeReader.Read() ve BarcodeWriter.CreateBarcode() kullanır. Çerçeveye özel uygulamalar yok.
Sadece barkod işlevselliği içinInfragisticsUltimate aboneliğine gerek yok. Eğer proje bilginizde birInfragisticsUltimate aboneliğine sahip olan varsa, veya karar içinde önemli bir faktör ise,IronBarcode bağımsız bir pakettir ve süresiz lisanslama seçenekleri 749 $'dan bir geliştirici için başlamakta.
Geçiş işlemi,Infragisticsbarkod kullanımını tespit ettikten sonra mekanik hale gelir. En karmaşık bölüm, WPF servis sınıfının değiştirilmesidir ve bu bile sınıfı kaldırıp çağrıları BarcodeReader.Read() ile değiştirmeye indirgenir. Üretim geçişi, bir-birine özellik/metod adlandırma. Geri aldığınız tek şey, ihtiyacınız olan her proje türündeki tek ve tutarlı bir API'dir.
Sıkça Sorulan Sorular
Neden Infragistics Barcode'dan IronBarcode'a geçiş yapmalıyım?
Yaygın nedenler arasında lisanslamanın basitleştirilmesi (SDK + runtime anahtar karmaşıklığının kaldırılması), veri geçiş limitlerinin ortadan kaldırılması, yerel PDF desteği kazanılması, Docker/CI/CD dağıtımının iyileştirilmesi ve üretim kodunda API tekrarlama azalması yer alır.
Infragistics API çağrılarını IronBarcode ile nasıl değiştiririm?
Örnek oluşturma ve lisanslama tekrarlamalarını IronBarCode.License.LicenseKey = "anahtar" ile değiştirin. Okuyucu çağrılarını BarcodeReader.Read(yol) ile ve yazıcı çağrılarını BarcodeWriter.CreateBarcode(veri, kodlama) ile değiştirin. Statik yöntemler örnek yönetimi gerektirmez.
Infragistics Barcode'dan IronBarcode'a geçiş sırasında ne kadar kod değişiyor?
Çoğu geçiş daha az kod satırıyla sonuçlanır. Lisanslama tekrarlamaları, örnek oluşturucular ve açık format yapılandırması kaldırılır. Temel okuma/yazma işlemleri, daha temiz sonuç nesneleriyle daha kısa IronBarcode eşdeğerlerine dönüştürülür.
Geçiş sırasında hem Infragistics Barcode hem de IronBarcode'un yüklü kalması gerekiyor mu?
Hayır. Çoğu geçiş doğrudan değişim yapılır, paralel bir işletim yerine geçer. Bir hizmet sınıfını bir seferde geçirin, NuGet referansını değiştirin ve sonraki sınıfa geçmeden önce başlatma ve API çağrı desenlerini güncelleyin.
IronBarcode için NuGet paketi adı nedir?
Paket 'IronBarCode' (büyük B ve C harfleriyle). 'Install-Package IronBarCode' veya 'dotnet add package IronBarCode' ile kurun. Kodda kullanılan yönerge 'using IronBarCode;' şeklindedir.
IronBarcode, Docker dağıtımını Infragistics Barcode'a kıyasla nasıl kolaylaştırır?
IronBarcode, harici SDK dosyaları veya montajlı lisans yapılandırması olmayan bir NuGet paketidir. Docker'da, IRONBARCODE_LICENSE_KEY ortam değişkenini ayarlayın ve paket lisans doğrulamasını başlangıçta kendi kendine yapar.
IronBarcode, Infragistics'ten göç ettikten sonra tüm barkod formatlarını otomatik olarak algılıyor mu?
Evet. IronBarcode, desteklenen tüm formatlardaki sembolojiyi otomatik olarak algılar. Açık BarcodeTypes sayımı gerekli değildir. Format zaten biliniyorsa ve performans önemliyse, BarcodeReaderOptions arama alanını optimize etmek için sınırlamayı sağlar.
IronBarcode, ayrı bir kütüphane olmadan PDF'lerden barkod okuyabiliyor mu?
Evet. BarcodeReader.Read("document.pdf") PDF dosyalarını yerel olarak işlemler. Sonuçlar her barkod için SayfaNumarası, Format, Değer ve Güven içerir. Harici bir PDF render adımı gerekmez.
IronBarcode, paralel barkod işlemeyi nasıl yönetiyor?
IronBarcode'un statik yöntemleri durumsuz ve thread-safe'dir. Dağıtılmış dosya listeleri üzerinde per-thread örnek yönetimi olmadan doğrudan Parallel.ForEach kullanın. BarcodeReaderOptions.MaxParallelThreads, iç thread bütçesini kontrol eder.
Infragistics Barcode'dan IronBarcode'a geçiş yaparken hangi sonuç özellikleri değişiyor?
Yaygın yeniden adlandırmalar: BarcodeValue, Value olur; BarcodeType, Format olur. IronBarcode sonuçları ayrıca Güven ve SayfaNumarası ekler. Çözüm çapında arama-değiştirme, mevcut sonuç işleme kodundaki yeniden adlandırmaları ele alır.
Bir CI/CD hattında IronBarcode lisanslamasını nasıl ayarlayabilirim?
IRONBARCODE_LICENSE_KEY'i bir boru hattı sırrı olarak saklayın ve uygulama başlangıç kodunda IronBarCode.License.LicenseKey olarak atayın. Bir sır, geliştirme, test, aşama ve üretim dahil olmak üzere tüm ortamları kapsar.
IronBarcode, özel biçimlendirmeye sahip QR kodu üretimini destekliyor mu?
Evet. QRCodeWriter.CreateQrCode() özelleştirilmiş renkler için ChangeBarCodeColor(), logo yerleştirme için AddBrandLogo(), yapılandırılabilir hata düzeltme seviyeleri ve PNG, JPG, PDF ve akış dahil birden çok çıktı formatını destekler.

