.NET MAUI를 사용하여 C#에서 바코드를 읽고 스캔하는 방법
인프라지스틱스 바코드에서 IronBarcode로 마이그레이션
대부분의 인프라지스틱스 바코드 마이그레이션은 팀에서 바코드 생성만 가능한 프로젝트(WinForms, ASP.NET Core또는 WPF 이외의 프로젝트)에서 바코드 읽기가 필요했거나, 이벤트 기반 WPF 리더 API가 프로덕션 환경에서 사용하기에는 너무 불안정한 것으로 판명되었기 때문에 발생합니다. 동시 호출을 안전하지 않게 만드는 공유 _result 필드, 누락된 SymbologyType 플래그로 인해 발생하는 무음 실패들은 모두 팀들이 대안을 찾는 일반적인 이유입니다.
이 가이드는 인프라지스틱스 바코드 패키지 제거, WinForms 및 WPF 환경 모두에서 바코드 생성 및 읽기 코드 교체, Infragistics에서 바코드 기능을 전혀 지원하지 않았던 프로젝트 유형에 바코드 기능 추가 등 전체 마이그레이션 과정을 안내합니다.
빠른 시작
1단계: 인프라지스틱스 바코드 패키지 제거
프로젝트에서 인프라지스틱스 바코드 NuGet 패키지를 제거하세요. 사용하신 타겟에 따라 다릅니다.
# 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
프로젝트 파일에 두 가지 모두 참조되어 있는 경우, 둘 다 제거하십시오. 다른 인프라지스틱스 구성 요소를 사용 중인 경우 바코드 관련 패키지를 제거해도 인프라지스틱스 Ultimate 라이선스에는 영향을 미치지 않습니다.
2단계:IronBarcode설치
dotnet add package IronBarcode
dotnet add package IronBarcode
IronBarcode 는 WinForms, WPF, ASP.NET Core, 콘솔, Blazor Server, Docker,Azure Functions및 AWS Lambda에서 작동하는 단일 패키지입니다. 프레임워크별로 별도의 패키지를 설치할 필요는 없습니다.
3단계: 네임스페이스 업데이트
Infragistics 바코드 네임스페이스를 IronBarCode (대문자 B, 대문자 C)로 교체하십시오.
// 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단계: 라이선스 초기화
애플리케이션 시작 시 한 번 라이선스 초기화를 추가하십시오 — Program.cs, App.xaml.cs, 또는 DI 구성 루트.
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
코드 마이그레이션 예제
WinForms 생성: UltraWinBarcode에서 BarcodeWriter로
WinForms 생성 패턴은 IronBarcode의 BarcodeWriter에 깨끗하게 매핑됩니다.
이전 (인프라지스틱스 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)
(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 열거형 값은 BarcodeEncoding 열거형으로 이동합니다. 이는 속성 할당이 아닌 CreateBarcode()의 매개변수입니다. 데이터가 첫 번째 인수가 됩니다. SaveTo()는 출력 형식에 따라 .SaveAsPng(), .SaveAsJpeg(), .SaveAsSvg(), 또는 .SaveAsPdf()이 됩니다.
저장하기 전에 바코드 크기를 조정해야 하는 경우:
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 이벤트 기반 읽기: 서비스 클래스를 두 줄로 줄이기
이는 이주 인구 감소에 있어 가장 중요한 변화입니다. 인프라지스틱스 WPF 읽기 패턴은 전체 서비스 클래스를 필요로 합니다.
이전 버전 (Infragistics WPF - 약 35줄):
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
(IronBarcode - 2줄 이후):
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")
인스턴스 관리, 이벤트 연결, BitmapImage 로딩, Dispose() — 전체 서비스 클래스가 사라졌습니다. BarcodeReader.Read()는 동기적이고, 정적이며 파일 경로 문자열을 직접 받아들입니다.
심볼 유형도 함께 반환하는 경우:
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를 대체합니다. result.Format는 e.Symbology를 대체합니다.
WinForms 읽기 기능 추가 (이전에는 불가능했음)
만약 이전에 WinForms 프로젝트에서 생성 기능만 사용했다면, 이제 동일한 패키지를 사용하여 읽기 기능도 사용할 수 있습니다.
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
추가 패키지 필요 없음, 프레임워크 특정 설정 필요 없음. 동일한 BarcodeReader.Read() 호출이 WinForms에서도 WPF에서도 작동합니다.
ASP.NET Core엔드포인트 (이전에는 불가능했음)
Infragistics 패키지를 사용해도 ASP.NET Core컨트롤러에서 바코드 생성 및 읽기가 불가능했습니다.IronBarcode와 함께:
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()는 Stream를 직접 받아들이고, 업로드를 먼저 디스크에 저장할 필요가 없습니다.
PDF 바코드 읽기
IronBarcode 별도의 패키지 없이 PDF 문서에서 바코드를 직접 읽어들입니다.
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
인프라지스틱스에는 그에 상응하는 기능이 없었습니다. PDF 바코드를 읽으려면 스캔하기 전에 PDF 페이지를 외부에서 이미지로 변환해야 했습니다.
일괄 처리: 순차 처리에서 병렬 처리로
이전 방식(인프라지스틱스 - 순차적 처리, 병렬 처리를 위한 동시성 안전성 확보 불가):
// 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()
(IronBarcode - 병렬, 스레드 안전) 이후:
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)
폐기 패턴 제거
코드에 인프라지스틱스 BarcodeReader을(를) 둘러싼 IDisposable 구현이 있었다면, 이를 완전히 제거할 수 있습니다. IronBarcode의 BarcodeReader은 정적 클래스입니다. 생성할 인스턴스가 없고, 분리할 이벤트 핸들러가 없으며 호출할 Dispose()가 없습니다.
// 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(직접 입력) 목적으로 사용할 수 있는 간단한 래퍼 서비스는 다음과 같습니다.
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
생성자 주입 없음, Dispose() 없음, 이벤트 관리 없음.
일반적인 마이그레이션 문제
심볼 유형 플래그 제거됨
Infragistics WPF 읽기의 SymbologyTypes 속성은 지원하고자 하는 모든 바코드 형식을 열거하도록 요구했습니다.IronBarcode비교할 만한 제품이 없습니다. 50개 이상의 지원되는 모든 형식을 읽을 때마다 자동으로 감지합니다.
이것에는 중요한 부작용이 있습니다: 특정 바코드 형식이 목록에서 SymbologyType 플래그가 누락되어 이전에 조용히 실패했다면, 이제 IronBarcode가 이를 찾을 것입니다. 이전에는 아무런 오류 없이 처리되었던 바코드 값이 생산 과정에서 나타날 수 있습니다. 이것이 올바른 동작입니다. 해당 바코드는 항상 그 자리에 있었습니다.
반환될 형식을 제한해야 한다면(성능이나 모호성 이유로), BarcodeReaderOptions이(가) 이를 지원합니다:
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)
비트맵 이미지 로딩이 필요하지 않습니다.
Infragistics WPF 읽기는 new BitmapImage(new Uri(path, UriKind.Absolute))(을)를 통해 BitmapSource 객체로 이미지를 로드해야 했습니다.IronBarcode파일 경로 문자열, 바이트 배열 및 스트림을 직접 허용합니다.
// 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"))
바코드 관련 이미지 로드를 위해 존재했던 모든 using System.Windows.Media.Imaging; 가져오기를 제거할 수 있습니다.
TaskCompletionSource 패턴이 제거되었습니다.
이벤트 기반 DecodeComplete 콜백을 비동기 코드로 연결한 TaskCompletionSource<string> 필드는 완전히 사라졌습니다. BarcodeReader.Read()은 동기적이며 결과를 직접 반환합니다.
호출 코드가 await service.ReadBarcodeAsync(path)였다면, 다음과 같이 간소화할 수 있습니다:
// 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";
스레드를 차단하지 않고 하위 호출자를 위해 비동기 인터페이스를 유지하려면 다음과 같이 하세요.
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
부동산 명칭 변경
| 인프라지스틱스 | IronBarcode |
|---|---|
e.Value (in ReaderDecodeArgs) |
result.Value |
e.Symbology (in ReaderDecodeArgs) |
result.Format |
barcode.Data |
BarcodeWriter.CreateBarcode()의 첫 번째 인수 |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.Code128 (parameter) |
barcode.SaveTo(path) |
.SaveAsPng(path) / .SaveAsJpeg(path) / .SaveAsSvg(path) |
마이그레이션 체크리스트
다음 grep 패턴을 사용하여 코드베이스에서 인프라지스틱스 바코드 사용 부분을 모두 찾으세요.
# 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" .
각 경기를 하나씩 살펴보세요:
UltraWinBarcode사용 사례:BarcodeWriter.CreateBarcode()로 교체new BarcodeReader()+DecodeComplete블록:BarcodeReader.Read()로 교체SymbologyType플래그 목록: 완전히 삭제- 바코드 입력에 사용된
BitmapImage로드: 직접 경로/스트림/바이트로 교체 ReaderDecodeArgs e콜백 본문:e.Value→result.Value,e.Symbology→result.Format추출- 바코드 서비스 클래스의
IDisposable: 제거할 수 있는 유일한 폐기 가능 자원이_reader인 경우
기능 비교
| 기능 | 인프라지스틱스 바코드 | IronBarcode |
|---|---|---|
| WinForms 바코드 생성 | 예 (울트라윈바코드) | 예 |
| WinForms 바코드 읽기 | 사용 불가 | 예 |
| WPF 바코드 생성 | 예 (XamBarcode) | 예 |
| WPF 바코드 읽기 | 예 (이벤트 기반) | 예 (동기식) |
| ASP.NET Core | 사용 불가 | 예 |
| 콘솔/작업자 서비스 | 사용 불가 | 예 |
| Docker/리눅스 | 사용 불가 | 예 |
| Azure Functions | 사용 불가 | 예 |
| Blazor 서버 | 사용 불가 | 예 |
| 자동 형식 감지 | 아니요 — SymbologyType 플래그가 필요합니다 | 예 |
| PDF 바코드 읽기 | 사용 불가 | 예 (원어민) |
| 스레드 안전한 동시 읽기 | 아니요 | 예 |
| 일괄 읽기(내장) | 아니요 | 예 |
| QR 오류 정정 제어 | 사용 불가 | 예 |
| 정적 API (인스턴스 없음) | 아니요 | 예 |
| Suite 구독이 필요합니다. | 예 (Infragistics Ultimate, $2,399+/년) | 아니요 |
| 영구 라이선스 | 아니요 | 네, 가격은 749달러부터 시작합니다. |
마이그레이션 후 주요 이점
WinForms에서 바코드 읽기. WinForms 읽기 요구사항에 따라 마이그레이션이 진행되었다면, 주요 결과는 다음과 같습니다: BarcodeReader.Read(imagePath)은 추가적인 설정 없이 WinForms에서 컴파일되고 실행됩니다.
ASP.NET Core 및 콘솔 지원. 이제 웹 API, 백그라운드 서비스 및 콘솔 도구 모두 동일한 패키지를 사용하여 바코드를 생성하고 읽을 수 있습니다. 이러한 프로젝트 유형별로 별도의 툴 체인이나 해결 방법을 유지 관리해 왔다면 이제 더 이상 사용할 수 없습니다.
이벤트 핸들러 보일러플레이트 없음. DecodeComplete 핸들러, TaskCompletionSource 브리지, BitmapImage 로드 및 Dispose() 정리가 모두 제거되었습니다. 바코드 논리만 남았습니다.
심볼로지 명세 없음. SymbologyType 플래그 누락으로 인해 조용히 실패했던 형식이 이제 올바르게 감지됩니다. 자동 감지 기능은 별도의 설정 없이 50개 이상의 모든 형식을 지원합니다.
모든 프로젝트 유형 간 동일한 서비스 클래스. BarcodeReader.Read() 및 BarcodeWriter.CreateBarcode()을(를) 사용하는 단일 BarcodeService 래퍼는 WinForms, WPF, ASP.NET Core및 솔루션 내 다른 모든 프로젝트 간에 공유될 수 있습니다. 프레임워크별 구현은 없습니다.
바코드 기능만을 위해 인프라지스틱스 Ultimate 구독이 필요한 것은 아닙니다. 만약 바코드 지원이 프로젝트의 유일한 이유였거나, 구독 결정에 중요한 요소였다면,IronBarcode개발자 1인 기준 749달러부터 시작하는 영구 라이선스 옵션을 제공하는 독립형 패키지입니다.
인프라지스틱스 바코드 사용 내역을 모두 파악한 후에는 마이그레이션 자체가 자동으로 진행됩니다. 가장 관련된 부분은 WPF 서비스 클래스 대체이며, 심지어 클래스 제거 및 BarcodeReader.Read()로 호출 대체로 줄어듭니다. 세대 간 마이그레이션은 속성/메서드 이름 변경을 일대일로 수행하는 것입니다. 결과적으로 모든 프로젝트 유형에서 작동하는 단일하고 일관된 API를 얻게 됩니다.
자주 묻는 질문
인프라스트럭처 바코드에서 IronBarcode로 마이그레이션해야 하는 이유는 무엇인가요?
일반적인 이유로는 라이선스 간소화(SDK + 런타임 키 복잡성 제거), 처리량 제한 제거, 네이티브 PDF 지원 확보, Docker/CI/CD 배포 개선, 프로덕션 코드의 API 상용구 감소 등이 있습니다.
Infragistics API 호출을 IronBarcode로 대체하려면 어떻게 해야 하나요?
인스턴스 생성 및 라이선스 상용구를 IronBarCode.License.LicenseKey = "key"로 대체합니다. 판독기 호출을 BarcodeReader.Read(경로)로, 쓰기 호출을 BarcodeWriter.CreateBarcode(데이터, 인코딩)로 바꿉니다. 정적 메서드는 인스턴스 관리가 필요하지 않습니다.
인프라스트럭처 바코드에서 IronBarcode로 마이그레이션할 때 얼마나 많은 코드가 변경되나요?
대부분의 마이그레이션은 더 적은 코드 줄로 이루어집니다. 라이선스 상용구, 인스턴스 생성자, 명시적 형식 구성이 제거됩니다. 핵심 읽기/쓰기 작업이 더 간결한 결과 객체를 가진 더 짧은 IronBarcode에 매핑됩니다.
마이그레이션 중에 인프라스트럭처 바코드와 IronBarcode를 모두 설치해야 하나요?
아니요. 대부분의 마이그레이션은 병렬 작업이 아닌 직접 교체 작업입니다. 한 번에 하나의 서비스 클래스를 마이그레이션하고, NuGet 참조를 교체하고, 인스턴스화 및 API 호출 패턴을 업데이트한 후 다음 클래스로 이동합니다.
IronBarcode의 NuGet 패키지 이름은 무엇인가요?
패키지는 'IronBarCode'(대문자 B와 C 포함)입니다. '설치-패키지 IronBarCode' 또는 '닷넷 추가 패키지 IronBarCode'로 설치합니다. 코드의 사용 지시어는 'using IronBarCode;'입니다.
인프라스트럭처 바코드와 비교했을 때 IronBarcode는 어떻게 Docker 배포를 간소화하나요?
IronBarcode는 외부 SDK 파일이나 마운트된 라이선스 구성이 없는 NuGet 패키지입니다. Docker에서 IRONBARCODE_LICENSE_KEY 환경 변수를 설정하면 패키지가 시작 시 라이선스 유효성 검사를 처리합니다.
인프라리스틱스에서 마이그레이션한 후 IronBarcode가 모든 바코드 형식을 자동으로 감지하나요?
예. IronBarcode는 지원되는 모든 형식에서 기호를 자동으로 감지합니다. 명시적인 바코드 유형 열거가 필요하지 않습니다. 형식이 이미 알려져 있고 성능이 중요한 경우 BarcodeReaderOptions를 사용하여 검색 공간을 최적화하여 제한할 수 있습니다.
IronBarcode는 별도의 라이브러리 없이 PDF에서 바코드를 판독할 수 있나요?
예. BarcodeReader.Read("document.pdf")는 기본적으로 PDF 파일을 처리합니다. 결과에는 발견된 각 바코드에 대한 페이지 번호, 형식, 값 및 신뢰도가 포함됩니다. 외부 PDF 렌더링 단계가 필요하지 않습니다.
IronBarcode는 병렬 바코드 처리를 어떻게 처리하나요?
IronBarcode의 정적 메서드는 상태 저장소가 없고 스레드에 안전합니다. 스레드별 인스턴스 관리 없이 파일 목록에 직접 Parallel.ForEach를 사용할 수 있습니다. BarcodeReaderOptions.MaxParallelThreads는 내부 스레드 예산을 제어합니다.
인프라스트럭처 바코드에서 IronBarcode로 마이그레이션하면 어떤 결과 속성이 변경되나요?
일반적인 이름 변경: 바코드 값은 값으로, 바코드 유형은 형식으로 바뀝니다. IronBarcode 결과에는 신뢰도 및 페이지 번호도 추가됩니다. 솔루션 전반의 검색 및 바꾸기 기능은 기존 결과 처리 코드에서 이름 변경을 처리합니다.
CI/CD 파이프라인에서 IronBarcode 라이선싱을 설정하려면 어떻게 해야 하나요?
IRONBARCODE_LICENSE_KEY를 파이프라인 시크릿으로 저장하고 애플리케이션 시작 코드에 IronBarCode.License.LicenseKey를 할당하세요. 하나의 비밀은 개발, 테스트, 스테이징 및 프로덕션을 포함한 모든 환경에 적용됩니다.
IronBarcode는 사용자 지정 스타일로 QR 코드 생성을 지원하나요?
예. QRCodeWriter.CreateQrCode()는 변경바코드색()을 통한 사용자 지정 색상, 추가브랜드 로고()를 통한 로고 임베딩, 구성 가능한 오류 수정 수준, PNG, JPG, PDF, 스트림을 포함한 여러 출력 형식을 지원합니다.

