인프라스트럭처 바코드와 IronBarcode: C# 바코드 라이브러리 비교
Infragistics 바코드 판독은 WPF에서 작동합니다. 이를 위해서는 BarcodeReader 인스턴스, DecodeComplete 이벤트 핸들러, 콜백을 비동기 코드로 연결하는 TaskCompletionSource<string>, URI에서 BitmapImage 로드, 지원하려는 모든 SymbologyType의 명시적 비트별 OR이 필요합니다. 플래그 하나(예: SymbologyType.EAN8)를 놓치면 이미지의 모든 EAN-8 바코드가 자동으로 반환되지 않습니다. 예외는 없습니다. 사전 경고 없음. 아무런 결과도 나오지 않습니다.
이것이 바로WPF측면입니다.WinForms쪽의 Infragistics.Win.UltraWinBarcode 패키지에는 생성 컨트롤이 포함되어 있지만 리더 클래스는 전혀 없습니다.WinForms프로젝트에서 바코드를 읽어야 하는 경우 Infragistics 바코드 패키지에는 호출할 수 있는 기능이 없습니다. ASP.NET Core컨트롤러, 콘솔 도구, Azure Function, Blazor 서버 구성 요소 또는 Docker 컨테이너에도 동일하게 적용됩니다. Infragistics 바코드 지원은 UI 프레임워크 경계 내에서 이루어집니다. WPF는 바코드 생성 및 이벤트 기반 읽기 기능을 제공합니다. WinForms는 생성만 지원합니다. 나머지는 아무것도 얻지 못합니다.
이 비교에서는 그러한 분리가 실제로 무엇을 의미하는지 살펴보고,IronBarcode모든 프로젝트 유형에서 동일하게 동작하는 단일 정적 API를 사용하여 동일한 작업을 어떻게 처리하는지 살펴봅니다.
인프라지스틱스 바코드 지원 이해하기
인프라지스틱스는 가장 오랜 역사를 자랑하는 .NET UI 컴포넌트 공급업체 중 하나입니다. 바코드 기능을 포함하는 인프라지스틱스 Suite WinForms, WPF, ASP.NET, Blazor 및 모바일용 수백 가지 컨트롤을 제공합니다. 이미 인프라지스틱스 그리드, 차트 또는 스케줄러를 사용하고 있는 팀에게 바코드 컨트롤은 당연한 추가 기능입니다. 이미 구독료를 지불하고 있기 때문입니다.
하지만 바코드 지원은 통합 라이브러리가 아닙니다. 이는 서로 다른 기능을 가진 두 개의 별개의 어셈블리이며, 기능이 부분적으로만 겹칩니다.
WinForms: UltraWinBarcode
Infragistics.Win.UltraWinBarcode 패키지는 UltraWinBarcode 클래스를 통해WinForms애플리케이션에서 바코드 생성을 제공합니다. API는 간단합니다.
// 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)
기호를 설정하고 데이터를 할당하고 SaveTo()를 호출합니다. WinForms에서 생성만 하는 시나리오의 경우 이 방법이 효과적입니다. Symbology 열거형은 일반적인 형식을 다룹니다: Code128, Code39, QR, EAN13 등입니다.
이 모임에 없는 것은 독자입니다. 코드-51384--@@ 클래스는 없습니다. Scan() 방식이 없습니다.WinForms애플리케이션에서 Infragistics.Win.UltraWinBarcode 패키지만 사용하여 바코드 이미지를 읽으려고 하면 호출할 것이 없습니다.
WPF: XamBarcode 및 BarcodeReader
WPF 측에는 생성 제어(XamBarcode)와 별도의 리더 클래스(BarcodeReader의 Infragistics.Controls.Barcodes, Infragistics.WPF.BarcodeReader 어셈블리에서)가 모두 포함됩니다. 이 리더는WPF스레딩 및 이미지 처리 모델을 기반으로 설계된 이벤트 기반 방식입니다.
WPF에서 바코드를 읽으려면 DecodeComplete 이벤트를 연결하고, 이미지를 파일 경로가 아닌 BitmapSource 객체로 로드하고, 코드가 비동기인 경우 콜백 패턴을 대기 중인 것으로 변환해야 합니다.
ASP.NET Core, 콘솔, Docker: 해당 사항 없음
WPF 또는WinFormsUI 어셈블리 없이 net8.0를 대상으로 하는 Infragistics 바코드 패키지는 없습니다. ASP.NET Core프로젝트, 콘솔 도구, Azure Functions, Blazor 서버 및 Linux Docker 컨테이너에는 Infragistics 바코드 옵션이 없습니다. 이 라이브러리는 UI 프레임워크와 연동됩니다.
WPF읽기 패턴
다음은 Infragistics를 사용하여 WPF에서 바코드를 읽는 실제 모습입니다.
// 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));
// Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Trigger decode — result comes via callback
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbologyValue ?? "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));
// Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Trigger decode — result comes via callback
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.SymbologyValue ?? "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))
' Must specify EVERY format — no auto-detection
_reader.SymbologyTypes = SymbologyType.Code128 Or
SymbologyType.Code39 Or
SymbologyType.QR Or
SymbologyType.EAN8 Or
SymbologyType.EAN13 Or
SymbologyType.UPCA Or
SymbologyType.DataMatrix Or
SymbologyType.Interleaved2of5
' Trigger decode — result comes via callback
_reader.Decode(bitmap)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(e.SymbologyValue, "No barcode found"))
End Sub
Public Sub Dispose()
If _reader IsNot Nothing Then
RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
_reader = Nothing
End If
End Sub
바코드 하나를 읽는 데 대략 35줄의 인프라가 필요합니다. 실제로 일어나고 있는 일을 세어보세요:
BarcodeReader인스턴스가 생성되어 필드로 유지됩니다.- 생성자에 이벤트 핸들러가 연결되어 있습니다.
- 코드-51395--@@를 호출할 때마다 공유 필드에 할당된 @@--코드-51396--@@가 새로 생성되므로 이 서비스는 작성된 대로 스레드에 안전하지 않습니다. 동시 호출은
_result을 덮어씁니다. - 이미지는 파일 경로 문자열이나 바이트 배열, 스트림이 아닌 @@--코드-51399--@@에서 @@--코드-51398--@@로 로드해야 합니다.
Decode()는 이벤트를 비동기적으로 실행합니다.TaskCompletionSource은 콜백 세계와 비동기/대기 세계 사이의 접착제 역할을 합니다.- 콜백은
e.SymbologyValue를 추출합니다. - 메모리 누수를 방지하기 위해
Dispose()메서드는 이벤트 핸들러를 분리해야 합니다.
이 논리는 바코드와는 전혀 관련이 없습니다. 이는 이벤트 기반 설계를 구현하는 데 필요한 인프라입니다. 프로덕션 코드에서는 _result.Task가 완료되지 않는 경우(타임아웃, 취소 토큰 또는 이벤트가 실행되지 않는 것에 대한 가드)도 처리해야 합니다.
WinForms격차
WinForms와의 격차는 처음 생각했던 것보다 훨씬 더 큽니다.WinForms애플리케이션을 개발하는 팀은 Infragistics 바코드 페이지에 접속했을 때 두 UI 프레임워크 모두에서 바코드 생성 및 읽기가 동일하게 이루어질 것이라고 기대하는 경우가 많습니다. 그들이 발견한 것은 Infragistics.Win.UltraWinBarcode가 읽기 기능을 전혀 제공하지 않는다는 것입니다.
이는 문서상의 오류가 아닙니다.WinForms바코드 어셈블리는 생성 컨트롤로 설계되었습니다.WinForms애플리케이션에서 바코드를 스캔해야 하는 경우(예: 사용자가 업로드한 이미지 파일에서 바코드를 읽거나 카메라 피드에서 바코드를 디코딩하는 경우) Infragistics 바코드 도구로는 이 작업을 수행할 수 없습니다. 그렇게 하려면 완전히 별도의 라이브러리를 가져와야 하는데, 그렇게 되면 인프라지스틱스를 생성 도구로 사용하는 이유가 약해집니다.
이러한 비대칭성은 여러 프레임워크를 혼합하여 프로젝트를 진행하는 팀에게 매우 난처한 상황을 초래합니다.WPF데스크톱 클라이언트와WinForms데스크톱 클라이언트를 모두 사용하는 팀은 다른 모든 곳에서는 Infragistics를 사용하고 있음에도 불구하고WinForms프로젝트에서는 바코드 읽기에 Infragistics를 사용할 수 없습니다.
기호 설명: 무음 고장 모드
WPF 리더의 SymbologyTypes 플래그 속성은 오류 모드가 미묘하고 프로덕션 환경에서 위험하므로 별도의 섹션이 필요합니다.
리더기를 설정할 때 지원하려는 모든 바코드 형식을 명시적으로 OR 연산자로 조합해야 합니다.
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
// Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 |
SymbologyType.Code39 |
SymbologyType.QR |
SymbologyType.EAN8 |
SymbologyType.EAN13 |
SymbologyType.UPCA |
SymbologyType.DataMatrix |
SymbologyType.Interleaved2of5;
' Must enumerate every format — miss one, that format silently returns empty
_reader.SymbologyTypes = SymbologyType.Code128 Or
SymbologyType.Code39 Or
SymbologyType.QR Or
SymbologyType.EAN8 Or
SymbologyType.EAN13 Or
SymbologyType.UPCA Or
SymbologyType.DataMatrix Or
SymbologyType.Interleaved2of5
바코드 이미지에 EAN-8 바코드가 포함되어 있고 SymbologyType.EAN8가 플래그에 없는 경우 e.SymbologyValue는 null 또는 비어 있는 상태로 반환됩니다. 디코딩 이벤트는 여전히 발생합니다. 예외가 발생하지 않습니다. 발신자는 "바코드를 찾을 수 없습니다"라는 메시지를 수신하지만, 이미지가 판독 불가능한 것인지 아니면 단순히 구성되지 않은 것인지에 대한 정보는 얻을 수 없습니다.
실제로 이는 다음과 같은 의미입니다.
- 초기 설정은 개발자가 테스트한 형식에서는 정상적으로 작동합니다.
- 새로운 바코드 형식이 시스템에 추가됩니다(공급업체가 라벨 유형을 변경하거나, 새로운 제품 라인이 다른 심볼을 사용하는 경우).
- 리더는 해당 형식의 모든 이미지에 대해 아무런 오류 메시지 없이 읽기를 중단합니다.
- 오류 메시지는 "형식이 구성되지 않았습니다"가 아니라 "이미지에 바코드가 없습니다"와 동일하게 보입니다.
이 문제를 디버깅하는 팀은 이미지 품질을 검사하는 데 시간을 허비한 후에야 해당 형식이 플래그 목록에 애초에 없었다는 사실을 깨닫습니다.
IronBarcode에는 SymbologyTypes 속성이 없습니다. 이 프로그램은 읽을 때마다 50개 이상의 지원되는 형식을 자동으로 감지합니다. 잊을 깃발은 없다.
플랫폼 매트릭스
플랫폼 간 기능 격차는 아키텍처 제약을 이해하는 가장 명확한 방법입니다.
| 플랫폼 | 인프라지스틱스 세대 | 인프라지스틱스 리딩 | IronBarcode생성 | IronBarcode판독 |
|---|---|---|---|---|
| WPF | XamBarcode 컨트롤 | 바코드 판독기(이벤트 기반) | 예 | 예 |
| WinForms | 울트라윈바코드 | 이용 불가 | 예 | 예 |
| ASP.NET Core | 이용 불가 | 이용 불가 | 예 | 예 |
| 콘솔 | 이용 불가 | 이용 불가 | 예 | 예 |
| Blazor 서버 | 이용 불가 | 이용 불가 | 예 | 예 |
| 도커/리눅스 | 이용 불가 | 이용 불가 | 예 | 예 |
| Azure Functions | 이용 불가 | 이용 불가 | 예 | 예 |
이 표는 순수WPF데스크톱 애플리케이션 외의 다른 애플리케이션을 실행하는 팀들이 인프라지스틱스의 바코드 지원이 불충분하다고 느끼는 이유를 보여줍니다. 프로젝트가 WinForms와 ASP.NET Core또는 WPF와 백그라운드 워커 서비스를 아우르는 순간, Infragistics 바코드 라이브러리는 코드베이스의 일부만 커버하게 됩니다.
IronBarcode이해하기
IronBarcode 는 WinForms,WPF또는 기타 UI 프레임워크에 의존하지 않는 .NET 전용 바코드 라이브러리입니다. 동일한 NuGet 패키지, 동일한 네임스페이스 및 동일한 API는 WinForms, WPF, ASP.NET Core, 콘솔, Blazor Server, Docker, Azure Functions, AWS Lambda 등 모든 .NET 프로젝트에서 작동합니다.
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package IronBarcode
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 IronBarcode
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")
BarcodeReader.Read()는 정적 메서드입니다. 관리할 인스턴스, 연결할 이벤트, 콜백 패턴을 연결하기 위한 TaskCompletionSource가 없어야 합니다. 일괄 처리를 위해 파일 경로 문자열, 바이트 배열, Stream 또는 이러한 배열을 사용할 수 있습니다.
생성 시 BarcodeWriter.CreateBarcode()는 PNG, JPEG, SVG로 저장하거나 바이너리 데이터로 가져올 수 있는 바코드 개체를 반환합니다:
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")
라이선스 초기화는 애플리케이션 시작 시 한 번만 수행됩니다.
IronBarCode.License.LicenseKey = "YOUR-KEY";
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-KEY"
나란히 배치 처리
일괄 처리는 인프라지스틱스WPF리더의 또 다른 구조적 한계를 드러냅니다. 리더는 공유 이벤트 핸들러를 사용하고 _result 필드는 모든 호출에서 덮어쓰기 때문에 위에 표시된 서비스 클래스는 여러 이미지를 동시에 안전하게 처리할 수 없습니다. 호출 순서를 정해야 합니다.
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// are not thread-safe; concurrent calls would corrupt _result
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
// are not thread-safe; concurrent calls would corrupt _result
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
' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' are not thread-safe; concurrent calls would corrupt _result
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
이를 동시에 수행하려면 이전 디코딩이 진행 중인 동안 _result를 덮어쓰지 않도록 하기 위한 잠금, 대기열 또는 세마포어와 같은 상당한 추가 인프라가 필요합니다. 이는 단순한 입출력 작업이어야 함에도 불구하고 상당한 동시성 문제를 야기합니다.
IronBarcode의 정적 BarcodeReader.Read()는 스레드에 안전합니다. 별도의 동기화 과정 없이 여러 스레드에서 동시에 호출할 수 있습니다. 배치 워크로드의 경우 Parallel.ForEach를 직접 사용할 수 있습니다:
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)
한 번의 호출로 여러 파일을 전달하고 BarcodeReaderOptions를 통해 병렬 처리를 구성할 수도 있습니다:
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
기능 비교
| 기능 | 인프라지스틱스 바코드 | IronBarcode |
|---|---|---|
| WinForms바코드 읽기 | 사용 불가 | 예 |
| WPF바코드 읽기 | 예 (이벤트 기반) | 예 (동기식) |
| ASP.NET Core지원 | 사용 불가 | 예 |
| 콘솔/작업자 서비스 | 사용 불가 | 예 |
| 도커/리눅스 | 사용 불가 | 예 |
| Azure Functions | 사용 불가 | 예 |
| Blazor 서버 | 사용 불가 | 예 |
| 자동 형식 감지 | 아니요, 모든 SymbologyType 플래그를 지정해야 합니다. | 예, 50개 이상의 모든 형식이 자동으로 감지되었습니다. |
| PDF 바코드 읽기 | 사용 불가 | 네, 기본 제공 패키지이며 추가 패키지가 필요 없습니다. |
| 스레드 안전 읽기 | 아니요 (공유 이벤트 핸들러) | 예 (정적 API) |
| 이벤트 기반 API가 필요합니다. | 예 (WPF) | 아니요 |
| 명시적 이미지 로드(BitmapSource) | 예 | 아니요 — 파일 경로, 바이트, 스트림을 허용합니다. |
| 동시 읽기 | 아니요 (TaskCompletionSource를 통해 연결해야 합니다) | 예 |
| 일괄 처리 | 순차 처리만 가능 (동시 실행 안전하지 않음) | 내장 병렬 처리 |
| 형식 오류 발생 시 알림 없음 | 예 (SymbologyType 플래그가 누락되었습니다) | 아니요 |
| Suite 종속성 필요 | 예 — 인프라지스틱스 얼티밋 구독 | 아니요, 독립형 패키지입니다. |
| 영구 라이선스 옵션 | 아니요 — 연간 구독 | 예 |
| 대략적인 라이선스 비용 | 연간 1,675달러 이상 (인프라지스틱스 얼티밋) | $749부터 시작하는 영구 라이선스(Lite) |
API 매핑 참조
WinForms(UltraWinBarcode)에서IronBarcode로
| 인프라지스틱스 윈폼즈 — 울트라윈바코드 | IronBarcode |
|---|---|
| @@--코드-51419--@@ | @@--코드-51420--@@ |
| @@--코드-51421--@@ | BarcodeEncoding.Code128(CreateBarcode에 대한 매개변수) |
| @@--코드-51424--@@ | CreateBarcode()의 첫 번째 인수 |
| @@--코드-51426--@@ | @@--코드-51427--@@ |
| 읽기 API가 존재하지 않습니다. | @@--코드-51428--@@ |
WPF(BarcodeReader)에서IronBarcode로
| 인프라지스틱스WPF- 바코드 리더 | IronBarcode |
|---|---|
| @@--코드-51429--@@ | 정적 클래스 - 인스턴스가 필요하지 않습니다. |
| @@--코드-51430--@@ | 필요 없음 |
_reader.SymbologyTypes = SymbologyType.X \| 심볼 유형.Y \| ... |
자동 감지 - 설정 불필요 |
| @@--코드-51431--@@ + @@--코드-51432--@@ | @@--코드-51433--@@ |
e.SymbologyValue (콜백 중) |
@@--코드-51435--@@ |
e.Symbology (콜백 중) |
@@--코드-51437--@@ |
TaskCompletionSource<string> 비동기 래퍼 |
동기식 - 래퍼 필요 없음 |
Dispose() - 이벤트 핸들러 분리하기 |
필요 없음 - 발생 사례 또는 이벤트 없음 |
| WPF프로젝트 전용 | 모든 .NET 프로젝트 유형 |
팀 전환 시
몇 가지 특정한 상황들이 지속적으로 팀들이 인프라지스틱스 바코드 지원을 포기하게 만드는 원인이 됩니다.
WinForms에서 읽기 작업이 필요합니다. 이것이 가장 일반적인 시나리오입니다.WinForms애플리케이션은 UltraWinBarcode로 바코드를 잘 생성하지만 업로드된 이미지에서 바코드를 스캔하거나 인쇄하기 전에 라벨을 검증해야 한다는 새로운 요구 사항이 생깁니다. Infragistics는 WinForms용 읽기 API를 제공하지 않습니다. 해당 팀은 두 번째 라이브러리를 가져오거나, 두 가지 기능을 모두 수행하는 코드로 생성 코드를 대체합니다.
새로운 ASP.NET Core엔드포인트가 추가되었습니다. Infragistics 바코드 생성 기능을 갖춘 데스크톱 애플리케이션에 웹 API가 함께 제공됩니다. 해당 엔드포인트는 이미지 업로드를 허용하고 바코드 값을 반환하거나, 요청에 따라 바코드 이미지를 생성해야 합니다. ASP.NET Core프로젝트에서 Infragistics 바코드 패키지를 사용하는 경우 두 가지 모두 불가능합니다. IronBarcode는 dotnet add package IronBarcode로 설치되며 콘솔 메서드에서 작동하는 것과 동일한 방식으로 컨트롤러 액션에서 작동합니다.
Docker 배포.WPF애플리케이션을 컨테이너화하거나 바코드 로직을 마이크로서비스로 분리하는 중입니다.WPF어셈블리는 Linux Docker 컨테이너에서 실행되지 않습니다. 인프라스트럭처WPF@@-CODE-51442--@@는 이들과 함께합니다.IronBarcodeLinux x64를 기본적으로 지원합니다.
일괄 처리 성능. 워크플로는 수백 또는 수천 개의 바코드 이미지를 처리합니다. 이벤트 기반 인프라지스틱스 리더는 이러한 파일들을 순차적으로 처리합니다. IronBarcode의 정적 리더기는 스레드에 안전하며 동시성 인프라 없이 Parallel.ForEach 또는 내장된 MaxParallelThreads 옵션을 지원합니다.
프로덕션에서 자동 형식 실패 한 팀이 SymbologyTypes 플래그에 해당 형식이 포함되지 않아 특정 형식의 바코드가 몇 주 동안 자동으로 실패하고 있음을 발견했습니다. 자동 감지 기능으로 전환하면 오류 발생 원인이 완전히 제거됩니다.
인프라지스틱스 구독 범위 축소. 일부 팀은 바코드 제어 기능이 포함되어 있다는 이유로 인프라지스틱스 얼티밋 구독료를 지불하고 있습니다. 바코드 요구 사항이 구독의 유일한 이유라면, 훨씬 저렴한 비용으로 이용할 수 있는 전용 바코드 라이브러리를 검토해 볼 가치가 있습니다.
결론
인프라지스틱스의 바코드 지원과 관련된 핵심 문제는 기능적인 문제라기보다는 아키텍처적인 문제입니다.WPFBarcodeReader는 바코드를 읽을 수 있습니다.WinFormsUltraWinBarcode에서 생성합니다. 각 구성 요소는 설계된 좁은 범위 내에서 제 기능을 합니다. 문제는 그 두 가지 맥락이 대부분의 .NET 팀이 실제로 필요로 하는 것을 포괄하지 못한다는 점입니다.
최신 .NET 애플리케이션에서 바코드 기능은 단일 UI 프레임워크에만 존재하는 경우가 드뭅니다. 이 기능은WinForms클라이언트와 웹 API에서 사용할 수 있습니다. 이 프로그램은 Docker 컨테이너와 데스크톱 환경에서 실행됩니다. ASP.NET 엔드포인트에 업로드된 이미지를 스캔하고 콘솔 도구를 통해 레이블을 출력해야 합니다. 이러한 방법들은 인프라지스틱스 바코드 패키지와 호환되지 않으며,WPF리더의 이벤트 기반 패턴과 필수 심볼 플래그는 작동하는 유일한 환경에서도 상당한 복잡성을 추가합니다.
IronBarcode 모든 .NET 프로젝트 유형에서 동일하게 컴파일되고 실행되는 정적 API를 사용하여 바코드 읽기 및 생성이라는 동일한 문제를 해결합니다.WPF서비스 클래스에서 작성하는 BarcodeReader.Read() 호출은 ASP.NET Core컨트롤러에서 작성하는 호출과 동일한 호출이며 Linux Docker 컨테이너에서 작성하는 호출과 동일한 호출입니다. 이벤트, 플래그, TaskCompletionSource가 없어야 합니다. 바코드 로직은 35줄이 아니라 2줄로 구성되어 있으며, 이 2줄은 어디에서나 작동합니다.
자주 묻는 질문
인프라스트럭처 바코드란 무엇인가요?
인프라스트럭처 바코드는 C# 애플리케이션에서 바코드를 생성하고 판독하기 위한 .NET 바코드 라이브러리입니다. 개발자가 .NET 프로젝트용 바코드 솔루션을 선택할 때 평가하는 여러 대안 중 하나입니다.
인프라스트럭처 바코드와 IronBarcode의 주요 차이점은 무엇인가요?
인프라스트럭처 바코드는 일반적으로 사용하기 전에 인스턴스 생성 및 구성이 필요한 반면, IronBarcode는 인스턴스 관리가 필요 없는 정적 상태 비저장 API를 사용합니다. 또한 IronBarcode는 모든 환경에서 기본 PDF 지원, 자동 형식 감지, 단일 키 라이선싱을 제공합니다.
IronBarcode가 인프라스트럭처 바코드보다 라이선스 취득이 더 쉬운가요?
IronBarcode는 개발 및 프로덕션 배포를 모두 포괄하는 단일 라이선스 키를 사용합니다. 따라서 SDK 키와 런타임 키를 분리하는 라이선싱 시스템에 비해 CI/CD 파이프라인 및 Docker 구성이 간소화됩니다.
IronBarcode는 인프라스트럭처 바코드가 지원하는 모든 바코드 형식을 지원하나요?
IronBarcode는 QR코드, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 등 30개 이상의 바코드 심볼로지를 지원합니다. 형식 자동 감지 기능은 명시적인 형식 열거가 필요하지 않음을 의미합니다.
IronBarcode는 네이티브 PDF 바코드 판독을 지원하나요?
예. IronBarcode는 별도의 PDF 렌더링 라이브러리가 필요 없이 BarcodeReader.Read("document.pdf")를 사용하여 PDF 파일에서 직접 바코드를 판독합니다. 페이지별 결과에는 페이지 번호, 바코드 형식, 값 및 신뢰도 점수가 포함됩니다.
인프라스트럭처 바코드와 비교하여 IronBarcode는 일괄 처리를 어떻게 처리하나요?
IronBarcode의 정적 메서드는 상태 저장소가 없고 자연스럽게 스레드에 안전하므로 스레드별 인스턴스 관리 없이 Parallel.ForEach를 직접 사용할 수 있습니다. 어떤 가격대에서도 처리량 상한선이 없습니다.
IronBarcode 어떤 .NET 버전을 지원하나요?
IronBarcode는 단일 NuGet 패키지로 .NET Framework 4.6.2+, .NET Core 3.1 및 .NET 5, 6, 7, 8, 9를 지원합니다. 플랫폼 대상에는 Windows x64/x86, Linux x64, macOS x64/ARM이 포함됩니다.
.NET 프로젝트에 IronBarcode를 설치하려면 어떻게 해야 하나요?
NuGet을 통해 IronBarcode 설치: 패키지 관리자 콘솔에서 'Install-Package IronBarCode'를 실행하거나 CLI에서 '닷넷 추가 패키지 IronBarCode'를 실행합니다. 추가 SDK 인스톨러나 런타임 파일은 필요하지 않습니다.
Infragistics와 달리 구매 전에 IronBarcode를 평가할 수 있나요?
예. IronBarcode의 평가판 모드는 완전한 디코딩된 바코드 값을 반환하며 생성된 출력 이미지에만 워터마크가 표시됩니다. 구매를 결정하기 전에 자신의 문서에서 판독 정확도를 벤치마킹할 수 있습니다.
인프라스트럭처 바코드와 IronBarcode의 가격 차이는 무엇인가요?
개발 및 프로덕션을 포함하는 단일 개발자 영구 라이선스의 IronBarcode 가격은 $749부터 시작합니다. 가격 세부 정보 및 볼륨 옵션은 IronBarcode 라이선스 페이지에서 확인할 수 있습니다. 별도의 런타임 라이선스 요구 사항은 없습니다.
인프라스트럭처 바코드에서 IronBarcode로 마이그레이션하는 것은 간단합니까?
인프라스트럭처 바코드에서 IronBarcode로의 마이그레이션에는 주로 인스턴스 기반 API 호출을 IronBarcode의 정적 메서드로 대체하고, 라이선스 상용구를 제거하며, 결과 속성 이름을 업데이트하는 작업이 포함됩니다. 대부분의 마이그레이션에는 코드를 추가하기보다는 줄이는 작업이 포함됩니다.
IronBarcode는 로고가 있는 QR 코드를 생성하나요?
예. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")는 구성 가능한 오류 수정을 통해 기본적으로 브랜드 이미지를 QR코드에 임베드합니다. ChangeBarCodeColor()를 통해 컬러 QR 코드도 지원됩니다.

